Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Side by Side Diff: media/audio/win/wavein_input_win.cc

Issue 7129057: Fix bug when unplugging an audio input device whilst using speech input. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Whitespace Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/audio/win/wavein_input_win.h" 5 #include "media/audio/win/wavein_input_win.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 #include <mmsystem.h> 8 #include <mmsystem.h>
9 #pragma comment(lib, "winmm.lib") 9 #pragma comment(lib, "winmm.lib")
10 10
11 #include "base/basictypes.h" 11 #include "base/basictypes.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "media/audio/audio_io.h" 13 #include "media/audio/audio_io.h"
14 #include "media/audio/audio_util.h" 14 #include "media/audio/audio_util.h"
15 #include "media/audio/win/audio_manager_win.h" 15 #include "media/audio/win/audio_manager_win.h"
16 16
17 namespace {
18 const int kCallbackTimeout = 1000; // One second.
Satish 2011/06/14 14:28:04 rename to kStopInputStreamCallbackTimeout to be mo
allanwoj 2011/06/14 15:03:12 Done.
19 }
20
17 // Our sound buffers are allocated once and kept in a linked list using the 21 // Our sound buffers are allocated once and kept in a linked list using the
18 // the WAVEHDR::dwUser variable. The last buffer points to the first buffer. 22 // the WAVEHDR::dwUser variable. The last buffer points to the first buffer.
19 static WAVEHDR* GetNextBuffer(WAVEHDR* current) { 23 static WAVEHDR* GetNextBuffer(WAVEHDR* current) {
20 return reinterpret_cast<WAVEHDR*>(current->dwUser); 24 return reinterpret_cast<WAVEHDR*>(current->dwUser);
21 } 25 }
22 26
23 PCMWaveInAudioInputStream::PCMWaveInAudioInputStream( 27 PCMWaveInAudioInputStream::PCMWaveInAudioInputStream(
24 AudioManagerWin* manager, AudioParameters params, int num_buffers, 28 AudioManagerWin* manager, AudioParameters params, int num_buffers,
25 UINT device_id) 29 UINT device_id)
26 : state_(kStateEmpty), 30 : state_(kStateEmpty),
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 127
124 // Stopping is tricky. First, no buffer should be locked by the audio driver 128 // Stopping is tricky. First, no buffer should be locked by the audio driver
125 // or else the waveInReset() will deadlock and secondly, the callback should 129 // or else the waveInReset() will deadlock and secondly, the callback should
126 // not be inside the AudioInputCallback's OnData because waveInReset() 130 // not be inside the AudioInputCallback's OnData because waveInReset()
127 // forcefully kills the callback thread. 131 // forcefully kills the callback thread.
128 void PCMWaveInAudioInputStream::Stop() { 132 void PCMWaveInAudioInputStream::Stop() {
129 if (state_ != kStateRecording) 133 if (state_ != kStateRecording)
130 return; 134 return;
131 state_ = kStateStopping; 135 state_ = kStateStopping;
132 // Wait for the callback to finish, it will signal us when ready to be reset. 136 // Wait for the callback to finish, it will signal us when ready to be reset.
133 if (WAIT_OBJECT_0 != ::WaitForSingleObject(stopped_event_, INFINITE)) { 137 if (WAIT_OBJECT_0 !=
138 ::WaitForSingleObject(stopped_event_, kCallbackTimeout)) {
134 HandleError(::GetLastError()); 139 HandleError(::GetLastError());
135 return; 140 return;
136 } 141 }
137 state_ = kStateStopped; 142 state_ = kStateStopped;
138 MMRESULT res = ::waveInReset(wavein_); 143 MMRESULT res = ::waveInReset(wavein_);
139 if (res != MMSYSERR_NOERROR) { 144 if (res != MMSYSERR_NOERROR) {
140 state_ = kStateRecording; 145 state_ = kStateRecording;
141 HandleError(res); 146 HandleError(res);
142 return; 147 return;
143 } 148 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 // waveInPrepareHeader. 208 // waveInPrepareHeader.
204 obj->QueueNextPacket(buffer); 209 obj->QueueNextPacket(buffer);
205 } 210 }
206 } else if (msg == WIM_CLOSE) { 211 } else if (msg == WIM_CLOSE) {
207 // We can be closed before calling Start, so it is possible to have a 212 // We can be closed before calling Start, so it is possible to have a
208 // null callback at this point. 213 // null callback at this point.
209 if (obj->callback_) 214 if (obj->callback_)
210 obj->callback_->OnClose(obj); 215 obj->callback_->OnClose(obj);
211 } 216 }
212 } 217 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698