OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #pragma comment(lib, "winmm.lib") | 7 #pragma comment(lib, "winmm.lib") |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "media/audio/audio_io.h" | 10 #include "media/audio/audio_io.h" |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 QueueNextPacket(buffer); | 126 QueueNextPacket(buffer); |
127 buffer = GetNextBuffer(buffer); | 127 buffer = GetNextBuffer(buffer); |
128 } | 128 } |
129 buffer = buffer_; | 129 buffer = buffer_; |
130 | 130 |
131 MMRESULT result = ::waveInStart(wavein_); | 131 MMRESULT result = ::waveInStart(wavein_); |
132 if (result != MMSYSERR_NOERROR) { | 132 if (result != MMSYSERR_NOERROR) { |
133 HandleError(result); | 133 HandleError(result); |
134 state_ = kStateReady; | 134 state_ = kStateReady; |
135 callback_ = NULL; | 135 callback_ = NULL; |
136 } else { | |
137 manager_->IncreaseActiveInputStreamCount(); | |
138 } | 136 } |
139 } | 137 } |
140 | 138 |
141 // Stopping is tricky. First, no buffer should be locked by the audio driver | 139 // Stopping is tricky. First, no buffer should be locked by the audio driver |
142 // or else the waveInReset() will deadlock and secondly, the callback should | 140 // or else the waveInReset() will deadlock and secondly, the callback should |
143 // not be inside the AudioInputCallback's OnData because waveInReset() | 141 // not be inside the AudioInputCallback's OnData because waveInReset() |
144 // forcefully kills the callback thread. | 142 // forcefully kills the callback thread. |
145 void PCMWaveInAudioInputStream::Stop() { | 143 void PCMWaveInAudioInputStream::Stop() { |
146 DVLOG(1) << "PCMWaveInAudioInputStream::Stop()"; | 144 DVLOG(1) << "PCMWaveInAudioInputStream::Stop()"; |
147 DCHECK(thread_checker_.CalledOnValidThread()); | 145 DCHECK(thread_checker_.CalledOnValidThread()); |
(...skipping 15 matching lines...) Expand all Loading... |
163 // Wait for the callback to finish, it will signal us when ready to be reset. | 161 // Wait for the callback to finish, it will signal us when ready to be reset. |
164 DWORD wait = ::WaitForSingleObject(stopped_event_, INFINITE); | 162 DWORD wait = ::WaitForSingleObject(stopped_event_, INFINITE); |
165 DCHECK_EQ(wait, WAIT_OBJECT_0); | 163 DCHECK_EQ(wait, WAIT_OBJECT_0); |
166 | 164 |
167 // Stop input and reset the current position to zero for |wavein_|. | 165 // Stop input and reset the current position to zero for |wavein_|. |
168 // All pending buffers are marked as done and returned to the application. | 166 // All pending buffers are marked as done and returned to the application. |
169 MMRESULT res = ::waveInReset(wavein_); | 167 MMRESULT res = ::waveInReset(wavein_); |
170 DCHECK_EQ(res, static_cast<MMRESULT>(MMSYSERR_NOERROR)); | 168 DCHECK_EQ(res, static_cast<MMRESULT>(MMSYSERR_NOERROR)); |
171 | 169 |
172 state_ = kStateReady; | 170 state_ = kStateReady; |
173 manager_->DecreaseActiveInputStreamCount(); | |
174 } | 171 } |
175 | 172 |
176 void PCMWaveInAudioInputStream::Close() { | 173 void PCMWaveInAudioInputStream::Close() { |
177 DVLOG(1) << "PCMWaveInAudioInputStream::Close()"; | 174 DVLOG(1) << "PCMWaveInAudioInputStream::Close()"; |
178 DCHECK(thread_checker_.CalledOnValidThread()); | 175 DCHECK(thread_checker_.CalledOnValidThread()); |
179 | 176 |
180 // We should not call Close() while recording. Catch it with DCHECK and | 177 // We should not call Close() while recording. Catch it with DCHECK and |
181 // implement auto-stop just in case. | 178 // implement auto-stop just in case. |
182 DCHECK_NE(state_, kStateRecording); | 179 DCHECK_NE(state_, kStateRecording); |
183 Stop(); | 180 Stop(); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 ::SetEvent(obj->stopped_event_); | 307 ::SetEvent(obj->stopped_event_); |
311 } | 308 } |
312 } else if (msg == WIM_CLOSE) { | 309 } else if (msg == WIM_CLOSE) { |
313 // Intentionaly no-op for now. | 310 // Intentionaly no-op for now. |
314 } else if (msg == WIM_OPEN) { | 311 } else if (msg == WIM_OPEN) { |
315 // Intentionaly no-op for now. | 312 // Intentionaly no-op for now. |
316 } | 313 } |
317 } | 314 } |
318 | 315 |
319 } // namespace media | 316 } // namespace media |
OLD | NEW |