diff options
author | allanwoj@chromium.org <allanwoj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-15 16:02:58 +0000 |
---|---|---|
committer | allanwoj@chromium.org <allanwoj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-15 16:02:58 +0000 |
commit | 823a51b179f3bb00f3833f6ab438064ee0b64572 (patch) | |
tree | 4ab7b8e9d8384b60d6fe89ba7c32dd4d5c90da01 /media/audio/audio_input_controller.cc | |
parent | 24e7135c10bc62da05ab6c243eb433dcff45a9d2 (diff) | |
download | chromium_src-823a51b179f3bb00f3833f6ab438064ee0b64572.zip chromium_src-823a51b179f3bb00f3833f6ab438064ee0b64572.tar.gz chromium_src-823a51b179f3bb00f3833f6ab438064ee0b64572.tar.bz2 |
Fix bug when unplugging an audio input device whilst using speech input on Windows.
Added a three second timeout for not receiving an OnData callback in AudioInputController and a one second timeout for not receiving any callback in PCMWaveInAudioInputStream. Also added a unit test fixture for it.
BUG=79936
TEST=Unplug microphone while using speech input, browser should no longer hang.
Review URL: http://codereview.chromium.org/7129057
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@89197 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio/audio_input_controller.cc')
-rw-r--r-- | media/audio/audio_input_controller.cc | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/media/audio/audio_input_controller.cc b/media/audio/audio_input_controller.cc index 311a54e..a8209f5 100644 --- a/media/audio/audio_input_controller.cc +++ b/media/audio/audio_input_controller.cc @@ -7,9 +7,12 @@ #include "base/threading/thread_restrictions.h" #include "media/base/limits.h" -namespace media { +namespace { +const int kMaxInputChannels = 2; +const int kTimerResetInterval = 1; // One second. +} -static const int kMaxInputChannels = 2; +namespace media { // static AudioInputController::Factory* AudioInputController::factory_ = NULL; @@ -18,6 +21,10 @@ AudioInputController::AudioInputController(EventHandler* handler, SyncWriter* sync_writer) : handler_(handler), stream_(NULL), + ALLOW_THIS_IN_INITIALIZER_LIST(no_data_timer_( + base::TimeDelta::FromSeconds(kTimerResetInterval), + this, + &AudioInputController::DoReportNoDataError)), state_(kEmpty), thread_("AudioInputControllerThread"), sync_writer_(sync_writer) { @@ -123,6 +130,9 @@ void AudioInputController::DoCreate(AudioParameters params) { return; } + thread_.message_loop()->PostTask( + FROM_HERE, + NewRunnableMethod(this, &AudioInputController::DoResetNoDataTimer)); state_ = kCreated; handler_->OnCreated(this); } @@ -168,6 +178,16 @@ void AudioInputController::DoReportError(int code) { handler_->OnError(this, code); } +void AudioInputController::DoReportNoDataError() { + DCHECK_EQ(thread_.message_loop(), MessageLoop::current()); + handler_->OnError(this, 0); +} + +void AudioInputController::DoResetNoDataTimer() { + DCHECK_EQ(thread_.message_loop(), MessageLoop::current()); + no_data_timer_.Reset(); +} + void AudioInputController::OnData(AudioInputStream* stream, const uint8* data, uint32 size) { { @@ -176,6 +196,10 @@ void AudioInputController::OnData(AudioInputStream* stream, const uint8* data, return; } + thread_.message_loop()->PostTask( + FROM_HERE, + NewRunnableMethod(this, &AudioInputController::DoResetNoDataTimer)); + // Use SyncSocket if we are in a low-latency mode. if (LowLatencyMode()) { sync_writer_->Write(data, size); |