diff options
Diffstat (limited to 'chromium/media/audio/audio_manager_unittest.cc')
-rw-r--r-- | chromium/media/audio/audio_manager_unittest.cc | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/chromium/media/audio/audio_manager_unittest.cc b/chromium/media/audio/audio_manager_unittest.cc index 8c6cc10b423..902618ebd92 100644 --- a/chromium/media/audio/audio_manager_unittest.cc +++ b/chromium/media/audio/audio_manager_unittest.cc @@ -5,6 +5,7 @@ #include "base/environment.h" #include "base/logging.h" #include "base/memory/scoped_ptr.h" +#include "base/synchronization/waitable_event.h" #include "media/audio/audio_manager.h" #include "media/audio/audio_manager_base.h" #include "media/audio/fake_audio_log_factory.h" @@ -28,8 +29,7 @@ namespace media { // Test fixture which allows us to override the default enumeration API on // Windows. -class AudioManagerTest - : public ::testing::Test { +class AudioManagerTest : public ::testing::Test { protected: AudioManagerTest() : audio_manager_(AudioManager::CreateForTesting()) @@ -37,8 +37,16 @@ class AudioManagerTest , com_init_(base::win::ScopedCOMInitializer::kMTA) #endif { + // Wait for audio thread initialization to complete. Otherwise the + // enumeration type may not have been set yet. + base::WaitableEvent event(false, false); + audio_manager_->GetTaskRunner()->PostTask(FROM_HERE, base::Bind( + &base::WaitableEvent::Signal, base::Unretained(&event))); + event.Wait(); } + AudioManager* audio_manager() { return audio_manager_.get(); }; + #if defined(OS_WIN) bool SetMMDeviceEnumeration() { AudioManagerWin* amw = static_cast<AudioManagerWin*>(audio_manager_.get()); @@ -122,6 +130,29 @@ class AudioManagerTest } #endif + // 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(&AudioManagerTest::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(); + } + FakeAudioLogFactory fake_audio_log_factory_; scoped_ptr<AudioManager> audio_manager_; @@ -137,7 +168,10 @@ TEST_F(AudioManagerTest, EnumerateInputDevices) { return; AudioDeviceNames device_names; - audio_manager_->GetAudioInputDeviceNames(&device_names); + RunOnAudioThread( + base::Bind(&AudioManager::GetAudioInputDeviceNames, + base::Unretained(audio_manager()), + &device_names)); CheckDeviceNames(device_names); } @@ -147,7 +181,10 @@ TEST_F(AudioManagerTest, EnumerateOutputDevices) { return; AudioDeviceNames device_names; - audio_manager_->GetAudioOutputDeviceNames(&device_names); + RunOnAudioThread( + base::Bind(&AudioManager::GetAudioOutputDeviceNames, + base::Unretained(audio_manager()), + &device_names)); CheckDeviceNames(device_names); } |