summaryrefslogtreecommitdiffstats
path: root/media/audio
diff options
context:
space:
mode:
authordalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-08 02:27:31 +0000
committerdalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-08 02:27:31 +0000
commit2f1eda0062b1c8927a470fc787b7ab9e992ec60b (patch)
tree5e5d83fb444042a1cc797bdee1ab98d9ed4e1230 /media/audio
parentc241b463d6b3015226e182db2c524f891e7525ca (diff)
downloadchromium_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.cc6
-rw-r--r--media/audio/audio_output_proxy_unittest.cc12
-rw-r--r--media/audio/audio_output_resampler.cc6
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,