@@ -135,11 +135,17 @@ class AudioEngineDevice : public AudioDeviceModule, public AudioSessionObserver
135135
136136 bool IsInterrupted ();
137137
138+ enum RenderMode { Device = 0 , Manual = 1 };
139+ enum MuteMode { VoiceProcessing = 0 , RestartEngine = 1 };
140+
138141 int32_t SetObserver (AudioDeviceObserver* observer) override;
139142
140143 int32_t SetManualRenderingMode (bool enable);
141144 int32_t ManualRenderingMode (bool * enabled);
142145
146+ int32_t SetMuteMode (MuteMode mode);
147+ int32_t GetMuteMode (MuteMode* mode);
148+
143149 int32_t SetAdvancedDucking (bool enable);
144150 int32_t AdvancedDucking (bool * enabled);
145151
@@ -157,8 +163,6 @@ class AudioEngineDevice : public AudioDeviceModule, public AudioSessionObserver
157163
158164 int32_t InitAndStartRecording ();
159165
160- enum RenderMode { Device, Manual };
161-
162166 private:
163167 // Represents the state of the audio engine, including input/output status,
164168 // rendering mode, and various configuration flags.
@@ -176,6 +180,8 @@ class AudioEngineDevice : public AudioDeviceModule, public AudioSessionObserver
176180 bool is_interrupted = false ;
177181
178182 RenderMode render_mode = RenderMode::Device;
183+ MuteMode mute_mode = MuteMode::VoiceProcessing;
184+
179185 bool voice_processing_enabled = true ;
180186 bool voice_processing_bypassed = false ;
181187 bool voice_processing_agc_enabled = true ;
@@ -194,7 +200,7 @@ class AudioEngineDevice : public AudioDeviceModule, public AudioSessionObserver
194200 input_follow_mode == rhs.input_follow_mode &&
195201 input_enabled_persistent_mode == rhs.input_enabled_persistent_mode &&
196202 input_muted == rhs.input_muted && is_interrupted == rhs.is_interrupted &&
197- render_mode == rhs.render_mode &&
203+ render_mode == rhs.render_mode && mute_mode == rhs. mute_mode &&
198204 voice_processing_enabled == rhs.voice_processing_enabled &&
199205 voice_processing_bypassed == rhs.voice_processing_bypassed &&
200206 voice_processing_agc_enabled == rhs.voice_processing_agc_enabled &&
@@ -209,18 +215,24 @@ class AudioEngineDevice : public AudioDeviceModule, public AudioSessionObserver
209215 bool IsOutputInputLinked () const { return input_follow_mode && voice_processing_enabled; }
210216
211217 bool IsOutputEnabled () const {
212- return IsOutputInputLinked () ? IsInputEnabled () || output_enabled : output_enabled;
218+ return IsOutputInputLinked () ? ( IsInputEnabled () || output_enabled) : output_enabled;
213219 }
214220
215221 bool IsOutputRunning () const {
216- return IsOutputInputLinked () ? input_running || output_running : output_running;
222+ return IsOutputInputLinked () ? ( IsInputRunning () || output_running) : output_running;
217223 }
218224
219- bool IsInputEnabled () const { return input_enabled || input_enabled_persistent_mode; }
220- bool IsInputRunning () const { return input_running; }
225+ bool IsInputEnabled () const {
226+ return !(mute_mode == MuteMode::RestartEngine && input_muted) &&
227+ (input_enabled || input_enabled_persistent_mode);
228+ }
229+
230+ bool IsInputRunning () const {
231+ return !(mute_mode == MuteMode::RestartEngine && input_muted) && input_running;
232+ }
221233
222- bool IsAnyEnabled () const { return IsInputEnabled () || output_enabled ; }
223- bool IsAnyRunning () const { return input_running || output_running ; }
234+ bool IsAnyEnabled () const { return IsInputEnabled () || IsOutputEnabled () ; }
235+ bool IsAnyRunning () const { return IsInputRunning () || IsOutputRunning () ; }
224236
225237 bool IsAllEnabled () const {
226238 return IsOutputInputLinked () ? IsInputEnabled () : IsInputEnabled () && output_enabled;
@@ -274,10 +286,16 @@ class AudioEngineDevice : public AudioDeviceModule, public AudioSessionObserver
274286 return prev.default_input_device_id != next.default_input_device_id ;
275287 }
276288
289+ bool DidUpdateMuteMode () const { return prev.mute_mode != next.mute_mode ; }
290+
277291 bool IsEngineRestartRequired () const {
278292 return DidUpdateAudioGraph () || DidUpdateOutputDevice () || DidUpdateInputDevice () ||
293+ // Handle default device updates
279294 (DidUpdateDefaultOutputDevice () && next.IsOutputDefaultDevice ()) ||
280- (DidUpdateDefaultInputDevice () && next.IsInputDefaultDevice ());
295+ (DidUpdateDefaultInputDevice () && next.IsInputDefaultDevice ()) ||
296+ // Handle mute mode update
297+ (DidUpdateMuteMode () && next.mute_mode == MuteMode::RestartEngine &&
298+ next.IsInputEnabled ());
281299 }
282300
283301 // Special case to re-create engine when switching from Speaker & Mic ->
0 commit comments