| Index: media/audio/audio_output_controller.cc
|
| diff --git a/media/audio/audio_output_controller.cc b/media/audio/audio_output_controller.cc
|
| index d087a70208a03623dbcd2a8783f51b461c1356c2..a205e18b3d8a203fb6533850acd025b32cacc2c2 100644
|
| --- a/media/audio/audio_output_controller.cc
|
| +++ b/media/audio/audio_output_controller.cc
|
| @@ -25,15 +25,12 @@ const int AudioOutputController::kPollPauseInMilliseconds = 3;
|
|
|
| AudioOutputController::AudioOutputController(AudioManager* audio_manager,
|
| EventHandler* handler,
|
| - uint32 capacity,
|
| SyncReader* sync_reader)
|
| : audio_manager_(audio_manager),
|
| handler_(handler),
|
| stream_(NULL),
|
| volume_(1.0),
|
| state_(kEmpty),
|
| - buffer_(0, capacity),
|
| - pending_request_(false),
|
| sync_reader_(sync_reader),
|
| message_loop_(NULL),
|
| number_polling_attempts_left_(0),
|
| @@ -62,27 +59,6 @@ scoped_refptr<AudioOutputController> AudioOutputController::Create(
|
| AudioManager* audio_manager,
|
| EventHandler* event_handler,
|
| const AudioParameters& params,
|
| - uint32 buffer_capacity) {
|
| - DCHECK(audio_manager);
|
| - if (!params.IsValid() || !audio_manager)
|
| - return NULL;
|
| -
|
| - // Starts the audio controller thread.
|
| - scoped_refptr<AudioOutputController> controller(new AudioOutputController(
|
| - audio_manager, event_handler, buffer_capacity, NULL));
|
| -
|
| - controller->message_loop_ = audio_manager->GetMessageLoop();
|
| - controller->message_loop_->PostTask(FROM_HERE, base::Bind(
|
| - &AudioOutputController::DoCreate, base::Unretained(controller.get()),
|
| - params));
|
| - return controller;
|
| -}
|
| -
|
| -// static
|
| -scoped_refptr<AudioOutputController> AudioOutputController::CreateLowLatency(
|
| - AudioManager* audio_manager,
|
| - EventHandler* event_handler,
|
| - const AudioParameters& params,
|
| SyncReader* sync_reader) {
|
| DCHECK(audio_manager);
|
| DCHECK(sync_reader);
|
| @@ -92,7 +68,7 @@ scoped_refptr<AudioOutputController> AudioOutputController::CreateLowLatency(
|
|
|
| // Starts the audio controller thread.
|
| scoped_refptr<AudioOutputController> controller(new AudioOutputController(
|
| - audio_manager, event_handler, 0, sync_reader));
|
| + audio_manager, event_handler, sync_reader));
|
|
|
| controller->message_loop_ = audio_manager->GetMessageLoop();
|
| controller->message_loop_->PostTask(FROM_HERE, base::Bind(
|
| @@ -132,19 +108,6 @@ void AudioOutputController::SetVolume(double volume) {
|
| &AudioOutputController::DoSetVolume, base::Unretained(this), volume));
|
| }
|
|
|
| -void AudioOutputController::EnqueueData(const uint8* data, uint32 size) {
|
| - // Write data to the push source and ask for more data if needed.
|
| - base::AutoLock auto_lock(lock_);
|
| - pending_request_ = false;
|
| - // If |size| is set to 0, it indicates that the audio source doesn't have
|
| - // more data right now, and so it doesn't make sense to send additional
|
| - // request.
|
| - if (size) {
|
| - buffer_.Append(data, size);
|
| - SubmitOnMoreData_Locked();
|
| - }
|
| -}
|
| -
|
| void AudioOutputController::DoCreate(const AudioParameters& params) {
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
|
|
| @@ -177,12 +140,6 @@ void AudioOutputController::DoCreate(const AudioParameters& params) {
|
|
|
| // And then report we have been created.
|
| handler_->OnCreated(this);
|
| -
|
| - // If in normal latency mode then start buffering.
|
| - if (!LowLatencyMode()) {
|
| - base::AutoLock auto_lock(lock_);
|
| - SubmitOnMoreData_Locked();
|
| - }
|
| }
|
|
|
| void AudioOutputController::DoPlay() {
|
| @@ -192,23 +149,21 @@ void AudioOutputController::DoPlay() {
|
| if (state_ != kCreated && state_ != kPaused)
|
| return;
|
|
|
| - if (LowLatencyMode()) {
|
| - state_ = kStarting;
|
| -
|
| - // 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,
|
| - weak_this_.GetWeakPtr()),
|
| - kPollPauseInMilliseconds);
|
| - } else {
|
| - StartStream();
|
| - }
|
| + state_ = kStarting;
|
| +
|
| + // Ask for first packet.
|
| + sync_reader_->UpdatePendingBytes(0);
|
| +
|
| + // Cannot start stream immediately, should give renderer some time
|
| + // to deliver data.
|
| + // TODO(vrk): The polling here and in WaitTillDataReady() is pretty clunky.
|
| + // Refine the API such that polling is no longer needed. (crbug.com/112196)
|
| + number_polling_attempts_left_ = kPollNumAttempts;
|
| + message_loop_->PostDelayedTask(
|
| + FROM_HERE,
|
| + base::Bind(&AudioOutputController::PollAndStartIfDataReady,
|
| + weak_this_.GetWeakPtr()),
|
| + kPollPauseInMilliseconds);
|
| }
|
|
|
| void AudioOutputController::PollAndStartIfDataReady() {
|
| @@ -270,10 +225,8 @@ void AudioOutputController::DoPause() {
|
| // TODO(hclam): Actually pause the audio device.
|
| stream_->Stop();
|
|
|
| - if (LowLatencyMode()) {
|
| - // Send a special pause mark to the low-latency audio thread.
|
| - sync_reader_->UpdatePendingBytes(kPauseMark);
|
| - }
|
| + // Send a special pause mark to the low-latency audio thread.
|
| + sync_reader_->UpdatePendingBytes(kPauseMark);
|
|
|
| handler_->OnPaused(this);
|
| break;
|
| @@ -286,14 +239,6 @@ void AudioOutputController::DoFlush() {
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
|
|
| // TODO(hclam): Actually flush the audio device.
|
| -
|
| - // If we are in the regular latency mode then flush the push source.
|
| - if (!sync_reader_) {
|
| - if (state_ != kPaused)
|
| - return;
|
| - base::AutoLock auto_lock(lock_);
|
| - buffer_.Clear();
|
| - }
|
| }
|
|
|
| void AudioOutputController::DoClose(const base::Closure& closed_task) {
|
| @@ -301,11 +246,7 @@ void AudioOutputController::DoClose(const base::Closure& closed_task) {
|
|
|
| if (state_ != kClosed) {
|
| DoStopCloseAndClearStream(NULL);
|
| -
|
| - if (LowLatencyMode()) {
|
| - sync_reader_->Close();
|
| - }
|
| -
|
| + sync_reader_->Close();
|
| state_ = kClosed;
|
| }
|
|
|
| @@ -343,25 +284,6 @@ uint32 AudioOutputController::OnMoreData(
|
| uint32 max_size, AudioBuffersState buffers_state) {
|
| TRACE_EVENT0("audio", "AudioOutputController::OnMoreData");
|
|
|
| - // If regular latency mode is used.
|
| - if (!sync_reader_) {
|
| - base::AutoLock auto_lock(lock_);
|
| -
|
| - // Save current buffers state.
|
| - buffers_state_ = buffers_state;
|
| -
|
| - if (state_ != kPlaying) {
|
| - // Don't read anything. Save the number of bytes in the hardware buffer.
|
| - return 0;
|
| - }
|
| -
|
| - uint32 size = buffer_.Read(dest, max_size);
|
| - buffers_state_.pending_bytes += size;
|
| - SubmitOnMoreData_Locked();
|
| - return size;
|
| - }
|
| -
|
| - // Low latency mode.
|
| {
|
| // Check state and do nothing if we are not playing.
|
| // We are on the hardware audio thread, so lock is needed.
|
| @@ -370,13 +292,13 @@ uint32 AudioOutputController::OnMoreData(
|
| return 0;
|
| }
|
| }
|
| - uint32 size = sync_reader_->Read(dest, max_size);
|
| + uint32 size = sync_reader_->Read(dest, max_size);
|
| sync_reader_->UpdatePendingBytes(buffers_state.total_bytes() + size);
|
| return size;
|
| }
|
|
|
| void AudioOutputController::WaitTillDataReady() {
|
| - if (LowLatencyMode() && !sync_reader_->DataReady()) {
|
| + if (!sync_reader_->DataReady()) {
|
| // In the different place we use different mechanism to poll, get max
|
| // polling delay from constants used there.
|
| const base::TimeDelta kMaxPollingDelay = base::TimeDelta::FromMilliseconds(
|
| @@ -395,26 +317,6 @@ void AudioOutputController::OnError(AudioOutputStream* stream, int code) {
|
| &AudioOutputController::DoReportError, base::Unretained(this), code));
|
| }
|
|
|
| -void AudioOutputController::SubmitOnMoreData_Locked() {
|
| - lock_.AssertAcquired();
|
| -
|
| - if (buffer_.forward_bytes() > buffer_.forward_capacity())
|
| - return;
|
| -
|
| - if (pending_request_)
|
| - return;
|
| - pending_request_ = true;
|
| -
|
| - AudioBuffersState buffers_state = buffers_state_;
|
| - buffers_state.pending_bytes += buffer_.forward_bytes();
|
| -
|
| - // If we need more data then call the event handler to ask for more data.
|
| - // It is okay that we don't lock in this block because the parameters are
|
| - // correct and in the worst case we are just asking more data than needed.
|
| - base::AutoUnlock auto_unlock(lock_);
|
| - handler_->OnMoreData(this, buffers_state);
|
| -}
|
| -
|
| void AudioOutputController::DoStopCloseAndClearStream(WaitableEvent *done) {
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
|
|
|
|