Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(493)

Unified Diff: media/audio/audio_output_controller.cc

Issue 9121062: Remove "high"-latency audio code path (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase ToT Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.
henrika (OOO until Aug 14) 2012/02/01 13:11:29 Thanks. This part is magic to me as well.
vrk (LEFT CHROMIUM) 2012/02/02 21:05:41 :)
+ // 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());

Powered by Google App Engine
This is Rietveld 408576698