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); |