From f49429d507f60e9b5031b1308fc51b7ec6075074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A1ri=20Tristan=20Helgason?= Date: Thu, 28 Mar 2019 11:03:27 +0100 Subject: [PATCH] Adds workaround for audio not restarting after interruption MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:8126 Change-Id: I9499e7bf06cad598fd4406b590354d695fa1a9d6 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/129927 Reviewed-by: Henrik Andreassson Commit-Queue: Kári Helgason Cr-Commit-Position: refs/heads/master@{#27337} --- sdk/BUILD.gn | 1 + sdk/objc/native/src/audio/audio_device_ios.mm | 14 ++++++++++++++ 2 files changed, 15 insertions(+) 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); }