Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/audio_low_latency_input_win.h" | 5 #include "media/audio/win/audio_low_latency_input_win.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "media/audio/audio_util.h" | 10 #include "media/audio/audio_util.h" |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 177 sink_ = NULL; | 177 sink_ = NULL; |
| 178 } | 178 } |
| 179 | 179 |
| 180 // Inform the audio manager that we have been closed. This will cause our | 180 // Inform the audio manager that we have been closed. This will cause our |
| 181 // destruction. | 181 // destruction. |
| 182 manager_->ReleaseInputStream(this); | 182 manager_->ReleaseInputStream(this); |
| 183 } | 183 } |
| 184 | 184 |
| 185 // static | 185 // static |
| 186 double WASAPIAudioInputStream::HardwareSampleRate(ERole device_role) { | 186 double WASAPIAudioInputStream::HardwareSampleRate(ERole device_role) { |
| 187 base::win::ScopedCoMem<WAVEFORMATEX> audio_engine_mix_format; | |
| 188 HRESULT hr = GetMixFormat(device_role, &audio_engine_mix_format); | |
| 189 if (FAILED(hr)) { | |
| 190 NOTREACHED() << "error code: " << hr; | |
| 191 return 0.0; | |
| 192 } | |
| 193 | |
| 194 return static_cast<double>(audio_engine_mix_format->nSamplesPerSec); | |
| 195 } | |
| 196 | |
| 197 // static | |
| 198 size_t WASAPIAudioInputStream::HardwareChannels(ERole device_role) { | |
| 199 base::win::ScopedCoMem<WAVEFORMATEX> audio_engine_mix_format; | |
| 200 HRESULT hr = GetMixFormat(device_role, &audio_engine_mix_format); | |
| 201 if (FAILED(hr)) { | |
| 202 NOTREACHED() << "error code: " << hr; | |
| 203 return CHANNEL_LAYOUT_NONE; | |
| 204 } | |
| 205 | |
| 206 return audio_engine_mix_format->nChannels; | |
| 207 } | |
| 208 | |
| 209 // static | |
| 210 HRESULT WASAPIAudioInputStream::GetMixFormat(ERole device_role, | |
| 211 WAVEFORMATEX** device_format) { | |
| 187 // It is assumed that this static method is called from a COM thread, i.e., | 212 // It is assumed that this static method is called from a COM thread, i.e., |
| 188 // CoInitializeEx() is not called here to avoid STA/MTA conflicts. | 213 // CoInitializeEx() is not called here to avoid STA/MTA conflicts. |
| 189 ScopedComPtr<IMMDeviceEnumerator> enumerator; | 214 ScopedComPtr<IMMDeviceEnumerator> enumerator; |
| 190 HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), | 215 HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), |
| 191 NULL, | 216 NULL, |
| 192 CLSCTX_INPROC_SERVER, | 217 CLSCTX_INPROC_SERVER, |
| 193 __uuidof(IMMDeviceEnumerator), | 218 __uuidof(IMMDeviceEnumerator), |
| 194 enumerator.ReceiveVoid()); | 219 enumerator.ReceiveVoid()); |
| 195 if (FAILED(hr)) { | 220 if (FAILED(hr)) { |
|
tommi (sloooow) - chröme
2012/01/17 12:01:08
nit: remove {}
henrika (OOO until Aug 14)
2012/01/17 12:54:59
Done.
| |
| 196 NOTREACHED() << "error code: " << hr; | 221 return hr; |
| 197 return 0.0; | |
| 198 } | 222 } |
| 199 | 223 |
| 200 ScopedComPtr<IMMDevice> endpoint_device; | 224 ScopedComPtr<IMMDevice> endpoint_device; |
| 201 hr = enumerator->GetDefaultAudioEndpoint(eCapture, | 225 hr = enumerator->GetDefaultAudioEndpoint(eCapture, |
| 202 device_role, | 226 device_role, |
| 203 endpoint_device.Receive()); | 227 endpoint_device.Receive()); |
| 204 if (FAILED(hr)) { | 228 if (FAILED(hr)) { |
| 205 // This will happen if there's no audio capture device found or available | 229 // This will happen if there's no audio capture device found or available |
| 206 // (e.g. some audio cards that have inputs will still report them as | 230 // (e.g. some audio cards that have inputs will still report them as |
| 207 // "not found" when no mic is plugged into the input jack). | 231 // "not found" when no mic is plugged into the input jack). |
| 208 LOG(WARNING) << "No audio end point: " << std::hex << hr; | 232 LOG(WARNING) << "No audio end point: " << std::hex << hr; |
| 209 return 0.0; | 233 return hr; |
| 210 } | 234 } |
| 211 | 235 |
| 212 ScopedComPtr<IAudioClient> audio_client; | 236 ScopedComPtr<IAudioClient> audio_client; |
| 213 hr = endpoint_device->Activate(__uuidof(IAudioClient), | 237 hr = endpoint_device->Activate(__uuidof(IAudioClient), |
| 214 CLSCTX_INPROC_SERVER, | 238 CLSCTX_INPROC_SERVER, |
| 215 NULL, | 239 NULL, |
| 216 audio_client.ReceiveVoid()); | 240 audio_client.ReceiveVoid()); |
| 217 if (FAILED(hr)) { | 241 if (SUCCEEDED(hr)) |
| 218 NOTREACHED() << "error code: " << hr; | 242 hr = audio_client->GetMixFormat(device_format); |
| 219 return 0.0; | |
| 220 } | |
| 221 | 243 |
| 222 base::win::ScopedCoMem<WAVEFORMATEX> audio_engine_mix_format; | 244 return hr; |
| 223 hr = audio_client->GetMixFormat(&audio_engine_mix_format); | |
| 224 if (FAILED(hr)) { | |
| 225 NOTREACHED() << "error code: " << hr; | |
| 226 return 0.0; | |
| 227 } | |
| 228 | |
| 229 return static_cast<double>(audio_engine_mix_format->nSamplesPerSec); | |
| 230 } | 245 } |
| 231 | 246 |
| 232 void WASAPIAudioInputStream::Run() { | 247 void WASAPIAudioInputStream::Run() { |
| 233 ScopedCOMInitializer com_init(ScopedCOMInitializer::kMTA); | 248 ScopedCOMInitializer com_init(ScopedCOMInitializer::kMTA); |
| 234 | 249 |
| 235 // Increase the thread priority. | 250 // Increase the thread priority. |
| 236 capture_thread_->SetThreadPriority(base::kThreadPriority_RealtimeAudio); | 251 capture_thread_->SetThreadPriority(base::kThreadPriority_RealtimeAudio); |
| 237 | 252 |
| 238 // Enable MMCSS to ensure that this thread receives prioritized access to | 253 // Enable MMCSS to ensure that this thread receives prioritized access to |
| 239 // CPU resources. | 254 // CPU resources. |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 513 hr = audio_client_->SetEventHandle(audio_samples_ready_event_.Get()); | 528 hr = audio_client_->SetEventHandle(audio_samples_ready_event_.Get()); |
| 514 if (FAILED(hr)) | 529 if (FAILED(hr)) |
| 515 return hr; | 530 return hr; |
| 516 | 531 |
| 517 // Get access to the IAudioCaptureClient interface. This interface | 532 // Get access to the IAudioCaptureClient interface. This interface |
| 518 // enables us to read input data from the capture endpoint buffer. | 533 // enables us to read input data from the capture endpoint buffer. |
| 519 hr = audio_client_->GetService(__uuidof(IAudioCaptureClient), | 534 hr = audio_client_->GetService(__uuidof(IAudioCaptureClient), |
| 520 audio_capture_client_.ReceiveVoid()); | 535 audio_capture_client_.ReceiveVoid()); |
| 521 return hr; | 536 return hr; |
| 522 } | 537 } |
| OLD | NEW |