diff options
author | dalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-08 02:27:31 +0000 |
---|---|---|
committer | dalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-08 02:27:31 +0000 |
commit | 2f1eda0062b1c8927a470fc787b7ab9e992ec60b (patch) | |
tree | 5e5d83fb444042a1cc797bdee1ab98d9ed4e1230 /media/audio | |
parent | c241b463d6b3015226e182db2c524f891e7525ca (diff) | |
download | chromium_src-2f1eda0062b1c8927a470fc787b7ab9e992ec60b.zip chromium_src-2f1eda0062b1c8927a470fc787b7ab9e992ec60b.tar.gz chromium_src-2f1eda0062b1c8927a470fc787b7ab9e992ec60b.tar.bz2 |
Stop OnMoreDataConverter during StartStream() failure.
On StartStream() failure we will never get a Stop() call, so we end
up with an OnMoreDataConverter left in the started state. There was
a test for this, but a typo caused it to never run for
AudioOutputResampler :-/
BUG=179986
TEST=media_unittests
Review URL: https://codereview.chromium.org/12544014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@186855 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio')
-rw-r--r-- | media/audio/audio_output_proxy.cc | 6 | ||||
-rw-r--r-- | media/audio/audio_output_proxy_unittest.cc | 12 | ||||
-rw-r--r-- | media/audio/audio_output_resampler.cc | 6 |
3 files changed, 19 insertions, 5 deletions
diff --git a/media/audio/audio_output_proxy.cc b/media/audio/audio_output_proxy.cc index 3609079..b3818e6 100644 --- a/media/audio/audio_output_proxy.cc +++ b/media/audio/audio_output_proxy.cc @@ -37,7 +37,11 @@ bool AudioOutputProxy::Open() { void AudioOutputProxy::Start(AudioSourceCallback* callback) { DCHECK(CalledOnValidThread()); - DCHECK_EQ(state_, kOpened); + + // We need to support both states since the callback may not handle OnError() + // immediately (or at all). It's also possible for subsequent StartStream() + // calls to succeed after failing, so we allow it to be called again. + DCHECK(state_ == kOpened || state_ == kStartError); if (!dispatcher_->StartStream(callback, this)) { state_ = kStartError; diff --git a/media/audio/audio_output_proxy_unittest.cc b/media/audio/audio_output_proxy_unittest.cc index 6c4870a..eeb6c44 100644 --- a/media/audio/audio_output_proxy_unittest.cc +++ b/media/audio/audio_output_proxy_unittest.cc @@ -415,7 +415,7 @@ class AudioOutputProxyTest : public testing::Test { EXPECT_CALL(stream, Close()) .Times(1); - AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher_impl_); + AudioOutputProxy* proxy = new AudioOutputProxy(dispatcher); EXPECT_TRUE(proxy->Open()); // Simulate a delay. @@ -428,13 +428,19 @@ class AudioOutputProxyTest : public testing::Test { // |stream| is closed at this point. Start() should reopen it again. EXPECT_CALL(manager(), MakeAudioOutputStream(_)) - .WillOnce(Return(reinterpret_cast<AudioOutputStream*>(NULL))); + .Times(2) + .WillRepeatedly(Return(reinterpret_cast<AudioOutputStream*>(NULL))); EXPECT_CALL(callback_, OnError(_, _)) - .Times(1); + .Times(2); proxy->Start(&callback_); + // Double Start() in the error case should be allowed since it's possible a + // callback may not have had time to process the OnError() in between. + proxy->Stop(); + proxy->Start(&callback_); + Mock::VerifyAndClear(&callback_); proxy->Close(); diff --git a/media/audio/audio_output_resampler.cc b/media/audio/audio_output_resampler.cc index d681af0..9993096 100644 --- a/media/audio/audio_output_resampler.cc +++ b/media/audio/audio_output_resampler.cc @@ -245,8 +245,12 @@ bool AudioOutputResampler::StartStream( } else { resampler_callback = it->second; } + resampler_callback->Start(callback); - return dispatcher_->StartStream(resampler_callback, stream_proxy); + bool result = dispatcher_->StartStream(resampler_callback, stream_proxy); + if (!result) + resampler_callback->Stop(); + return result; } void AudioOutputResampler::StreamVolumeSet(AudioOutputProxy* stream_proxy, |