1- import livekit_react_native_webrtc
2- import AVFoundation
1+ /*
2+ * Copyright 2025 LiveKit
3+ *
4+ * Licensed under the Apache License, Version 2.0 (the "License");
5+ * you may not use this file except in compliance with the License.
6+ * You may obtain a copy of the License at
7+ *
8+ * http://www.apache.org/licenses/LICENSE-2.0
9+ *
10+ * Unless required by applicable law or agreed to in writing, software
11+ * distributed under the License is distributed on an "AS IS" BASIS,
12+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+ * See the License for the specific language governing permissions and
14+ * limitations under the License.
15+ */
16+
317import AVFAudio
18+ import AVFoundation
19+ import livekit_react_native_webrtc
420import React
521
6- struct LKEvents {
7- static let kEventVolumeProcessed = " LK_VOLUME_PROCESSED " ;
8- static let kEventMultibandProcessed = " LK_MULTIBAND_PROCESSED " ;
9- static let kEventAudioData = " LK_AUDIO_DATA " ;
22+ enum LKEvents {
23+ static let kEventVolumeProcessed = " LK_VOLUME_PROCESSED "
24+ static let kEventMultibandProcessed = " LK_MULTIBAND_PROCESSED "
25+ static let kEventAudioData = " LK_AUDIO_DATA "
1026}
1127
1228@objc ( LivekitReactNativeModule)
1329public class LivekitReactNativeModule : RCTEventEmitter {
14-
1530 // This cannot be initialized in init as self.bridge is given afterwards.
16- private var _audioRendererManager : AudioRendererManager ? = nil
31+ private var _audioRendererManager : AudioRendererManager ?
1732 public var audioRendererManager : AudioRendererManager {
18- get {
19- if _audioRendererManager == nil {
20- _audioRendererManager = AudioRendererManager ( bridge: self . bridge)
21- }
22-
23- return _audioRendererManager!
33+ if _audioRendererManager == nil {
34+ _audioRendererManager = AudioRendererManager ( bridge: bridge)
2435 }
36+
37+ return _audioRendererManager!
2538 }
2639
2740 @objc
28- public override init ( ) {
41+ override public init ( ) {
2942 super. init ( )
3043 let config = RTCAudioSessionConfiguration ( )
3144 config. category = AVAudioSession . Category. playAndRecord. rawValue
@@ -37,7 +50,7 @@ public class LivekitReactNativeModule: RCTEventEmitter {
3750
3851 @objc
3952 override public static func requiresMainQueueSetup( ) -> Bool {
40- return false
53+ false
4154 }
4255
4356 @objc
@@ -61,8 +74,8 @@ public class LivekitReactNativeModule: RCTEventEmitter {
6174 let rtcConfig = RTCAudioSessionConfiguration ( )
6275 rtcConfig. category = AVAudioSession . Category. playAndRecord. rawValue
6376
64- if ( defaultOutput == " earpiece " ) {
65- rtcConfig. categoryOptions = [ . allowAirPlay, . allowBluetooth, . allowBluetoothA2DP] ;
77+ if defaultOutput == " earpiece " {
78+ rtcConfig. categoryOptions = [ . allowAirPlay, . allowBluetooth, . allowBluetoothA2DP]
6679 rtcConfig. mode = AVAudioSession . Mode. voiceChat. rawValue
6780 } else {
6881 rtcConfig. categoryOptions = [ . allowAirPlay, . allowBluetooth, . allowBluetoothA2DP, . defaultToSpeaker]
@@ -119,17 +132,17 @@ public class LivekitReactNativeModule: RCTEventEmitter {
119132 }
120133
121134 @objc ( getAudioOutputsWithResolver: withRejecter: )
122- public func getAudioOutputs( resolve: RCTPromiseResolveBlock , reject: RCTPromiseRejectBlock ) {
135+ public func getAudioOutputs( resolve: RCTPromiseResolveBlock , reject _ : RCTPromiseRejectBlock ) {
123136 resolve ( [ " default " , " force_speaker " ] )
124137 }
125138
126139 @objc ( selectAudioOutput: withResolver: withRejecter: )
127140 public func selectAudioOutput( _ deviceId: String , resolve: RCTPromiseResolveBlock , reject: RCTPromiseRejectBlock ) {
128141 let session = AVAudioSession . sharedInstance ( )
129142 do {
130- if ( deviceId == " default " ) {
143+ if deviceId == " default " {
131144 try session. overrideOutputAudioPort ( . none)
132- } else if ( deviceId == " force_speaker " ) {
145+ } else if deviceId == " force_speaker " {
133146 try session. overrideOutputAudioPort ( . speaker)
134147 }
135148 } catch {
@@ -154,15 +167,15 @@ public class LivekitReactNativeModule: RCTEventEmitter {
154167 session. unlockForConfiguration ( )
155168 }
156169
157- if let appleAudioCategory = appleAudioCategory {
170+ if let appleAudioCategory {
158171 config. category = AudioUtils . audioSessionCategoryFromString ( appleAudioCategory) . rawValue
159172 }
160173
161- if let appleAudioCategoryOptions = appleAudioCategoryOptions {
174+ if let appleAudioCategoryOptions {
162175 config. categoryOptions = AudioUtils . audioSessionCategoryOptionsFromStrings ( appleAudioCategoryOptions)
163176 }
164177
165- if let appleAudioMode = appleAudioMode {
178+ if let appleAudioMode {
166179 config. mode = AudioUtils . audioSessionModeFromString ( appleAudioMode) . rawValue
167180 }
168181
@@ -173,41 +186,40 @@ public class LivekitReactNativeModule: RCTEventEmitter {
173186 reject ( " setAppleAudioConfiguration " , " Error setting category: \( error. localizedDescription) " , error)
174187 return
175188 }
176-
177189 }
178190
179191 @objc ( createAudioSinkListener: trackId: )
180192 public func createAudioSinkListener( _ pcId: NSNumber , trackId: String ) -> String {
181193 let renderer = AudioSinkRenderer ( eventEmitter: self )
182- let reactTag = self . audioRendererManager. registerRenderer ( renderer)
194+ let reactTag = audioRendererManager. registerRenderer ( renderer)
183195 renderer. reactTag = reactTag
184- self . audioRendererManager. attach ( renderer: renderer, pcId: pcId, trackId: trackId)
196+ audioRendererManager. attach ( renderer: renderer, pcId: pcId, trackId: trackId)
185197
186198 return reactTag
187199 }
188200
189201 @objc ( deleteAudioSinkListener: pcId: trackId: )
190202 public func deleteAudioSinkListener( _ reactTag: String , pcId: NSNumber , trackId: String ) -> Any ? {
191- self . audioRendererManager. detach ( rendererByTag: reactTag, pcId: pcId, trackId: trackId)
192- self . audioRendererManager. unregisterRenderer ( forReactTag: reactTag)
203+ audioRendererManager. detach ( rendererByTag: reactTag, pcId: pcId, trackId: trackId)
204+ audioRendererManager. unregisterRenderer ( forReactTag: reactTag)
193205
194206 return nil
195207 }
196208
197209 @objc ( createVolumeProcessor: trackId: )
198210 public func createVolumeProcessor( _ pcId: NSNumber , trackId: String ) -> String {
199211 let renderer = VolumeAudioRenderer ( intervalMs: 40.0 , eventEmitter: self )
200- let reactTag = self . audioRendererManager. registerRenderer ( renderer)
212+ let reactTag = audioRendererManager. registerRenderer ( renderer)
201213 renderer. reactTag = reactTag
202- self . audioRendererManager. attach ( renderer: renderer, pcId: pcId, trackId: trackId)
214+ audioRendererManager. attach ( renderer: renderer, pcId: pcId, trackId: trackId)
203215
204216 return reactTag
205217 }
206218
207219 @objc ( deleteVolumeProcessor: pcId: trackId: )
208220 public func deleteVolumeProcessor( _ reactTag: String , pcId: NSNumber , trackId: String ) -> Any ? {
209- self . audioRendererManager. detach ( rendererByTag: reactTag, pcId: pcId, trackId: trackId)
210- self . audioRendererManager. unregisterRenderer ( forReactTag: reactTag)
221+ audioRendererManager. detach ( rendererByTag: reactTag, pcId: pcId, trackId: trackId)
222+ audioRendererManager. unregisterRenderer ( forReactTag: reactTag)
211223
212224 return nil
213225 }
@@ -226,17 +238,17 @@ public class LivekitReactNativeModule: RCTEventEmitter {
226238 intervalMs: intervalMs,
227239 eventEmitter: self
228240 )
229- let reactTag = self . audioRendererManager. registerRenderer ( renderer)
241+ let reactTag = audioRendererManager. registerRenderer ( renderer)
230242 renderer. reactTag = reactTag
231- self . audioRendererManager. attach ( renderer: renderer, pcId: pcId, trackId: trackId)
243+ audioRendererManager. attach ( renderer: renderer, pcId: pcId, trackId: trackId)
232244
233245 return reactTag
234246 }
235247
236248 @objc ( deleteMultibandVolumeProcessor: pcId: trackId: )
237249 public func deleteMultibandVolumeProcessor( _ reactTag: String , pcId: NSNumber , trackId: String ) -> Any ? {
238- self . audioRendererManager. detach ( rendererByTag: reactTag, pcId: pcId, trackId: trackId)
239- self . audioRendererManager. unregisterRenderer ( forReactTag: reactTag)
250+ audioRendererManager. detach ( rendererByTag: reactTag, pcId: pcId, trackId: trackId)
251+ audioRendererManager. unregisterRenderer ( forReactTag: reactTag)
240252
241253 return nil
242254 }
@@ -250,7 +262,7 @@ public class LivekitReactNativeModule: RCTEventEmitter {
250262 }
251263
252264 override public func supportedEvents( ) -> [ String ] ! {
253- return [
265+ [
254266 LKEvents . kEventVolumeProcessed,
255267 LKEvents . kEventMultibandProcessed,
256268 LKEvents . kEventAudioData,
0 commit comments