From 855aeead578e77560cd0d29559fd747d3ae406a4 Mon Sep 17 00:00:00 2001 From: jtteh Date: Wed, 17 May 2017 12:37:17 -0700 Subject: [PATCH] Updated comments for unit tests to validate iOS audio session isInterrupted flag does not get reset correctly. BUG=webrtc:7605 Review-Url: https://codereview.webrtc.org/2886183002 Cr-Commit-Position: refs/heads/master@{#18188} --- .../ios/audio_device_unittest_ios.mm | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/webrtc/modules/audio_device/ios/audio_device_unittest_ios.mm b/webrtc/modules/audio_device/ios/audio_device_unittest_ios.mm index 82f4426482..bff51aa96b 100644 --- a/webrtc/modules/audio_device/ios/audio_device_unittest_ios.mm +++ b/webrtc/modules/audio_device/ios/audio_device_unittest_ios.mm @@ -825,6 +825,24 @@ TEST_F(AudioDeviceTest, DISABLED_MeasureLoopbackLatency) { latency_audio_stream->PrintResults(); } +// Verifies that the AudioDeviceIOS is_interrupted_ flag is reset correctly +// after an iOS AVAudioSessionInterruptionTypeEnded notification event. +// AudioDeviceIOS listens to RTCAudioSession interrupted notifications by: +// - In AudioDeviceIOS.InitPlayOrRecord registers its audio_session_observer_ +// callback with RTCAudioSession's delegate list. +// - When RTCAudioSession receives an iOS audio interrupted notification, it +// passes the notification to callbacks in its delegate list which sets +// AudioDeviceIOS's is_interrupted_ flag to true. +// - When AudioDeviceIOS.ShutdownPlayOrRecord is called, its +// audio_session_observer_ callback is removed from RTCAudioSessions's +// delegate list. +// So if RTCAudioSession receives an iOS end audio interruption notification, +// AudioDeviceIOS is not notified as its callback is not in RTCAudioSession's +// delegate list. This causes AudioDeviceIOS's is_interrupted_ flag to be in +// the wrong (true) state and the audio session will ignore audio changes. +// As RTCAudioSession keeps its own interrupted state, the fix is to initialize +// AudioDeviceIOS's is_interrupted_ flag to RTCAudioSession's isInterrupted +// flag in AudioDeviceIOS.InitPlayOrRecord. TEST_F(AudioDeviceTest, testInterruptedAudioSession) { RTCAudioSession *session = [RTCAudioSession sharedInstance]; std::unique_ptr audio_device;