| 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/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 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 DCHECK(callback); | 120 DCHECK(callback); |
| 121 DLOG_IF(ERROR, !opened_) << "Open() has not been called successfully"; | 121 DLOG_IF(ERROR, !opened_) << "Open() has not been called successfully"; |
| 122 if (!opened_) | 122 if (!opened_) |
| 123 return; | 123 return; |
| 124 | 124 |
| 125 if (started_) | 125 if (started_) |
| 126 return; | 126 return; |
| 127 | 127 |
| 128 sink_ = callback; | 128 sink_ = callback; |
| 129 | 129 |
| 130 // Starts periodic AGC microphone measurements if the AGC has been enabled |
| 131 // using SetAutomaticGainControl(). |
| 132 StartAgc(); |
| 133 |
| 130 // Create and start the thread that will drive the capturing by waiting for | 134 // Create and start the thread that will drive the capturing by waiting for |
| 131 // capture events. | 135 // capture events. |
| 132 capture_thread_ = | 136 capture_thread_ = |
| 133 new base::DelegateSimpleThread(this, "wasapi_capture_thread"); | 137 new base::DelegateSimpleThread(this, "wasapi_capture_thread"); |
| 134 capture_thread_->Start(); | 138 capture_thread_->Start(); |
| 135 | 139 |
| 136 // Start streaming data between the endpoint buffer and the audio engine. | 140 // Start streaming data between the endpoint buffer and the audio engine. |
| 137 HRESULT hr = audio_client_->Start(); | 141 HRESULT hr = audio_client_->Start(); |
| 138 DLOG_IF(ERROR, FAILED(hr)) << "Failed to start input streaming."; | 142 DLOG_IF(ERROR, FAILED(hr)) << "Failed to start input streaming."; |
| 139 | 143 |
| 140 started_ = SUCCEEDED(hr); | 144 started_ = SUCCEEDED(hr); |
| 141 } | 145 } |
| 142 | 146 |
| 143 void WASAPIAudioInputStream::Stop() { | 147 void WASAPIAudioInputStream::Stop() { |
| 144 DCHECK(CalledOnValidThread()); | 148 DCHECK(CalledOnValidThread()); |
| 145 DVLOG(1) << "WASAPIAudioInputStream::Stop()"; | 149 DVLOG(1) << "WASAPIAudioInputStream::Stop()"; |
| 146 if (!started_) | 150 if (!started_) |
| 147 return; | 151 return; |
| 148 | 152 |
| 153 // Stops periodic AGC microphone measurements. |
| 154 StopAgc(); |
| 155 |
| 149 // Shut down the capture thread. | 156 // Shut down the capture thread. |
| 150 if (stop_capture_event_.IsValid()) { | 157 if (stop_capture_event_.IsValid()) { |
| 151 SetEvent(stop_capture_event_.Get()); | 158 SetEvent(stop_capture_event_.Get()); |
| 152 } | 159 } |
| 153 | 160 |
| 154 // Stop the input audio streaming. | 161 // Stop the input audio streaming. |
| 155 HRESULT hr = audio_client_->Stop(); | 162 HRESULT hr = audio_client_->Stop(); |
| 156 if (FAILED(hr)) { | 163 if (FAILED(hr)) { |
| 157 LOG(ERROR) << "Failed to stop input streaming."; | 164 LOG(ERROR) << "Failed to stop input streaming."; |
| 158 } | 165 } |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 // Derive a delay estimate for the captured audio packet. | 387 // Derive a delay estimate for the captured audio packet. |
| 381 // The value contains two parts (A+B), where A is the delay of the | 388 // The value contains two parts (A+B), where A is the delay of the |
| 382 // first audio frame in the packet and B is the extra delay | 389 // first audio frame in the packet and B is the extra delay |
| 383 // contained in any stored data. Unit is in audio frames. | 390 // contained in any stored data. Unit is in audio frames. |
| 384 QueryPerformanceCounter(&now_count); | 391 QueryPerformanceCounter(&now_count); |
| 385 double audio_delay_frames = | 392 double audio_delay_frames = |
| 386 ((perf_count_to_100ns_units_ * now_count.QuadPart - | 393 ((perf_count_to_100ns_units_ * now_count.QuadPart - |
| 387 first_audio_frame_timestamp) / 10000.0) * ms_to_frame_count_ + | 394 first_audio_frame_timestamp) / 10000.0) * ms_to_frame_count_ + |
| 388 buffer_frame_index - num_frames_to_read; | 395 buffer_frame_index - num_frames_to_read; |
| 389 | 396 |
| 390 // Update the AGC volume level once every second. Note that, | 397 // Get a cached AGC volume level which is updated once every second |
| 391 // |volume| is also updated each time SetVolume() is called | 398 // on the audio manager thread. Note that, |volume| is also updated |
| 392 // through IPC by the render-side AGC. | 399 // each time SetVolume() is called through IPC by the render-side AGC. |
| 393 QueryAgcVolume(&volume); | 400 GetAgcVolume(&volume); |
| 394 | 401 |
| 395 // Deliver captured data to the registered consumer using a packet | 402 // Deliver captured data to the registered consumer using a packet |
| 396 // size which was specified at construction. | 403 // size which was specified at construction. |
| 397 uint32 delay_frames = static_cast<uint32>(audio_delay_frames + 0.5); | 404 uint32 delay_frames = static_cast<uint32>(audio_delay_frames + 0.5); |
| 398 while (buffer_frame_index >= packet_size_frames_) { | 405 while (buffer_frame_index >= packet_size_frames_) { |
| 399 uint8* audio_data = | 406 uint8* audio_data = |
| 400 reinterpret_cast<uint8*>(capture_buffer.get()); | 407 reinterpret_cast<uint8*>(capture_buffer.get()); |
| 401 | 408 |
| 402 // Deliver data packet, delay estimation and volume level to | 409 // Deliver data packet, delay estimation and volume level to |
| 403 // the user. | 410 // the user. |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 625 return hr; | 632 return hr; |
| 626 | 633 |
| 627 // Obtain a reference to the ISimpleAudioVolume interface which enables | 634 // Obtain a reference to the ISimpleAudioVolume interface which enables |
| 628 // us to control the master volume level of an audio session. | 635 // us to control the master volume level of an audio session. |
| 629 hr = audio_client_->GetService(__uuidof(ISimpleAudioVolume), | 636 hr = audio_client_->GetService(__uuidof(ISimpleAudioVolume), |
| 630 simple_audio_volume_.ReceiveVoid()); | 637 simple_audio_volume_.ReceiveVoid()); |
| 631 return hr; | 638 return hr; |
| 632 } | 639 } |
| 633 | 640 |
| 634 } // namespace media | 641 } // namespace media |
| OLD | NEW |