diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index 252ec9dfb2..42db281261 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -277,6 +277,7 @@ if (is_ios || is_mac) { "../rtc_base", "../rtc_base:checks", "../rtc_base/system:fallthrough", + "../system_wrappers:field_trial", "../system_wrappers:metrics", ] diff --git a/sdk/objc/native/src/audio/audio_device_ios.mm b/sdk/objc/native/src/audio/audio_device_ios.mm index efbf463efb..5df7b8f4ba 100644 --- a/sdk/objc/native/src/audio/audio_device_ios.mm +++ b/sdk/objc/native/src/audio/audio_device_ios.mm @@ -26,6 +26,7 @@ #include "rtc_base/thread.h" #include "rtc_base/thread_annotations.h" #include "rtc_base/time_utils.h" +#include "system_wrappers/include/field_trial.h" #include "system_wrappers/include/metrics.h" #import "base/RTCLogging.h" @@ -517,6 +518,19 @@ void AudioDeviceIOS::HandleInterruptionEnd() { "Updating audio unit state.", is_interrupted_); is_interrupted_ = false; + if (webrtc::field_trial::IsEnabled("WebRTC-Audio-iOS-Holding")) { + // Work around an issue where audio does not restart properly after an interruption + // by restarting the audio unit when the interruption ends. + if (audio_unit_->GetState() == VoiceProcessingAudioUnit::kStarted) { + audio_unit_->Stop(); + PrepareForNewStart(); + } + if (audio_unit_->GetState() == VoiceProcessingAudioUnit::kInitialized) { + audio_unit_->Uninitialize(); + } + // Allocate new buffers given the potentially new stream format. + SetupAudioBuffersForActiveAudioSession(); + } UpdateAudioUnit([RTCAudioSession sharedInstance].canPlayOrRecord); }