diff --git a/webrtc/modules/audio_device/BUILD.gn b/webrtc/modules/audio_device/BUILD.gn index ab0b4f5b32..de9096ee6f 100644 --- a/webrtc/modules/audio_device/BUILD.gn +++ b/webrtc/modules/audio_device/BUILD.gn @@ -174,6 +174,7 @@ rtc_static_library("audio_device") { } if (is_ios) { public_deps = [ + "../../base:gtest_prod", "../../base:rtc_base", "../../sdk:rtc_sdk_common_objc", ] @@ -298,7 +299,7 @@ if (rtc_include_tests) { if (is_ios) { sources += [ "ios/objc/RTCAudioSessionTest.mm" ] if (target_cpu != "x64") { - sources += [ "ios/audio_device_unittest_ios.cc" ] + sources += [ "ios/audio_device_unittest_ios.mm" ] } deps += [ "//third_party/ocmock" ] } diff --git a/webrtc/modules/audio_device/ios/audio_device_ios.h b/webrtc/modules/audio_device/ios/audio_device_ios.h index 01dd7cd930..5710299bdb 100644 --- a/webrtc/modules/audio_device/ios/audio_device_ios.h +++ b/webrtc/modules/audio_device/ios/audio_device_ios.h @@ -14,6 +14,7 @@ #include #include "WebRTC/RTCMacros.h" +#include "webrtc/base/gtest_prod_util.h" #include "webrtc/base/thread.h" #include "webrtc/base/thread_checker.h" #include "webrtc/modules/audio_device/audio_device_generic.h" @@ -292,6 +293,9 @@ class AudioDeviceIOS : public AudioDeviceGeneric, // Set to true if we've activated the audio session. bool has_configured_session_; + + // Exposes private members for testing purposes only. + FRIEND_TEST_ALL_PREFIXES(AudioDeviceTest, testInterruptedAudioSession); }; } // namespace webrtc diff --git a/webrtc/modules/audio_device/ios/audio_device_ios.mm b/webrtc/modules/audio_device/ios/audio_device_ios.mm index ba4fe2a963..8cb1cd2b99 100644 --- a/webrtc/modules/audio_device/ios/audio_device_ios.mm +++ b/webrtc/modules/audio_device/ios/audio_device_ios.mm @@ -797,6 +797,7 @@ bool AudioDeviceIOS::InitPlayOrRecord() { RTCAudioSession* session = [RTCAudioSession sharedInstance]; // Subscribe to audio session events. [session pushDelegate:audio_session_observer_]; + is_interrupted_ = session.isInterrupted ? true : false; // Lock the session to make configuration changes. [session lockForConfiguration]; diff --git a/webrtc/modules/audio_device/ios/audio_device_unittest_ios.cc b/webrtc/modules/audio_device/ios/audio_device_unittest_ios.mm similarity index 96% rename from webrtc/modules/audio_device/ios/audio_device_unittest_ios.cc rename to webrtc/modules/audio_device/ios/audio_device_unittest_ios.mm index 1b7ff5780f..82f4426482 100644 --- a/webrtc/modules/audio_device/ios/audio_device_unittest_ios.cc +++ b/webrtc/modules/audio_device/ios/audio_device_unittest_ios.mm @@ -32,6 +32,9 @@ #include "webrtc/test/gtest.h" #include "webrtc/test/testsupport/fileutils.h" +#import "webrtc/modules/audio_device/ios/objc/RTCAudioSession.h" +#import "webrtc/modules/audio_device/ios/objc/RTCAudioSession+Private.h" + using std::cout; using std::endl; using ::testing::_; @@ -822,4 +825,36 @@ TEST_F(AudioDeviceTest, DISABLED_MeasureLoopbackLatency) { latency_audio_stream->PrintResults(); } +TEST_F(AudioDeviceTest, testInterruptedAudioSession) { + RTCAudioSession *session = [RTCAudioSession sharedInstance]; + std::unique_ptr audio_device; + audio_device.reset(new webrtc::AudioDeviceIOS()); + std::unique_ptr audio_buffer; + audio_buffer.reset(new webrtc::AudioDeviceBuffer()); + audio_device->AttachAudioBuffer(audio_buffer.get()); + audio_device->Init(); + audio_device->InitPlayout(); + // Force interruption. + [session notifyDidBeginInterruption]; + + // Wait for notification to propagate. + rtc::MessageQueueManager::ProcessAllMessageQueues(); + EXPECT_TRUE(audio_device->is_interrupted_); + + // Force it for testing. + audio_device->playing_ = false; + audio_device->ShutdownPlayOrRecord(); + // Force it for testing. + audio_device->audio_is_initialized_ = false; + + [session notifyDidEndInterruptionWithShouldResumeSession:YES]; + // Wait for notification to propagate. + rtc::MessageQueueManager::ProcessAllMessageQueues(); + EXPECT_TRUE(audio_device->is_interrupted_); + + audio_device->Init(); + audio_device->InitPlayout(); + EXPECT_FALSE(audio_device->is_interrupted_); +} + } // namespace webrtc