Index: media/audio/audio_output_controller.cc |
diff --git a/media/audio/audio_output_controller.cc b/media/audio/audio_output_controller.cc |
index 4005047f428c2390aebc084cfb3b0d07a2529ef7..8b12c9e4be83130faded2e174463d673037427cc 100644 |
--- a/media/audio/audio_output_controller.cc |
+++ b/media/audio/audio_output_controller.cc |
@@ -11,7 +11,6 @@ |
#include "base/threading/platform_thread.h" |
#include "base/time/time.h" |
#include "build/build_config.h" |
-#include "media/audio/audio_power_monitor.h" |
#include "media/audio/audio_util.h" |
#include "media/audio/shared_memory_util.h" |
#include "media/base/scoped_histogram_timer.h" |
@@ -49,7 +48,10 @@ AudioOutputController::AudioOutputController(AudioManager* audio_manager, |
num_allowed_io_(0), |
sync_reader_(sync_reader), |
message_loop_(audio_manager->GetMessageLoop()), |
- number_polling_attempts_left_(0) { |
+ number_polling_attempts_left_(0), |
+ power_monitor_( |
+ params.sample_rate(), |
+ TimeDelta::FromMilliseconds(kPowerMeasurementTimeConstantMillis)) { |
DCHECK(audio_manager); |
DCHECK(handler_); |
DCHECK(sync_reader_); |
@@ -156,17 +158,13 @@ void AudioOutputController::DoPlay() { |
state_ = kPlaying; |
- // Start monitoring power levels and send an initial notification that we're |
- // starting in silence. |
- handler_->OnPowerMeasured(AudioPowerMonitor::zero_power(), false); |
- power_monitor_callback_.Reset( |
- base::Bind(&EventHandler::OnPowerMeasured, base::Unretained(handler_))); |
- power_monitor_.reset(new AudioPowerMonitor( |
- params_.sample_rate(), |
- TimeDelta::FromMilliseconds(kPowerMeasurementTimeConstantMillis), |
- TimeDelta::FromSeconds(1) / kPowerMeasurementsPerSecond, |
- base::MessageLoop::current(), |
- power_monitor_callback_.callback())); |
+ power_monitor_.Reset(); |
+ power_poll_callback_.Reset( |
+ base::Bind(&AudioOutputController::ReportPowerMeasurementPeriodically, |
+ this)); |
+ // Run the callback to send an initial notification that we're starting in |
+ // silence, and to schedule periodic callbacks. |
+ power_poll_callback_.callback().Run(); |
// We start the AudioOutputStream lazily. |
AllowEntryToOnMoreIOData(); |
@@ -175,6 +173,15 @@ void AudioOutputController::DoPlay() { |
handler_->OnPlaying(); |
} |
+void AudioOutputController::ReportPowerMeasurementPeriodically() { |
+ DCHECK(message_loop_->BelongsToCurrentThread()); |
+ handler_->OnPowerMeasured(power_monitor_.ReadCurrentPower(), |
+ power_monitor_.TestForClippingAndClear()); |
+ message_loop_->PostDelayedTask( |
+ FROM_HERE, power_poll_callback_.callback(), |
+ TimeDelta::FromSeconds(1) / kPowerMeasurementsPerSecond); |
+} |
+ |
void AudioOutputController::StopStream() { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
@@ -182,11 +189,7 @@ void AudioOutputController::StopStream() { |
stream_->Stop(); |
DisallowEntryToOnMoreIOData(); |
- // Stop monitoring power levels. By canceling power_monitor_callback_, any |
- // tasks posted to |message_loop_| by AudioPowerMonitor during the |
- // stream_->Stop() call above will not run. |
- power_monitor_.reset(); |
- power_monitor_callback_.Cancel(); |
+ power_poll_callback_.Cancel(); |
state_ = kPaused; |
} |
@@ -279,7 +282,7 @@ int AudioOutputController::OnMoreIOData(AudioBus* source, |
sync_reader_->UpdatePendingBytes( |
buffers_state.total_bytes() + frames * params_.GetBytesPerFrame()); |
- power_monitor_->Scan(*dest, frames); |
+ power_monitor_.Scan(*dest, frames); |
AllowEntryToOnMoreIOData(); |
return frames; |