summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-26 19:34:42 +0000
committerdalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-26 19:34:42 +0000
commita59f4517cd705f75bc46f5781527f96599734a6d (patch)
treeb76e4f067b0a76051abcde9d552b14bde7100435
parentdfa88de61f938f26f5adfffb5928ba8e4a17ed8a (diff)
downloadchromium_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.cc14
-rw-r--r--media/base/audio_renderer_mixer_input.h1
-rw-r--r--media/base/audio_renderer_mixer_input_unittest.cc20
-rw-r--r--media/base/audio_renderer_mixer_unittest.cc2
-rw-r--r--media/filters/audio_renderer_impl.cc9
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();