Index: media/audio/audio_power_monitor.h |
diff --git a/media/audio/audio_power_monitor.h b/media/audio/audio_power_monitor.h |
index b65fb13f495c852aac2b47b77f32767b03d656a7..f840bbf6b9f0f23912b7af870ba080a552f34202 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); |
}; |