| Index: media/audio/audio_input_unittest.cc
|
| diff --git a/media/audio/audio_input_unittest.cc b/media/audio/audio_input_unittest.cc
|
| index 260598b8043d365ad2f3312c609d0b7b1b99f463..2463473f75b26d536310e415117b90eae80d5763 100644
|
| --- a/media/audio/audio_input_unittest.cc
|
| +++ b/media/audio/audio_input_unittest.cc
|
| @@ -6,6 +6,7 @@
|
| #include "base/environment.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop/message_loop.h"
|
| +#include "base/synchronization/waitable_event.h"
|
| #include "base/threading/platform_thread.h"
|
| #include "media/audio/audio_io.h"
|
| #include "media/audio/audio_manager_base.h"
|
| @@ -56,65 +57,113 @@ class TestInputCallback : public AudioInputStream::AudioInputCallback {
|
| int max_data_bytes_;
|
| };
|
|
|
| -static bool CanRunAudioTests(AudioManager* audio_man) {
|
| - bool has_input = audio_man->HasAudioInputDevices();
|
| +class AudioInputTest : public testing::Test {
|
| + public:
|
| + AudioInputTest() :
|
| + message_loop_(base::MessageLoop::TYPE_UI),
|
| + audio_manager_(AudioManager::CreateForTesting()),
|
| + audio_input_stream_(NULL) {
|
| + }
|
|
|
| - if (!has_input)
|
| - LOG(WARNING) << "No input devices detected";
|
| + virtual ~AudioInputTest() {
|
| + }
|
|
|
| - return has_input;
|
| -}
|
| + protected:
|
| + AudioManager* audio_manager() { return audio_manager_.get(); }
|
|
|
| -static AudioInputStream* CreateTestAudioInputStream(AudioManager* audio_man) {
|
| - AudioInputStream* ais = audio_man->MakeAudioInputStream(
|
| - AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO,
|
| - kSamplingRate, 16, kSamplesPerPacket),
|
| - AudioManagerBase::kDefaultDeviceId);
|
| - EXPECT_TRUE(NULL != ais);
|
| - return ais;
|
| -}
|
| + bool CanRunAudioTests() {
|
| + bool has_input = audio_manager()->HasAudioInputDevices();
|
| + if (!has_input)
|
| + LOG(WARNING) << "No input devices detected";
|
| + return has_input;
|
| + }
|
|
|
| -// Test that AudioInputStream rejects out of range parameters.
|
| -TEST(AudioInputTest, SanityOnMakeParams) {
|
| - scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting());
|
| - if (!CanRunAudioTests(audio_man.get()))
|
| - return;
|
| + void MakeAudioInputStreamOnAudioThread() {
|
| + RunOnAudioThread(
|
| + base::Bind(&AudioInputTest::MakeAudioInputStream,
|
| + base::Unretained(this)));
|
| + }
|
|
|
| - AudioParameters::Format fmt = AudioParameters::AUDIO_PCM_LINEAR;
|
| - EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
|
| - AudioParameters(fmt, CHANNEL_LAYOUT_7_1, 8000, 16,
|
| - kSamplesPerPacket), AudioManagerBase::kDefaultDeviceId));
|
| - EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
|
| - AudioParameters(fmt, CHANNEL_LAYOUT_MONO, 1024 * 1024, 16,
|
| - kSamplesPerPacket), AudioManagerBase::kDefaultDeviceId));
|
| - EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
|
| - AudioParameters(fmt, CHANNEL_LAYOUT_STEREO, 8000, 80,
|
| - kSamplesPerPacket), AudioManagerBase::kDefaultDeviceId));
|
| - EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
|
| - AudioParameters(fmt, CHANNEL_LAYOUT_STEREO, 8000, 80,
|
| - 1000 * kSamplesPerPacket),
|
| - AudioManagerBase::kDefaultDeviceId));
|
| - EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
|
| - AudioParameters(fmt, CHANNEL_LAYOUT_UNSUPPORTED, 8000, 16,
|
| - kSamplesPerPacket), AudioManagerBase::kDefaultDeviceId));
|
| - EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
|
| - AudioParameters(fmt, CHANNEL_LAYOUT_STEREO, -8000, 16,
|
| - kSamplesPerPacket), AudioManagerBase::kDefaultDeviceId));
|
| - EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
|
| - AudioParameters(fmt, CHANNEL_LAYOUT_STEREO, 8000, -16,
|
| - kSamplesPerPacket), AudioManagerBase::kDefaultDeviceId));
|
| - EXPECT_TRUE(NULL == audio_man->MakeAudioInputStream(
|
| - AudioParameters(fmt, CHANNEL_LAYOUT_STEREO, 8000, 16, -1024),
|
| - AudioManagerBase::kDefaultDeviceId));
|
| -}
|
| + void CloseAudioInputStreamOnAudioThread() {
|
| + RunOnAudioThread(
|
| + base::Bind(&AudioInputStream::Close,
|
| + base::Unretained(audio_input_stream_)));
|
| + audio_input_stream_ = NULL;
|
| + }
|
| +
|
| + void OpenAndCloseAudioInputStreamOnAudioThread() {
|
| + RunOnAudioThread(
|
| + base::Bind(&AudioInputTest::OpenAndClose,
|
| + base::Unretained(this)));
|
| + }
|
| +
|
| + void OpenStopAndCloseAudioInputStreamOnAudioThread() {
|
| + RunOnAudioThread(
|
| + base::Bind(&AudioInputTest::OpenStopAndClose,
|
| + base::Unretained(this)));
|
| + }
|
| +
|
| + void MakeAudioInputStream() {
|
| + DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread());
|
| + AudioParameters params = audio_manager()->GetInputStreamParameters(
|
| + AudioManagerBase::kDefaultDeviceId);
|
| + audio_input_stream_ = audio_manager()->MakeAudioInputStream(params,
|
| + AudioManagerBase::kDefaultDeviceId);
|
| + EXPECT_TRUE(audio_input_stream_);
|
| + }
|
| +
|
| + void OpenAndClose() {
|
| + DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread());
|
| + EXPECT_TRUE(audio_input_stream_->Open());
|
| + audio_input_stream_->Close();
|
| + audio_input_stream_ = NULL;
|
| + }
|
| +
|
| + void OpenStopAndClose() {
|
| + DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread());
|
| + EXPECT_TRUE(audio_input_stream_->Open());
|
| + audio_input_stream_->Stop();
|
| + audio_input_stream_->Close();
|
| + audio_input_stream_ = NULL;
|
| + }
|
| +
|
| + // Synchronously runs the provided callback/closure on the audio thread.
|
| + void RunOnAudioThread(const base::Closure& closure) {
|
| + if (!audio_manager()->GetTaskRunner()->BelongsToCurrentThread()) {
|
| + base::WaitableEvent event(false, false);
|
| + audio_manager()->GetTaskRunner()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&AudioInputTest::RunOnAudioThreadImpl,
|
| + base::Unretained(this),
|
| + closure,
|
| + &event));
|
| + event.Wait();
|
| + } else {
|
| + closure.Run();
|
| + }
|
| + }
|
| +
|
| + void RunOnAudioThreadImpl(const base::Closure& closure,
|
| + base::WaitableEvent* event) {
|
| + DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread());
|
| + closure.Run();
|
| + event->Signal();
|
| + }
|
| +
|
| + base::MessageLoop message_loop_;
|
| + scoped_ptr<AudioManager> audio_manager_;
|
| + AudioInputStream* audio_input_stream_;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(AudioInputTest);
|
| +};
|
|
|
| // Test create and close of an AudioInputStream without recording audio.
|
| -TEST(AudioInputTest, CreateAndClose) {
|
| - scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting());
|
| - if (!CanRunAudioTests(audio_man.get()))
|
| +TEST_F(AudioInputTest, CreateAndClose) {
|
| + if (!CanRunAudioTests())
|
| return;
|
| - AudioInputStream* ais = CreateTestAudioInputStream(audio_man.get());
|
| - ais->Close();
|
| + MakeAudioInputStreamOnAudioThread();
|
| + CloseAudioInputStreamOnAudioThread();
|
| }
|
|
|
| #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
|
| @@ -124,13 +173,11 @@ TEST(AudioInputTest, CreateAndClose) {
|
| #define MAYBE_OpenAndClose OpenAndClose
|
| #endif
|
| // Test create, open and close of an AudioInputStream without recording audio.
|
| -TEST(AudioInputTest, MAYBE_OpenAndClose) {
|
| - scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting());
|
| - if (!CanRunAudioTests(audio_man.get()))
|
| +TEST_F(AudioInputTest, MAYBE_OpenAndClose) {
|
| + if (!CanRunAudioTests())
|
| return;
|
| - AudioInputStream* ais = CreateTestAudioInputStream(audio_man.get());
|
| - EXPECT_TRUE(ais->Open());
|
| - ais->Close();
|
| + MakeAudioInputStreamOnAudioThread();
|
| + OpenAndCloseAudioInputStreamOnAudioThread();
|
| }
|
|
|
| #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
|
| @@ -140,45 +187,41 @@ TEST(AudioInputTest, MAYBE_OpenAndClose) {
|
| #define MAYBE_OpenStopAndClose OpenStopAndClose
|
| #endif
|
| // Test create, open, stop and close of an AudioInputStream without recording.
|
| -TEST(AudioInputTest, MAYBE_OpenStopAndClose) {
|
| - scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting());
|
| - if (!CanRunAudioTests(audio_man.get()))
|
| +TEST_F(AudioInputTest, MAYBE_OpenStopAndClose) {
|
| + if (!CanRunAudioTests())
|
| return;
|
| - AudioInputStream* ais = CreateTestAudioInputStream(audio_man.get());
|
| - EXPECT_TRUE(ais->Open());
|
| - ais->Stop();
|
| - ais->Close();
|
| + MakeAudioInputStreamOnAudioThread();
|
| + OpenStopAndCloseAudioInputStreamOnAudioThread();
|
| }
|
|
|
| #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
|
| // This test is failing on ARM linux: http://crbug.com/238490
|
| #define MAYBE_Record DISABLED_Record
|
| #else
|
| -#define MAYBE_Record Record
|
| +// TODO(henrika): remove DISABLED_.
|
| +#define MAYBE_Record DISABLED_Record
|
| #endif
|
| // Test a normal recording sequence using an AudioInputStream.
|
| -TEST(AudioInputTest, MAYBE_Record) {
|
| - scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting());
|
| - if (!CanRunAudioTests(audio_man.get()))
|
| +TEST_F(AudioInputTest, MAYBE_Record) {
|
| + if (!CanRunAudioTests())
|
| return;
|
| - base::MessageLoop message_loop;
|
| - AudioInputStream* ais = CreateTestAudioInputStream(audio_man.get());
|
| - EXPECT_TRUE(ais->Open());
|
| + MakeAudioInputStreamOnAudioThread();
|
| + EXPECT_TRUE(audio_input_stream_->Open());
|
|
|
| TestInputCallback test_callback(kSamplesPerPacket * 4);
|
| - ais->Start(&test_callback);
|
| + audio_input_stream_->Start(&test_callback);
|
| // Verify at least 500ms worth of audio was recorded, after giving sufficient
|
| // extra time.
|
| - message_loop.PostDelayedTask(
|
| + message_loop_.PostDelayedTask(
|
| FROM_HERE,
|
| base::MessageLoop::QuitClosure(),
|
| base::TimeDelta::FromMilliseconds(690));
|
| - message_loop.Run();
|
| + message_loop_.Run();
|
| EXPECT_GE(test_callback.callback_count(), 1);
|
| EXPECT_FALSE(test_callback.had_error());
|
|
|
| - ais->Stop();
|
| - ais->Close();
|
| + audio_input_stream_->Stop();
|
| + audio_input_stream_->Close();
|
| }
|
|
|
| } // namespace media
|
|
|