diff options
Diffstat (limited to 'media/audio/audio_power_monitor.h')
-rw-r--r-- | media/audio/audio_power_monitor.h | 53 |
1 files changed, 22 insertions, 31 deletions
diff --git a/media/audio/audio_power_monitor.h b/media/audio/audio_power_monitor.h index b65fb13..f840bbf 100644 --- a/media/audio/audio_power_monitor.h +++ b/media/audio/audio_power_monitor.h @@ -6,8 +6,10 @@ #define MEDIA_AUDIO_AUDIO_POWER_MONITOR_H_ #include <limits> +#include <utility> #include "base/callback.h" +#include "base/synchronization/lock.h" #include "media/base/media_export.h" // An audio signal power monitor. It is periodically provided an AudioBus by @@ -24,7 +26,6 @@ // undetermined/unbounded amount of run-time. namespace base { -class MessageLoop; class TimeDelta; } @@ -34,31 +35,28 @@ class AudioBus; class MEDIA_EXPORT AudioPowerMonitor { public: - // Reports power level in terms of dBFS (see zero_power() and max_power() - // below). |clipped| is true if any *one* sample exceeded maximum amplitude - // since the last invocation. - typedef base::Callback<void(float power_dbfs, bool clipped)> - PowerMeasurementCallback; - // |sample_rate| is the audio signal sample rate (Hz). |time_constant| // characterizes how samples are averaged over time to determine the power // level; and is the amount of time it takes a zero power level to increase to - // ~63.2% of maximum given a step input signal. |measurement_period| is the - // time length of signal to analyze before invoking the callback to report the - // current power level. |message_loop| is where the |callback| task will be - // posted. - AudioPowerMonitor(int sample_rate, - const base::TimeDelta& time_constant, - const base::TimeDelta& measurement_period, - base::MessageLoop* message_loop, - const PowerMeasurementCallback& callback); + // ~63.2% of maximum given a step input signal. + AudioPowerMonitor(int sample_rate, const base::TimeDelta& time_constant); ~AudioPowerMonitor(); + // Reset power monitor to initial state (zero power level). This should not + // be called while another thread is scanning. + void Reset(); + // Scan more |frames| of audio data from |buffer|. It is safe to call this // from a real-time priority thread. void Scan(const AudioBus& buffer, int frames); + // Returns the current power level in dBFS and clip status. Clip status is + // true whenever any *one* sample scanned exceeded maximum amplitude since + // this method's last invocation. It is safe to call this method from any + // thread. + std::pair<float, bool> ReadCurrentPowerAndClip(); + // dBFS value corresponding to zero power in the audio signal. static float zero_power() { return -std::numeric_limits<float>::infinity(); } @@ -70,23 +68,16 @@ class MEDIA_EXPORT AudioPowerMonitor { // |sample_rate| and |time_constant|. const float sample_weight_; - // Number of audio frames to be scanned before reporting the current power - // level via callback, as computed from |sample_rate| and - // |measurement_period|. - const int num_frames_per_callback_; - - // MessageLoop and callback used to notify of the current power level. - base::MessageLoop* const message_loop_; - const PowerMeasurementCallback power_level_callback_; - - // Accumulated results over one or more calls to Scan(). + // Accumulated results over one or more calls to Scan(). These should only be + // touched by the thread invoking Scan(). float average_power_; - bool clipped_since_last_notification_; - int frames_since_last_notification_; + bool has_clipped_; - // Keep track of last reported results to forgo making redundant callbacks. - float last_reported_power_; - bool last_reported_clipped_; + // Copies of power and clip status, used to deliver results synchronously + // across threads. + base::Lock reading_lock_; + float power_reading_; + bool clipped_reading_; DISALLOW_COPY_AND_ASSIGN(AudioPowerMonitor); }; |