iOS audio session isInterrupted flag does not get reset correctly:

BUG=webrtc:7605

Review-Url: https://codereview.webrtc.org/2872953002
Cr-Commit-Position: refs/heads/master@{#18072}
This commit is contained in:
jtteh 2017-05-09 15:09:37 -07:00 committed by Commit bot
parent d277a7ccce
commit 5171a7f58c
4 changed files with 42 additions and 1 deletions

View File

@ -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" ]
}

View File

@ -14,6 +14,7 @@
#include <memory>
#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

View File

@ -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];

View File

@ -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<webrtc::AudioDeviceIOS> audio_device;
audio_device.reset(new webrtc::AudioDeviceIOS());
std::unique_ptr<webrtc::AudioDeviceBuffer> 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