-
Notifications
You must be signed in to change notification settings - Fork 29
/
PublishCustomMicTest.swift
118 lines (95 loc) · 4.78 KB
/
PublishCustomMicTest.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//
// File.swift
// R5ProTestbed
//
// Created by David Heimann on 9/21/18.
// Copyright © 2015 Infrared5, Inc. All rights reserved.
//
// The accompanying code comprising examples for use solely in conjunction with Red5 Pro (the "Example Code")
// is licensed to you by Infrared5 Inc. in consideration of your agreement to the following
// license terms and conditions. Access, use, modification, or redistribution of the accompanying
// code constitutes your acceptance of the following license terms and conditions.
//
// Permission is hereby granted, free of charge, to you to use the Example Code and associated documentation
// files (collectively, the "Software") without restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The Software shall be used solely in conjunction with Red5 Pro. Red5 Pro is licensed under a separate end
// user license agreement (the "EULA"), which must be executed with Infrared5, Inc.
// An example of the EULA can be found on our website at: https://account.red5pro.com/assets/LICENSE.txt.
//
// The above copyright notice and this license shall be included in all copies or portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL INFRARED5, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
import UIKit
import R5Streaming
@objc(PublishCustomMicTest)
class PublishCustomMicTest : BaseTest {
var mic: GainWobbleMic? = nil
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated);
setupDefaultR5VideoViewController()
// Set up the configuration
let config = getConfig()
// Set up the connection and stream
let connection = R5Connection(config: config)
self.publishStream = R5Stream(connection: connection)
self.publishStream!.delegate = self
// Attach the custom source to the stream
if(Testbed.getParameter(param: "video_on") as! Bool){
// Attach the video from camera to stream
let videoDevice = AVCaptureDevice.devices(for: AVMediaType.video).last as? AVCaptureDevice
let camera = R5Camera(device: videoDevice, andBitRate: Int32(Testbed.getParameter(param: "bitrate") as! Int))
camera?.width = Int32(Testbed.getParameter(param: "camera_width") as! Int)
camera?.height = Int32(Testbed.getParameter(param: "camera_height") as! Int)
camera?.fps = Int32(Testbed.getParameter(param: "fps") as! Int)
camera?.orientation = 90
self.publishStream!.attachVideo(camera)
}
mic = GainWobbleMic()
self.publishStream!.attachAudio(mic);
// show preview and debug info
// self.publishStream?.getVideoSource().fps = 2;
self.currentView!.attach(publishStream!)
self.publishStream!.publish(Testbed.getParameter(param: "stream1") as! String, type: getPublishRecordType ())
}
}
@objc(GainWobbleMic)
class GainWobbleMic : R5Microphone {
var gain : Float = 1.0
var mod : Int = 1
var lastTime : Double = 0.0
override init() {
let audioDevice = AVCaptureDevice.default(for: AVMediaType.audio)
super.init(device: audioDevice)
bitrate = 32
processData = { samples, streamTimeMill in
self.modifyGain(time: streamTimeMill - self.lastTime)
self.lastTime = streamTimeMill
var s: Int
var val: UInt8
let data = samples?.mutableBytes
let length: Int = (samples?.length)!
for i in 0...length {
val = (data?.advanced(by: i).load(as: UInt8.self))!
s = Int(Float(val) * self.gain)
val = UInt8(min(s, Int(UInt8.max)))
data?.advanced(by: i).storeBytes(of: val, as: UInt8.self)
}
}
}
func modifyGain(time: Double) {
gain += Float(mod) * Float(time/2000)
if( gain >= 2 || gain <= 0 ){
NSLog("gain at: %f", gain)
gain = max(2.0 * Float(mod), 0.0)
mod *= -1
}
}
}