Index: webrtc/modules/audio_device/ios/audio_device_unittest_ios.mm |
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 82f4426482ad3f93ecdafe3600d1f3335a043d80..bff51aa96b4703a2fa319e479ccbdd09a7deb4b6 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<webrtc::AudioDeviceIOS> audio_device; |