| Index: media/audio/pulse/pulse_input.cc
|
| diff --git a/media/audio/pulse/pulse_input.cc b/media/audio/pulse/pulse_input.cc
|
| index 9d31cddd735ff291713ae24c5e6e6f410008df8d..1e3fe0ee61d1b11e4550f1211415497fed610b1a 100644
|
| --- a/media/audio/pulse/pulse_input.cc
|
| +++ b/media/audio/pulse/pulse_input.cc
|
| @@ -7,15 +7,19 @@
|
| #include <pulse/pulseaudio.h>
|
|
|
| #include "base/logging.h"
|
| +#include "base/time/time.h"
|
| #include "media/audio/pulse/audio_manager_pulse.h"
|
| #include "media/audio/pulse/pulse_util.h"
|
| #include "media/base/seekable_buffer.h"
|
|
|
| namespace media {
|
|
|
| +using base::TimeDelta;
|
| using pulse::AutoPulseLock;
|
| using pulse::WaitForOperationCompletion;
|
|
|
| +static const int kPowerMeasurementTimeConstantMillis = 100;
|
| +
|
| PulseAudioInputStream::PulseAudioInputStream(AudioManagerPulse* audio_manager,
|
| const std::string& device_name,
|
| const AudioParameters& params,
|
| @@ -31,7 +35,8 @@ PulseAudioInputStream::PulseAudioInputStream(AudioManagerPulse* audio_manager,
|
| pa_mainloop_(mainloop),
|
| pa_context_(context),
|
| handle_(NULL),
|
| - context_state_changed_(false) {
|
| + context_state_changed_(false),
|
| + audio_level_monitor_(params) {
|
| DCHECK(mainloop);
|
| DCHECK(context);
|
| }
|
| @@ -272,6 +277,21 @@ void PulseAudioInputStream::ReadData() {
|
| int packet_size = params_.GetBytesPerBuffer();
|
| while (buffer_->forward_bytes() >= packet_size) {
|
| buffer_->Read(audio_data_buffer_.get(), packet_size);
|
| +
|
| + audio_level_monitor_.Scan(audio_data_buffer_.get(), packet_size);
|
| + std::pair<float, bool> result = audio_level_monitor_.ReadCurrentPowerAndClip();
|
| + float level_dbfs = result.first;
|
| + float level = 0;
|
| + static const float kSilenceThresholdDBFS = -72.24719896f;
|
| + if (level_dbfs < kSilenceThresholdDBFS)
|
| + level = 0.0f;
|
| + else if (level_dbfs > 0.0f)
|
| + level = 1.0f;
|
| + else
|
| + level = 1.0f - level_dbfs / kSilenceThresholdDBFS;
|
| + DVLOG(1) << "PA audio_level: " << level;
|
| + audio_level_monitor_.Reset();
|
| +
|
| callback_->OnData(this, audio_data_buffer_.get(), packet_size,
|
| hardware_delay, normalized_volume);
|
|
|
|
|