diff options
author | dalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-26 19:34:42 +0000 |
---|---|---|
committer | dalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-26 19:34:42 +0000 |
commit | a59f4517cd705f75bc46f5781527f96599734a6d (patch) | |
tree | b76e4f067b0a76051abcde9d552b14bde7100435 | |
parent | dfa88de61f938f26f5adfffb5928ba8e4a17ed8a (diff) | |
download | chromium_src-a59f4517cd705f75bc46f5781527f96599734a6d.zip chromium_src-a59f4517cd705f75bc46f5781527f96599734a6d.tar.gz chromium_src-a59f4517cd705f75bc46f5781527f96599734a6d.tar.bz2 |
Allow AudioRendererMixerInput::Stop() to be called anytime.
BUG=157710
TEST=new unittest
Review URL: https://codereview.chromium.org/11270025
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@164373 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | media/base/audio_renderer_mixer_input.cc | 14 | ||||
-rw-r--r-- | media/base/audio_renderer_mixer_input.h | 1 | ||||
-rw-r--r-- | media/base/audio_renderer_mixer_input_unittest.cc | 20 | ||||
-rw-r--r-- | media/base/audio_renderer_mixer_unittest.cc | 2 | ||||
-rw-r--r-- | media/filters/audio_renderer_impl.cc | 9 |
5 files changed, 36 insertions, 10 deletions
diff --git a/media/base/audio_renderer_mixer_input.cc b/media/base/audio_renderer_mixer_input.cc index b5756d2..c748f8f 100644 --- a/media/base/audio_renderer_mixer_input.cc +++ b/media/base/audio_renderer_mixer_input.cc @@ -13,6 +13,7 @@ AudioRendererMixerInput::AudioRendererMixerInput( const GetMixerCB& get_mixer_cb, const RemoveMixerCB& remove_mixer_cb) : playing_(false), initialized_(false), + started_(false), volume_(1.0f), get_mixer_cb_(get_mixer_cb), remove_mixer_cb_(remove_mixer_cb), @@ -38,20 +39,29 @@ void AudioRendererMixerInput::Initialize( void AudioRendererMixerInput::Start() { DCHECK(initialized_); + DCHECK(!started_); mixer_->AddMixerInput(this); + started_ = true; } void AudioRendererMixerInput::Stop() { - DCHECK(initialized_); + // Stop() may be called at any time, so we can't blindly remove our input. + if (started_) { + mixer_->RemoveMixerInput(this); + started_ = false; + } playing_ = false; - mixer_->RemoveMixerInput(this); } void AudioRendererMixerInput::Play() { + DCHECK(initialized_); + DCHECK(started_); playing_ = true; } void AudioRendererMixerInput::Pause(bool /* flush */) { + DCHECK(initialized_); + DCHECK(started_); // We don't care about flush since Pause() simply indicates we should send // silence to AudioRendererMixer. playing_ = false; diff --git a/media/base/audio_renderer_mixer_input.h b/media/base/audio_renderer_mixer_input.h index dee7f3d..486f5c2 100644 --- a/media/base/audio_renderer_mixer_input.h +++ b/media/base/audio_renderer_mixer_input.h @@ -44,6 +44,7 @@ class MEDIA_EXPORT AudioRendererMixerInput private: bool playing_; bool initialized_; + bool started_; double volume_; // Callbacks provided during construction which allow AudioRendererMixerInput diff --git a/media/base/audio_renderer_mixer_input_unittest.cc b/media/base/audio_renderer_mixer_input_unittest.cc index 48b2232..a3cb3bc 100644 --- a/media/base/audio_renderer_mixer_input_unittest.cc +++ b/media/base/audio_renderer_mixer_input_unittest.cc @@ -25,14 +25,18 @@ class AudioRendererMixerInputTest : public testing::Test { AudioParameters::AUDIO_PCM_LINEAR, kChannelLayout, kSampleRate, kBitsPerChannel, kBufferSize); + CreateMixerInput(); + fake_callback_.reset(new FakeAudioRenderCallback(0)); + mixer_input_->Initialize(audio_parameters_, fake_callback_.get()); + EXPECT_CALL(*this, RemoveMixer(testing::_)); + } + + void CreateMixerInput() { mixer_input_ = new AudioRendererMixerInput( base::Bind( &AudioRendererMixerInputTest::GetMixer, base::Unretained(this)), base::Bind( &AudioRendererMixerInputTest::RemoveMixer, base::Unretained(this))); - fake_callback_.reset(new FakeAudioRenderCallback(0)); - mixer_input_->Initialize(audio_parameters_, fake_callback_.get()); - EXPECT_CALL(*this, RemoveMixer(testing::_)); } AudioRendererMixer* GetMixer(const AudioParameters& params) { @@ -94,4 +98,14 @@ TEST_F(AudioRendererMixerInputTest, StartPlayPauseStopPlaying) { EXPECT_FALSE(mixer_input_->playing()); } +// Test that Stop() can be called before Initialize() and Start(). +TEST_F(AudioRendererMixerInputTest, StopBeforeInitializeOrStart) { + // |mixer_input_| was initialized during construction. + mixer_input_->Stop(); + + // Verify Stop() works without Initialize() or Start(). + CreateMixerInput(); + mixer_input_->Stop(); +} + } // namespace media diff --git a/media/base/audio_renderer_mixer_unittest.cc b/media/base/audio_renderer_mixer_unittest.cc index 0bc5516..aad2313 100644 --- a/media/base/audio_renderer_mixer_unittest.cc +++ b/media/base/audio_renderer_mixer_unittest.cc @@ -164,7 +164,7 @@ class AudioRendererMixerTest EXPECT_TRUE(RenderAndValidateAudioData(0.0f)); // Start() all even numbered mixer inputs and ensure we still get silence. - for (size_t i = 0; i < mixer_inputs_.size(); ++i) + for (size_t i = 0; i < mixer_inputs_.size(); i += 2) mixer_inputs_[i]->Start(); FillAudioData(1.0f); EXPECT_TRUE(RenderAndValidateAudioData(0.0f)); diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc index 772af20..2805ed0 100644 --- a/media/filters/audio_renderer_impl.cc +++ b/media/filters/audio_renderer_impl.cc @@ -86,12 +86,13 @@ void AudioRendererImpl::Flush(const base::Closure& callback) { void AudioRendererImpl::Stop(const base::Closure& callback) { DCHECK(!callback.is_null()); - if (!stopped_) { - sink_->Stop(); - stopped_ = true; - } { base::AutoLock auto_lock(lock_); + if (!stopped_) { + sink_->Stop(); + stopped_ = true; + } + state_ = kStopped; algorithm_.reset(NULL); init_cb_.Reset(); |