summaryrefslogtreecommitdiffstats
path: root/media/audio/audio_input_controller.cc
diff options
context:
space:
mode:
authorallanwoj@chromium.org <allanwoj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-15 16:02:58 +0000
committerallanwoj@chromium.org <allanwoj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-15 16:02:58 +0000
commit823a51b179f3bb00f3833f6ab438064ee0b64572 (patch)
tree4ab7b8e9d8384b60d6fe89ba7c32dd4d5c90da01 /media/audio/audio_input_controller.cc
parent24e7135c10bc62da05ab6c243eb433dcff45a9d2 (diff)
downloadchromium_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.cc28
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);