| Index: media/audio/mac/audio_low_latency_input_mac.cc
|
| diff --git a/media/audio/mac/audio_low_latency_input_mac.cc b/media/audio/mac/audio_low_latency_input_mac.cc
|
| index ddd12edb49616d6a5f598a4b57723598dd8b9c72..075b055431040f1414316db7299e2d364bd1fda7 100644
|
| --- a/media/audio/mac/audio_low_latency_input_mac.cc
|
| +++ b/media/audio/mac/audio_low_latency_input_mac.cc
|
| @@ -12,6 +12,8 @@
|
| #include "media/audio/audio_util.h"
|
| #include "media/audio/mac/audio_manager_mac.h"
|
|
|
| +static const int kMinIntervalBetweenVolumeUpdatesMs = 1000;
|
| +
|
| static std::ostream& operator<<(std::ostream& os,
|
| const AudioStreamBasicDescription& format) {
|
| os << "sample rate : " << format.mSampleRate << std::endl
|
| @@ -289,7 +291,9 @@ double AUAudioInputStream::GetMaxVolume() {
|
| }
|
|
|
| void AUAudioInputStream::SetVolume(double volume) {
|
| - DCHECK(volume <= 1.0 && volume >= 0.0);
|
| + DVLOG(1) << "SetVolume(volume=" << volume << ")";
|
| + DCHECK_GE(volume, 0.0);
|
| + DCHECK_LE(volume, 1.0);
|
|
|
| // Verify that we have a valid device.
|
| if (input_device_id_ == kAudioObjectUnknown) {
|
| @@ -336,6 +340,13 @@ void AUAudioInputStream::SetVolume(double volume) {
|
|
|
| DLOG_IF(WARNING, successful_channels == 0)
|
| << "Failed to set volume to " << volume_float32;
|
| +
|
| + // 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 AUAudioInputStream::GetVolume() {
|
| @@ -433,6 +444,12 @@ OSStatus AUAudioInputStream::Provide(UInt32 number_of_frames,
|
| // Update the capture latency.
|
| double capture_latency_frames = GetCaptureLatency(time_stamp);
|
|
|
| + // 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.
|
| + double normalized_volume = 0.0;
|
| + QueryAgcVolume(&normalized_volume);
|
| +
|
| AudioBuffer& buffer = io_data->mBuffers[0];
|
| uint8* audio_data = reinterpret_cast<uint8*>(buffer.mData);
|
| uint32 capture_delay_bytes = static_cast<uint32>
|
| @@ -441,7 +458,12 @@ OSStatus AUAudioInputStream::Provide(UInt32 number_of_frames,
|
| if (!audio_data)
|
| return kAudioUnitErr_InvalidElement;
|
|
|
| - sink_->OnData(this, audio_data, buffer.mDataByteSize, capture_delay_bytes);
|
| + // Deliver data packet, delay estimation and volume level to the user.
|
| + sink_->OnData(this,
|
| + audio_data,
|
| + buffer.mDataByteSize,
|
| + capture_delay_bytes,
|
| + normalized_volume);
|
|
|
| return noErr;
|
| }
|
|
|