| Index: media/audio/win/audio_low_latency_input_win.cc
|
| diff --git a/media/audio/win/audio_low_latency_input_win.cc b/media/audio/win/audio_low_latency_input_win.cc
|
| index 8344abae680b27fd64733ec5a88cfa61f6336ea8..214b8bf91c1d4b837bd67db497fbcd61f488bf5f 100644
|
| --- a/media/audio/win/audio_low_latency_input_win.cc
|
| +++ b/media/audio/win/audio_low_latency_input_win.cc
|
| @@ -192,8 +192,10 @@ double WASAPIAudioInputStream::GetMaxVolume() {
|
| }
|
|
|
| void WASAPIAudioInputStream::SetVolume(double volume) {
|
| + DVLOG(1) << "SetVolume(volume=" << volume << ")";
|
| DCHECK(CalledOnValidThread());
|
| - DCHECK(volume <= 1.0 && volume >= 0.0);
|
| + DCHECK_GE(volume, 0.0);
|
| + DCHECK_LE(volume, 1.0);
|
|
|
| DLOG_IF(ERROR, !opened_) << "Open() has not been called successfully";
|
| if (!opened_)
|
| @@ -202,12 +204,18 @@ void WASAPIAudioInputStream::SetVolume(double volume) {
|
| // Set a new master volume level. Valid volume levels are in the range
|
| // 0.0 to 1.0. Ignore volume-change events.
|
| HRESULT hr = simple_audio_volume_->SetMasterVolume(static_cast<float>(volume),
|
| - NULL);
|
| + NULL);
|
| DLOG_IF(WARNING, FAILED(hr)) << "Failed to set new input master volume.";
|
| +
|
| + // Update the AGC volume level based on the last setting above. Note that,
|
| + // the volume-level resolution is not infinite and it is therefore not
|
| + // possible to assume that the volume provided as input parameter can be
|
| + // used directly. Instead, a new query to the audio hardware is required.
|
| + // This method does nothing if AGC is disabled.
|
| + UpdateAgcVolume();
|
| }
|
|
|
| double WASAPIAudioInputStream::GetVolume() {
|
| - DCHECK(CalledOnValidThread());
|
| DLOG_IF(ERROR, !opened_) << "Open() has not been called successfully";
|
| if (!opened_)
|
| return 0.0;
|
| @@ -323,6 +331,7 @@ void WASAPIAudioInputStream::Run() {
|
| LARGE_INTEGER now_count;
|
| bool recording = true;
|
| bool error = false;
|
| + double volume = GetVolume();
|
| HANDLE wait_array[2] = {stop_capture_event_, audio_samples_ready_event_};
|
|
|
| while (recording && !error) {
|
| @@ -389,6 +398,11 @@ void WASAPIAudioInputStream::Run() {
|
| first_audio_frame_timestamp) / 10000.0) * ms_to_frame_count_ +
|
| buffer_frame_index - num_frames_to_read;
|
|
|
| + // Update the AGC volume level once every second. Note that,
|
| + // |volume| is also updated each time SetVolume() is called
|
| + // through IPC by the render-side AGC.
|
| + QueryAgcVolume(&volume);
|
| +
|
| // Deliver captured data to the registered consumer using a packet
|
| // size which was specified at construction.
|
| uint32 delay_frames = static_cast<uint32>(audio_delay_frames + 0.5);
|
| @@ -396,11 +410,13 @@ void WASAPIAudioInputStream::Run() {
|
| uint8* audio_data =
|
| reinterpret_cast<uint8*>(capture_buffer.get());
|
|
|
| - // Deliver data packet and delay estimation to the user.
|
| + // Deliver data packet, delay estimation and volume level to
|
| + // the user.
|
| sink_->OnData(this,
|
| audio_data,
|
| packet_size_bytes_,
|
| - delay_frames * frame_size_);
|
| + delay_frames * frame_size_,
|
| + volume);
|
|
|
| // Store parts of the recorded data which can't be delivered
|
| // using the current packet size. The stored section will be used
|
|
|