@@ -19,6 +19,8 @@ enum DefaultAudioDevice {
1919@objc ( StreamInCallManager)
2020class StreamInCallManager : RCTEventEmitter {
2121
22+ private let audioSessionQueue = DispatchQueue ( label: " io.getstream.rn.audioSessionQueue " )
23+
2224 private var audioManagerActivated = false
2325 private var callAudioRole : CallAudioRole = . communicator
2426 private var defaultAudioDevice : DefaultAudioDevice = . speaker
@@ -44,55 +46,60 @@ class StreamInCallManager: RCTEventEmitter {
4446
4547 @objc ( setAudioRole: )
4648 func setAudioRole( audioRole: String ) {
47- if audioManagerActivated {
48- log ( " AudioManager is already activated, audio role cannot be changed. " )
49- return
49+ audioSessionQueue. async { [ self ] in
50+ if audioManagerActivated {
51+ log ( " AudioManager is already activated, audio role cannot be changed. " )
52+ return
53+ }
54+ self . callAudioRole = audioRole. lowercased ( ) == " listener " ? . listener : . communicator
5055 }
51- self . callAudioRole = audioRole. lowercased ( ) == " listener " ? . listener : . communicator
52-
5356 }
5457
5558 @objc ( setDefaultAudioDeviceEndpointType: )
5659 func setDefaultAudioDeviceEndpointType( endpointType: String ) {
57- if audioManagerActivated {
58- log ( " AudioManager is already activated, default audio device cannot be changed. " )
59- return
60+ audioSessionQueue. async { [ self ] in
61+ if audioManagerActivated {
62+ log ( " AudioManager is already activated, default audio device cannot be changed. " )
63+ return
64+ }
65+ self . defaultAudioDevice = endpointType. lowercased ( ) == " earpiece " ? . earpiece : . speaker
6066 }
61- self . defaultAudioDevice = endpointType. lowercased ( ) == " earpiece " ? . earpiece : . speaker
62-
6367 }
6468
6569 @objc
6670 func start( ) {
67- if audioManagerActivated {
68- return
71+ audioSessionQueue. async { [ self ] in
72+ if audioManagerActivated {
73+ return
74+ }
75+ let session = AVAudioSession . sharedInstance ( )
76+ previousAudioSessionState = AudioSessionState (
77+ category: session. category,
78+ mode: session. mode,
79+ options: session. categoryOptions
80+ )
81+ configureAudioSession ( )
82+ audioManagerActivated = true
6983 }
70- let session = AVAudioSession . sharedInstance ( )
71- previousAudioSessionState = AudioSessionState (
72- category: session. category,
73- mode: session. mode,
74- options: session. categoryOptions
75- )
76- configureAudioSession ( )
77- audioManagerActivated = true
7884 }
7985
8086 @objc
8187 func stop( ) {
82- if !audioManagerActivated {
83- return
84- }
85- if let prev = previousAudioSessionState {
86- let session = AVAudioSession . sharedInstance ( )
87- do {
88- try session. setCategory ( prev. category, mode: prev. mode, options: prev. options)
89- } catch {
90- log ( " Error restoring previous audio session: \( error. localizedDescription) " )
88+ audioSessionQueue. async { [ self ] in
89+ if !audioManagerActivated {
90+ return
91+ }
92+ if let prev = previousAudioSessionState {
93+ let session = AVAudioSession . sharedInstance ( )
94+ do {
95+ try session. setCategory ( prev. category, mode: prev. mode, options: prev. options)
96+ } catch {
97+ log ( " Error restoring previous audio session: \( error. localizedDescription) " )
98+ }
99+ previousAudioSessionState = nil
91100 }
92- previousAudioSessionState = nil
101+ audioManagerActivated = false
93102 }
94- audioManagerActivated = false
95-
96103 }
97104
98105 private func configureAudioSession( ) {
@@ -135,9 +142,6 @@ class StreamInCallManager: RCTEventEmitter {
135142
136143 if currentCategory != intendedCategory. rawValue || currentMode != intendedMode. rawValue || currentOptions != intendedOptions || !currentIsActive {
137144 session. lockForConfiguration ( )
138- defer {
139- session. unlockForConfiguration ( )
140- }
141145 do {
142146 try session. setCategory ( intendedCategory, mode: intendedMode, options: intendedOptions)
143147 try session. setActive ( true )
@@ -152,6 +156,7 @@ class StreamInCallManager: RCTEventEmitter {
152156 log ( " configureAudioSession: Error setting mode: \( error. localizedDescription) " )
153157 }
154158 }
159+ session. unlockForConfiguration ( )
155160 } else {
156161 log ( " configureAudioSession: no change needed " )
157162 }
@@ -290,11 +295,6 @@ class StreamInCallManager: RCTEventEmitter {
290295 }
291296 }
292297
293- @objc
294- func methodQueue( ) -> DispatchQueue {
295- return DispatchQueue ( label: " io.getstream.rn.audioSessionQueue " )
296- }
297-
298298 // MARK: - Logging Helper
299299 private func log( _ message: String ) {
300300 NSLog ( " InCallManager: %@ " , message)
0 commit comments