Index: media/audio/virtual_audio_output_stream_unittest.cc |
diff --git a/media/audio/virtual_audio_output_stream_unittest.cc b/media/audio/virtual_audio_output_stream_unittest.cc |
index ae267f5f24a4b3d7d77434d50153522a6aee758c..3dc4a214a1cbf40cd62eb3274d28e44577bf711a 100644 |
--- a/media/audio/virtual_audio_output_stream_unittest.cc |
+++ b/media/audio/virtual_audio_output_stream_unittest.cc |
@@ -2,7 +2,10 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
#include "base/message_loop.h" |
+#include "base/message_loop_proxy.h" |
#include "base/synchronization/waitable_event.h" |
#include "media/audio/audio_manager.h" |
#include "media/audio/simple_sources.h" |
@@ -17,10 +20,10 @@ namespace media { |
class MockVirtualAudioInputStream : public VirtualAudioInputStream { |
public: |
- MockVirtualAudioInputStream(AudioManagerBase* manager, |
- AudioParameters params, |
- base::MessageLoopProxy* message_loop) |
- : VirtualAudioInputStream(manager, params, message_loop) {} |
+ MockVirtualAudioInputStream(const AudioParameters& params, |
+ base::MessageLoopProxy* message_loop, |
+ const AfterCloseCallback& after_close_cb) |
+ : VirtualAudioInputStream(params, message_loop, after_close_cb) {} |
~MockVirtualAudioInputStream() {} |
MOCK_METHOD2(AddOutputStream, void(VirtualAudioOutputStream* stream, |
@@ -39,91 +42,116 @@ class MockAudioDeviceListener : public AudioManager::AudioDeviceListener { |
class VirtualAudioOutputStreamTest : public testing::Test { |
public: |
+ VirtualAudioOutputStreamTest() |
+ : audio_manager_(AudioManager::Create()) {} |
+ |
+ scoped_refptr<base::MessageLoopProxy> audio_message_loop() const { |
+ return audio_manager_->GetMessageLoop(); |
+ } |
+ |
void ListenAndCreateVirtualOnAudioThread( |
- AudioManager* manager, AudioManager::AudioDeviceListener* listener) { |
- manager->AddOutputDeviceChangeListener(listener); |
+ AudioManager::AudioDeviceListener* listener) { |
+ audio_manager_->AddOutputDeviceChangeListener(listener); |
AudioParameters params( |
AudioParameters::AUDIO_VIRTUAL, CHANNEL_LAYOUT_MONO, 8000, 8, 128); |
- AudioInputStream* stream = manager->MakeAudioInputStream(params, "1"); |
- stream->Close(); |
- signal_.Signal(); |
+ AudioInputStream* stream = |
+ audio_manager_->MakeAudioInputStream(params, "1"); |
+ stream->Open(); |
+ stream->Close(); // AudioManager deletes |stream|. |
} |
void RemoveListenerOnAudioThread( |
- AudioManager* manager, AudioManager::AudioDeviceListener* listener) { |
- manager->RemoveOutputDeviceChangeListener(listener); |
- signal_.Signal(); |
+ AudioManager::AudioDeviceListener* listener) { |
+ audio_manager_->RemoveOutputDeviceChangeListener(listener); |
} |
- protected: |
- VirtualAudioOutputStreamTest() : signal_(false, false) {} |
- |
- base::WaitableEvent signal_; |
+ void SyncWithAudioThread() { |
+ base::WaitableEvent done(false, false); |
+ audio_message_loop()->PostTask( |
+ FROM_HERE, base::Bind(&base::WaitableEvent::Signal, |
+ base::Unretained(&done))); |
+ done.Wait(); |
+ } |
private: |
+ scoped_ptr<AudioManager> audio_manager_; |
+ |
DISALLOW_COPY_AND_ASSIGN(VirtualAudioOutputStreamTest); |
}; |
TEST_F(VirtualAudioOutputStreamTest, StartStopStartStop) { |
- scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); |
- |
- MessageLoop message_loop; |
+ static const int kCycles = 3; |
AudioParameters params( |
AudioParameters::AUDIO_VIRTUAL, CHANNEL_LAYOUT_MONO, 8000, 8, 128); |
AudioParameters output_params( |
- AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, 8000, 8, 128); |
+ AudioParameters::AUDIO_FAKE, CHANNEL_LAYOUT_MONO, 8000, 8, 128); |
- MockVirtualAudioInputStream input_stream( |
- static_cast<AudioManagerBase*>(audio_manager.get()), |
- params, |
- message_loop.message_loop_proxy()); |
- |
- EXPECT_CALL(input_stream, AddOutputStream(_, _)).Times(2); |
- EXPECT_CALL(input_stream, RemoveOutputStream(_, _)).Times(2); |
+ MockVirtualAudioInputStream* const input_stream = |
+ new MockVirtualAudioInputStream( |
+ params, audio_message_loop(), |
+ base::Bind(&base::DeletePointer<VirtualAudioInputStream>)); |
+ audio_message_loop()->PostTask( |
+ FROM_HERE, base::Bind( |
+ base::IgnoreResult(&MockVirtualAudioInputStream::Open), |
+ base::Unretained(input_stream))); |
+ |
+ VirtualAudioOutputStream* const output_stream = |
+ new VirtualAudioOutputStream( |
+ output_params, audio_message_loop(), input_stream, |
+ base::Bind(&base::DeletePointer<VirtualAudioOutputStream>)); |
+ |
+ EXPECT_CALL(*input_stream, AddOutputStream(output_stream, _)) |
+ .Times(kCycles); |
+ EXPECT_CALL(*input_stream, RemoveOutputStream(output_stream, _)) |
+ .Times(kCycles); |
+ |
+ audio_message_loop()->PostTask( |
+ FROM_HERE, base::Bind(base::IgnoreResult(&VirtualAudioOutputStream::Open), |
+ base::Unretained(output_stream))); |
+ SineWaveAudioSource source(CHANNEL_LAYOUT_STEREO, 200.0, 128); |
+ for (int i = 0; i < kCycles; ++i) { |
+ audio_message_loop()->PostTask( |
+ FROM_HERE, base::Bind(&VirtualAudioOutputStream::Start, |
+ base::Unretained(output_stream), |
+ &source)); |
+ audio_message_loop()->PostTask( |
+ FROM_HERE, base::Bind(&VirtualAudioOutputStream::Stop, |
+ base::Unretained(output_stream))); |
+ } |
+ audio_message_loop()->PostTask( |
+ FROM_HERE, base::Bind(&VirtualAudioOutputStream::Close, |
+ base::Unretained(output_stream))); |
- scoped_ptr<VirtualAudioOutputStream> output_stream( |
- VirtualAudioOutputStream::MakeStream( |
- static_cast<AudioManagerBase*>(audio_manager.get()), |
- output_params, |
- message_loop.message_loop_proxy(), |
- &input_stream)); |
+ audio_message_loop()->PostTask( |
+ FROM_HERE, base::Bind(&MockVirtualAudioInputStream::Close, |
+ base::Unretained(input_stream))); |
- SineWaveAudioSource source(CHANNEL_LAYOUT_STEREO, 200.0, 128); |
- output_stream->Start(&source); |
- output_stream->Stop(); |
- output_stream->Start(&source); |
- output_stream->Stop(); |
- // Can't Close() here because we didn't create this output stream is not owned |
- // by the audio manager. |
+ SyncWithAudioThread(); |
} |
// Tests that we get notifications to reattach output streams when we create a |
// VirtualAudioInputStream. |
TEST_F(VirtualAudioOutputStreamTest, OutputStreamsNotified) { |
- scoped_ptr<AudioManager> audio_manager(AudioManager::Create()); |
- |
MockAudioDeviceListener mock_listener; |
EXPECT_CALL(mock_listener, OnDeviceChange()).Times(2); |
- audio_manager->GetMessageLoop()->PostTask( |
+ audio_message_loop()->PostTask( |
FROM_HERE, base::Bind( |
&VirtualAudioOutputStreamTest::ListenAndCreateVirtualOnAudioThread, |
base::Unretained(this), |
- audio_manager.get(), |
&mock_listener)); |
- signal_.Wait(); |
+ SyncWithAudioThread(); |
- audio_manager->GetMessageLoop()->PostTask( |
+ audio_message_loop()->PostTask( |
FROM_HERE, base::Bind( |
&VirtualAudioOutputStreamTest::RemoveListenerOnAudioThread, |
base::Unretained(this), |
- audio_manager.get(), |
&mock_listener)); |
- signal_.Wait(); |
+ SyncWithAudioThread(); |
} |
} // namespace media |