| Index: media/audio/audio_output_controller.cc
|
| ===================================================================
|
| --- media/audio/audio_output_controller.cc (revision 104976)
|
| +++ media/audio/audio_output_controller.cc (working copy)
|
| @@ -13,6 +13,10 @@
|
| // Signal a pause in low-latency mode.
|
| const int AudioOutputController::kPauseMark = -1;
|
|
|
| +// Polling-related constants.
|
| +const int AudioOutputController::kPollNumAttempts = 3;
|
| +const int AudioOutputController::kPollPauseInMilliseconds = 3;
|
| +
|
| AudioOutputController::AudioOutputController(EventHandler* handler,
|
| uint32 capacity,
|
| SyncReader* sync_reader)
|
| @@ -23,7 +27,8 @@
|
| buffer_(0, capacity),
|
| pending_request_(false),
|
| sync_reader_(sync_reader),
|
| - message_loop_(NULL) {
|
| + message_loop_(NULL),
|
| + number_polling_attempts_left_(0) {
|
| }
|
|
|
| AudioOutputController::~AudioOutputController() {
|
| @@ -173,6 +178,43 @@
|
| return;
|
| state_ = kPlaying;
|
|
|
| + if (LowLatencyMode()) {
|
| + // Ask for first packet.
|
| + sync_reader_->UpdatePendingBytes(0);
|
| +
|
| + // Cannot start stream immediately, should give renderer some time
|
| + // to deliver data.
|
| + number_polling_attempts_left_ = kPollNumAttempts;
|
| + message_loop_->PostDelayedTask(
|
| + FROM_HERE,
|
| + base::Bind(&AudioOutputController::PollAndStartIfDataReady, this),
|
| + kPollPauseInMilliseconds);
|
| + } else {
|
| + StartStream();
|
| + }
|
| +}
|
| +
|
| +void AudioOutputController::PollAndStartIfDataReady() {
|
| + DCHECK_EQ(message_loop_, MessageLoop::current());
|
| +
|
| + // Being paranoic: do nothing if we were stopped/paused
|
| + // after DoPlay() but before DoStartStream().
|
| + if (state_ != kPlaying)
|
| + return;
|
| +
|
| + if (--number_polling_attempts_left_ == 0 || sync_reader_->DataReady()) {
|
| + StartStream();
|
| + } else {
|
| + message_loop_->PostDelayedTask(
|
| + FROM_HERE,
|
| + base::Bind(&AudioOutputController::PollAndStartIfDataReady, this),
|
| + kPollPauseInMilliseconds);
|
| + }
|
| +}
|
| +
|
| +void AudioOutputController::StartStream() {
|
| + DCHECK_EQ(message_loop_, MessageLoop::current());
|
| +
|
| // We start the AudioOutputStream lazily.
|
| stream_->Start(this);
|
|
|
|
|