| Index: media/audio/audio_output_controller.cc
|
| ===================================================================
|
| --- media/audio/audio_output_controller.cc (revision 113173)
|
| +++ media/audio/audio_output_controller.cc (working copy)
|
| @@ -21,10 +21,12 @@
|
| const int AudioOutputController::kPollNumAttempts = 3;
|
| const int AudioOutputController::kPollPauseInMilliseconds = 3;
|
|
|
| -AudioOutputController::AudioOutputController(EventHandler* handler,
|
| +AudioOutputController::AudioOutputController(AudioManager* audio_manager,
|
| + EventHandler* handler,
|
| uint32 capacity,
|
| SyncReader* sync_reader)
|
| - : handler_(handler),
|
| + : audio_manager_(audio_manager),
|
| + handler_(handler),
|
| stream_(NULL),
|
| volume_(1.0),
|
| state_(kEmpty),
|
| @@ -32,7 +34,8 @@
|
| pending_request_(false),
|
| sync_reader_(sync_reader),
|
| message_loop_(NULL),
|
| - number_polling_attempts_left_(0) {
|
| + number_polling_attempts_left_(0),
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(weak_this_(this)) {
|
| }
|
|
|
| AudioOutputController::~AudioOutputController() {
|
| @@ -42,81 +45,77 @@
|
|
|
| // static
|
| scoped_refptr<AudioOutputController> AudioOutputController::Create(
|
| + AudioManager* audio_manager,
|
| EventHandler* event_handler,
|
| const AudioParameters& params,
|
| uint32 buffer_capacity) {
|
| -
|
| - if (!params.IsValid())
|
| + DCHECK(audio_manager);
|
| + if (!params.IsValid() || !audio_manager)
|
| return NULL;
|
|
|
| - if (!AudioManager::GetAudioManager())
|
| - return NULL;
|
| -
|
| // Starts the audio controller thread.
|
| scoped_refptr<AudioOutputController> controller(new AudioOutputController(
|
| - event_handler, buffer_capacity, NULL));
|
| + audio_manager, event_handler, buffer_capacity, NULL));
|
|
|
| - controller->message_loop_ =
|
| - AudioManager::GetAudioManager()->GetMessageLoop();
|
| + controller->message_loop_ = audio_manager->GetMessageLoop();
|
| controller->message_loop_->PostTask(FROM_HERE, base::Bind(
|
| - &AudioOutputController::DoCreate, controller.get(), params));
|
| + &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);
|
|
|
| - if (!params.IsValid())
|
| + if (!params.IsValid() || !audio_manager)
|
| return NULL;
|
|
|
| - if (!AudioManager::GetAudioManager())
|
| - return NULL;
|
| -
|
| // Starts the audio controller thread.
|
| scoped_refptr<AudioOutputController> controller(new AudioOutputController(
|
| - event_handler, 0, sync_reader));
|
| + audio_manager, event_handler, 0, sync_reader));
|
|
|
| - controller->message_loop_ =
|
| - AudioManager::GetAudioManager()->GetMessageLoop();
|
| + controller->message_loop_ = audio_manager->GetMessageLoop();
|
| controller->message_loop_->PostTask(FROM_HERE, base::Bind(
|
| - &AudioOutputController::DoCreate, controller.get(), params));
|
| + &AudioOutputController::DoCreate, base::Unretained(controller.get()),
|
| + params));
|
| return controller;
|
| }
|
|
|
| void AudioOutputController::Play() {
|
| DCHECK(message_loop_);
|
| message_loop_->PostTask(FROM_HERE, base::Bind(
|
| - &AudioOutputController::DoPlay, this));
|
| + &AudioOutputController::DoPlay, base::Unretained(this)));
|
| }
|
|
|
| void AudioOutputController::Pause() {
|
| DCHECK(message_loop_);
|
| message_loop_->PostTask(FROM_HERE, base::Bind(
|
| - &AudioOutputController::DoPause, this));
|
| + &AudioOutputController::DoPause, base::Unretained(this)));
|
| }
|
|
|
| void AudioOutputController::Flush() {
|
| DCHECK(message_loop_);
|
| message_loop_->PostTask(FROM_HERE, base::Bind(
|
| - &AudioOutputController::DoFlush, this));
|
| + &AudioOutputController::DoFlush, base::Unretained(this)));
|
| }
|
|
|
| void AudioOutputController::Close(const base::Closure& closed_task) {
|
| DCHECK(!closed_task.is_null());
|
| DCHECK(message_loop_);
|
| message_loop_->PostTask(FROM_HERE, base::Bind(
|
| - &AudioOutputController::DoClose, this, closed_task));
|
| + &AudioOutputController::DoClose, base::Unretained(this), closed_task));
|
| }
|
|
|
| void AudioOutputController::SetVolume(double volume) {
|
| DCHECK(message_loop_);
|
| message_loop_->PostTask(FROM_HERE, base::Bind(
|
| - &AudioOutputController::DoSetVolume, this, volume));
|
| + &AudioOutputController::DoSetVolume, base::Unretained(this), volume));
|
| }
|
|
|
| void AudioOutputController::EnqueueData(const uint8* data, uint32 size) {
|
| @@ -140,11 +139,8 @@
|
| return;
|
| DCHECK_EQ(kEmpty, state_);
|
|
|
| - if (!AudioManager::GetAudioManager())
|
| - return;
|
| -
|
| StopCloseAndClearStream();
|
| - stream_ = AudioManager::GetAudioManager()->MakeAudioOutputStreamProxy(params);
|
| + stream_ = audio_manager_->MakeAudioOutputStreamProxy(params);
|
| if (!stream_) {
|
| // TODO(hclam): Define error types.
|
| handler_->OnError(this, 0);
|
| @@ -193,7 +189,8 @@
|
| number_polling_attempts_left_ = kPollNumAttempts;
|
| message_loop_->PostDelayedTask(
|
| FROM_HERE,
|
| - base::Bind(&AudioOutputController::PollAndStartIfDataReady, this),
|
| + base::Bind(&AudioOutputController::PollAndStartIfDataReady,
|
| + weak_this_.GetWeakPtr()),
|
| kPollPauseInMilliseconds);
|
| } else {
|
| StartStream();
|
| @@ -203,7 +200,7 @@
|
| void AudioOutputController::PollAndStartIfDataReady() {
|
| DCHECK_EQ(message_loop_, MessageLoop::current());
|
|
|
| - // Being paranoic: do nothing if state unexpectedly changed.
|
| + // Being paranoid: do nothing if state unexpectedly changed.
|
| if ((state_ != kStarting) && (state_ != kPausedWhenStarting))
|
| return;
|
|
|
| @@ -220,7 +217,8 @@
|
| } else {
|
| message_loop_->PostDelayedTask(
|
| FROM_HERE,
|
| - base::Bind(&AudioOutputController::PollAndStartIfDataReady, this),
|
| + base::Bind(&AudioOutputController::PollAndStartIfDataReady,
|
| + weak_this_.GetWeakPtr()),
|
| kPollPauseInMilliseconds);
|
| }
|
| }
|
| @@ -379,7 +377,7 @@
|
| void AudioOutputController::OnError(AudioOutputStream* stream, int code) {
|
| // Handle error on the audio controller thread.
|
| message_loop_->PostTask(FROM_HERE, base::Bind(
|
| - &AudioOutputController::DoReportError, this, code));
|
| + &AudioOutputController::DoReportError, base::Unretained(this), code));
|
| }
|
|
|
| void AudioOutputController::SubmitOnMoreData_Locked() {
|
| @@ -409,6 +407,7 @@
|
| stream_->Stop();
|
| stream_->Close();
|
| stream_ = NULL;
|
| + weak_this_.InvalidateWeakPtrs();
|
| }
|
|
|
| } // namespace media
|
|
|