| Index: media/audio/audio_output_controller.cc
|
| diff --git a/media/audio/audio_output_controller.cc b/media/audio/audio_output_controller.cc
|
| index d780687d1b8415aee8f6223be8497905a80b8800..e2fd07ddd98b780f1e978f7d937ded690af8473c 100644
|
| --- a/media/audio/audio_output_controller.cc
|
| +++ b/media/audio/audio_output_controller.cc
|
| @@ -71,6 +71,30 @@ scoped_refptr<AudioOutputController> AudioOutputController::Create(
|
| return controller;
|
| }
|
|
|
| +scoped_refptr<AudioOutputController> AudioOutputController::Create(
|
| + AudioManager* audio_manager,
|
| + EventHandler* event_handler,
|
| + const AudioParameters& params,
|
| + const std::string& output_device_id,
|
| + SyncReader* sync_reader,
|
| + content::mojom::AudioOutputStreamPtr stream,
|
| + const content::mojom::AudioOutput::CreateStreamCallback& callback) {
|
| + DCHECK(audio_manager);
|
| + DCHECK(sync_reader);
|
| +
|
| + if (!params.IsValid() || !audio_manager)
|
| + return NULL;
|
| +
|
| + scoped_refptr<AudioOutputController> controller(new AudioOutputController(
|
| + audio_manager, event_handler, params, output_device_id, sync_reader));
|
| + controller->stream_ptr_ = std::move(stream);
|
| +
|
| + controller->message_loop_->PostTask(
|
| + FROM_HERE, base::Bind(&AudioOutputController::DoCreateMojo, controller,
|
| + false, callback));
|
| + return controller;
|
| +}
|
| +
|
| void AudioOutputController::Play() {
|
| message_loop_->PostTask(FROM_HERE, base::Bind(
|
| &AudioOutputController::DoPlay, this));
|
| @@ -154,6 +178,52 @@ void AudioOutputController::DoCreate(bool is_for_device_change) {
|
| handler_->OnCreated();
|
| }
|
|
|
| +void AudioOutputController::DoCreateMojo(
|
| + bool is_for_device_change,
|
| + const content::mojom::AudioOutput::CreateStreamCallback& callback) {
|
| + DCHECK(message_loop_->BelongsToCurrentThread());
|
| + SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.CreateTime");
|
| + TRACE_EVENT0("audio", "AudioOutputController::DoCreate");
|
| +
|
| + // Close() can be called before DoCreate() is executed.
|
| + if (state_ == kClosed)
|
| + return;
|
| +
|
| + DoStopCloseAndClearStream(); // Calls RemoveOutputDeviceChangeListener().
|
| + DCHECK_EQ(kEmpty, state_);
|
| +
|
| + stream_ = diverting_to_stream_ ? diverting_to_stream_
|
| + : audio_manager_->MakeAudioOutputStreamProxy(
|
| + params_, output_device_id_);
|
| + if (!stream_) {
|
| + state_ = kError;
|
| + handler_->OnError();
|
| + return;
|
| + }
|
| +
|
| + if (!stream_->Open()) {
|
| + DoStopCloseAndClearStream();
|
| + state_ = kError;
|
| + handler_->OnError();
|
| + return;
|
| + }
|
| +
|
| + // Everything started okay, so re-register for state change callbacks if
|
| + // stream_ was created via AudioManager.
|
| + if (stream_ != diverting_to_stream_)
|
| + audio_manager_->AddOutputDeviceChangeListener(this);
|
| +
|
| + // We have successfully opened the stream. Set the initial volume.
|
| + stream_->SetVolume(volume_);
|
| +
|
| + // Finally set the state to kCreated.
|
| + state_ = kCreated;
|
| +
|
| + // And then report we have been created if we haven't done so already.
|
| + if (!is_for_device_change)
|
| + handler_->OnCreated(std::move(stream_ptr_), callback);
|
| +}
|
| +
|
| void AudioOutputController::DoPlay() {
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
| SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.PlayTime");
|
|
|