// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/message_loop.h" #include "base/synchronization/waitable_event.h" #include "media/audio/audio_manager.h" #include "media/audio/simple_sources.h" #include "media/audio/virtual_audio_input_stream.h" #include "media/audio/virtual_audio_output_stream.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" using ::testing::_; namespace media { class MockVirtualAudioInputStream : public VirtualAudioInputStream { public: MockVirtualAudioInputStream(AudioManagerBase* manager, AudioParameters params, base::MessageLoopProxy* message_loop) : VirtualAudioInputStream(manager, params, message_loop) {} ~MockVirtualAudioInputStream() {} MOCK_METHOD2(AddOutputStream, void(VirtualAudioOutputStream* stream, const AudioParameters& output_params)); MOCK_METHOD2(RemoveOutputStream, void(VirtualAudioOutputStream* stream, const AudioParameters& output_params)); private: DISALLOW_COPY_AND_ASSIGN(MockVirtualAudioInputStream); }; class MockAudioDeviceListener : public AudioManager::AudioDeviceListener { public: MOCK_METHOD0(OnDeviceChange, void()); }; class VirtualAudioOutputStreamTest : public testing::Test { public: void ListenAndCreateVirtualOnAudioThread( AudioManager* manager, AudioManager::AudioDeviceListener* listener) { manager->AddOutputDeviceChangeListener(listener); AudioParameters params( AudioParameters::AUDIO_VIRTUAL, CHANNEL_LAYOUT_MONO, 8000, 8, 128); AudioInputStream* stream = manager->MakeAudioInputStream(params, "1"); stream->Close(); signal_.Signal(); } void RemoveListenerOnAudioThread( AudioManager* manager, AudioManager::AudioDeviceListener* listener) { manager->RemoveOutputDeviceChangeListener(listener); signal_.Signal(); } protected: VirtualAudioOutputStreamTest() : signal_(false, false) {} base::WaitableEvent signal_; private: DISALLOW_COPY_AND_ASSIGN(VirtualAudioOutputStreamTest); }; TEST_F(VirtualAudioOutputStreamTest, StartStopStartStop) { scoped_ptr audio_manager(AudioManager::Create()); MessageLoop message_loop; AudioParameters params( AudioParameters::AUDIO_VIRTUAL, CHANNEL_LAYOUT_MONO, 8000, 8, 128); AudioParameters output_params( AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, 8000, 8, 128); MockVirtualAudioInputStream input_stream( static_cast(audio_manager.get()), params, message_loop.message_loop_proxy()); EXPECT_CALL(input_stream, AddOutputStream(_, _)).Times(2); EXPECT_CALL(input_stream, RemoveOutputStream(_, _)).Times(2); scoped_ptr output_stream( VirtualAudioOutputStream::MakeStream( static_cast(audio_manager.get()), output_params, message_loop.message_loop_proxy(), &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. } // Tests that we get notifications to reattach output streams when we create a // VirtualAudioInputStream. TEST_F(VirtualAudioOutputStreamTest, OutputStreamsNotified) { scoped_ptr audio_manager(AudioManager::Create()); MockAudioDeviceListener mock_listener; EXPECT_CALL(mock_listener, OnDeviceChange()).Times(2); audio_manager->GetMessageLoop()->PostTask( FROM_HERE, base::Bind( &VirtualAudioOutputStreamTest::ListenAndCreateVirtualOnAudioThread, base::Unretained(this), audio_manager.get(), &mock_listener)); signal_.Wait(); audio_manager->GetMessageLoop()->PostTask( FROM_HERE, base::Bind( &VirtualAudioOutputStreamTest::RemoveListenerOnAudioThread, base::Unretained(this), audio_manager.get(), &mock_listener)); signal_.Wait(); } } // namespace media