| 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/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "media/audio/win/audio_manager_win.h" | 10 #include "media/audio/win/audio_manager_win.h" |
| 11 #include "media/audio/win/avrt_wrapper_win.h" | 11 #include "media/audio/win/avrt_wrapper_win.h" |
| 12 #include "media/base/audio_bus.h" | |
| 13 | 12 |
| 14 using base::win::ScopedComPtr; | 13 using base::win::ScopedComPtr; |
| 15 using base::win::ScopedCOMInitializer; | 14 using base::win::ScopedCOMInitializer; |
| 16 | 15 |
| 17 namespace media { | 16 namespace media { |
| 18 namespace { | 17 namespace { |
| 19 | 18 |
| 20 // Returns true if |device| represents the default communication capture device. | 19 // Returns true if |device| represents the default communication capture device. |
| 21 bool IsDefaultCommunicationDevice(IMMDeviceEnumerator* enumerator, | 20 bool IsDefaultCommunicationDevice(IMMDeviceEnumerator* enumerator, |
| 22 IMMDevice* device) { | 21 IMMDevice* device) { |
| 23 ScopedComPtr<IMMDevice> communications; | 22 ScopedComPtr<IMMDevice> communications; |
| 24 if (FAILED(enumerator->GetDefaultAudioEndpoint(eCapture, eCommunications, | 23 if (FAILED(enumerator->GetDefaultAudioEndpoint(eCapture, eCommunications, |
| 25 communications.Receive()))) { | 24 communications.Receive()))) { |
| 26 return false; | 25 return false; |
| 27 } | 26 } |
| 28 | 27 |
| 29 base::win::ScopedCoMem<WCHAR> communications_id, device_id; | 28 base::win::ScopedCoMem<WCHAR> communications_id, device_id; |
| 30 device->GetId(&device_id); | 29 device->GetId(&device_id); |
| 31 communications->GetId(&communications_id); | 30 communications->GetId(&communications_id); |
| 32 return lstrcmpW(communications_id, device_id) == 0; | 31 return lstrcmpW(communications_id, device_id) == 0; |
| 33 } | 32 } |
| 34 | 33 |
| 35 } // namespace | 34 } // namespace |
| 36 | 35 |
| 37 WASAPIAudioInputStream::WASAPIAudioInputStream(AudioManagerWin* manager, | 36 WASAPIAudioInputStream::WASAPIAudioInputStream( |
| 38 const AudioParameters& params, | 37 AudioManagerWin* manager, |
| 39 const std::string& device_id) | 38 const AudioParameters& params, |
| 39 const std::string& device_id) |
| 40 : manager_(manager), | 40 : manager_(manager), |
| 41 capture_thread_(NULL), | 41 capture_thread_(NULL), |
| 42 opened_(false), | 42 opened_(false), |
| 43 started_(false), | 43 started_(false), |
| 44 frame_size_(0), | 44 frame_size_(0), |
| 45 packet_size_frames_(0), | 45 packet_size_frames_(0), |
| 46 packet_size_bytes_(0), | 46 packet_size_bytes_(0), |
| 47 endpoint_buffer_size_frames_(0), | 47 endpoint_buffer_size_frames_(0), |
| 48 effects_(params.effects()), | 48 effects_(params.effects()), |
| 49 device_id_(device_id), | 49 device_id_(device_id), |
| 50 perf_count_to_100ns_units_(0.0), | 50 perf_count_to_100ns_units_(0.0), |
| 51 ms_to_frame_count_(0.0), | 51 ms_to_frame_count_(0.0), |
| 52 sink_(NULL), | 52 sink_(NULL) { |
| 53 audio_bus_(media::AudioBus::Create(params)) { | |
| 54 DCHECK(manager_); | 53 DCHECK(manager_); |
| 55 | 54 |
| 56 // Load the Avrt DLL if not already loaded. Required to support MMCSS. | 55 // Load the Avrt DLL if not already loaded. Required to support MMCSS. |
| 57 bool avrt_init = avrt::Initialize(); | 56 bool avrt_init = avrt::Initialize(); |
| 58 DCHECK(avrt_init) << "Failed to load the Avrt.dll"; | 57 DCHECK(avrt_init) << "Failed to load the Avrt.dll"; |
| 59 | 58 |
| 60 // Set up the desired capture format specified by the client. | 59 // Set up the desired capture format specified by the client. |
| 61 format_.nSamplesPerSec = params.sample_rate(); | 60 format_.nSamplesPerSec = params.sample_rate(); |
| 62 format_.wFormatTag = WAVE_FORMAT_PCM; | 61 format_.wFormatTag = WAVE_FORMAT_PCM; |
| 63 format_.wBitsPerSample = params.bits_per_sample(); | 62 format_.wBitsPerSample = params.bits_per_sample(); |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 | 429 |
| 431 // Get a cached AGC volume level which is updated once every second | 430 // Get a cached AGC volume level which is updated once every second |
| 432 // on the audio manager thread. Note that, |volume| is also updated | 431 // on the audio manager thread. Note that, |volume| is also updated |
| 433 // each time SetVolume() is called through IPC by the render-side AGC. | 432 // each time SetVolume() is called through IPC by the render-side AGC. |
| 434 GetAgcVolume(&volume); | 433 GetAgcVolume(&volume); |
| 435 | 434 |
| 436 // Deliver captured data to the registered consumer using a packet | 435 // Deliver captured data to the registered consumer using a packet |
| 437 // size which was specified at construction. | 436 // size which was specified at construction. |
| 438 uint32 delay_frames = static_cast<uint32>(audio_delay_frames + 0.5); | 437 uint32 delay_frames = static_cast<uint32>(audio_delay_frames + 0.5); |
| 439 while (buffer_frame_index >= packet_size_frames_) { | 438 while (buffer_frame_index >= packet_size_frames_) { |
| 440 // Copy data to audio bus to match the OnData interface. | 439 uint8* audio_data = |
| 441 uint8* audio_data = reinterpret_cast<uint8*>(capture_buffer.get()); | 440 reinterpret_cast<uint8*>(capture_buffer.get()); |
| 442 audio_bus_->FromInterleaved( | |
| 443 audio_data, audio_bus_->frames(), format_.wBitsPerSample / 8); | |
| 444 | 441 |
| 445 // Deliver data packet, delay estimation and volume level to | 442 // Deliver data packet, delay estimation and volume level to |
| 446 // the user. | 443 // the user. |
| 447 sink_->OnData( | 444 sink_->OnData(this, |
| 448 this, audio_bus_.get(), delay_frames * frame_size_, volume); | 445 audio_data, |
| 446 packet_size_bytes_, |
| 447 delay_frames * frame_size_, |
| 448 volume); |
| 449 | 449 |
| 450 // Store parts of the recorded data which can't be delivered | 450 // Store parts of the recorded data which can't be delivered |
| 451 // using the current packet size. The stored section will be used | 451 // using the current packet size. The stored section will be used |
| 452 // either in the next while-loop iteration or in the next | 452 // either in the next while-loop iteration or in the next |
| 453 // capture event. | 453 // capture event. |
| 454 memmove(&capture_buffer[0], | 454 memmove(&capture_buffer[0], |
| 455 &capture_buffer[packet_size_bytes_], | 455 &capture_buffer[packet_size_bytes_], |
| 456 (buffer_frame_index - packet_size_frames_) * frame_size_); | 456 (buffer_frame_index - packet_size_frames_) * frame_size_); |
| 457 | 457 |
| 458 buffer_frame_index -= packet_size_frames_; | 458 buffer_frame_index -= packet_size_frames_; |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 731 return hr; | 731 return hr; |
| 732 | 732 |
| 733 // Obtain a reference to the ISimpleAudioVolume interface which enables | 733 // Obtain a reference to the ISimpleAudioVolume interface which enables |
| 734 // us to control the master volume level of an audio session. | 734 // us to control the master volume level of an audio session. |
| 735 hr = audio_client_->GetService(__uuidof(ISimpleAudioVolume), | 735 hr = audio_client_->GetService(__uuidof(ISimpleAudioVolume), |
| 736 simple_audio_volume_.ReceiveVoid()); | 736 simple_audio_volume_.ReceiveVoid()); |
| 737 return hr; | 737 return hr; |
| 738 } | 738 } |
| 739 | 739 |
| 740 } // namespace media | 740 } // namespace media |
| OLD | NEW |