| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/audio/audio_output_controller.h" | 5 #include "media/audio/audio_output_controller.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 | 10 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 if (!params.IsValid() || !audio_manager) | 64 if (!params.IsValid() || !audio_manager) |
| 65 return NULL; | 65 return NULL; |
| 66 | 66 |
| 67 scoped_refptr<AudioOutputController> controller(new AudioOutputController( | 67 scoped_refptr<AudioOutputController> controller(new AudioOutputController( |
| 68 audio_manager, event_handler, params, output_device_id, sync_reader)); | 68 audio_manager, event_handler, params, output_device_id, sync_reader)); |
| 69 controller->message_loop_->PostTask(FROM_HERE, base::Bind( | 69 controller->message_loop_->PostTask(FROM_HERE, base::Bind( |
| 70 &AudioOutputController::DoCreate, controller, false)); | 70 &AudioOutputController::DoCreate, controller, false)); |
| 71 return controller; | 71 return controller; |
| 72 } | 72 } |
| 73 | 73 |
| 74 scoped_refptr<AudioOutputController> AudioOutputController::Create( |
| 75 AudioManager* audio_manager, |
| 76 EventHandler* event_handler, |
| 77 const AudioParameters& params, |
| 78 const std::string& output_device_id, |
| 79 SyncReader* sync_reader, |
| 80 content::mojom::AudioOutputStreamPtr stream, |
| 81 const content::mojom::AudioOutput::CreateStreamCallback& callback) { |
| 82 DCHECK(audio_manager); |
| 83 DCHECK(sync_reader); |
| 84 |
| 85 if (!params.IsValid() || !audio_manager) |
| 86 return NULL; |
| 87 |
| 88 scoped_refptr<AudioOutputController> controller(new AudioOutputController( |
| 89 audio_manager, event_handler, params, output_device_id, sync_reader)); |
| 90 controller->stream_ptr_ = std::move(stream); |
| 91 |
| 92 controller->message_loop_->PostTask( |
| 93 FROM_HERE, base::Bind(&AudioOutputController::DoCreateMojo, controller, |
| 94 false, callback)); |
| 95 return controller; |
| 96 } |
| 97 |
| 74 void AudioOutputController::Play() { | 98 void AudioOutputController::Play() { |
| 75 message_loop_->PostTask(FROM_HERE, base::Bind( | 99 message_loop_->PostTask(FROM_HERE, base::Bind( |
| 76 &AudioOutputController::DoPlay, this)); | 100 &AudioOutputController::DoPlay, this)); |
| 77 } | 101 } |
| 78 | 102 |
| 79 void AudioOutputController::Pause() { | 103 void AudioOutputController::Pause() { |
| 80 message_loop_->PostTask(FROM_HERE, base::Bind( | 104 message_loop_->PostTask(FROM_HERE, base::Bind( |
| 81 &AudioOutputController::DoPause, this)); | 105 &AudioOutputController::DoPause, this)); |
| 82 } | 106 } |
| 83 | 107 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 stream_->SetVolume(volume_); | 171 stream_->SetVolume(volume_); |
| 148 | 172 |
| 149 // Finally set the state to kCreated. | 173 // Finally set the state to kCreated. |
| 150 state_ = kCreated; | 174 state_ = kCreated; |
| 151 | 175 |
| 152 // And then report we have been created if we haven't done so already. | 176 // And then report we have been created if we haven't done so already. |
| 153 if (!is_for_device_change) | 177 if (!is_for_device_change) |
| 154 handler_->OnCreated(); | 178 handler_->OnCreated(); |
| 155 } | 179 } |
| 156 | 180 |
| 181 void AudioOutputController::DoCreateMojo( |
| 182 bool is_for_device_change, |
| 183 const content::mojom::AudioOutput::CreateStreamCallback& callback) { |
| 184 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 185 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.CreateTime"); |
| 186 TRACE_EVENT0("audio", "AudioOutputController::DoCreate"); |
| 187 |
| 188 // Close() can be called before DoCreate() is executed. |
| 189 if (state_ == kClosed) |
| 190 return; |
| 191 |
| 192 DoStopCloseAndClearStream(); // Calls RemoveOutputDeviceChangeListener(). |
| 193 DCHECK_EQ(kEmpty, state_); |
| 194 |
| 195 stream_ = diverting_to_stream_ ? diverting_to_stream_ |
| 196 : audio_manager_->MakeAudioOutputStreamProxy( |
| 197 params_, output_device_id_); |
| 198 if (!stream_) { |
| 199 state_ = kError; |
| 200 handler_->OnError(); |
| 201 return; |
| 202 } |
| 203 |
| 204 if (!stream_->Open()) { |
| 205 DoStopCloseAndClearStream(); |
| 206 state_ = kError; |
| 207 handler_->OnError(); |
| 208 return; |
| 209 } |
| 210 |
| 211 // Everything started okay, so re-register for state change callbacks if |
| 212 // stream_ was created via AudioManager. |
| 213 if (stream_ != diverting_to_stream_) |
| 214 audio_manager_->AddOutputDeviceChangeListener(this); |
| 215 |
| 216 // We have successfully opened the stream. Set the initial volume. |
| 217 stream_->SetVolume(volume_); |
| 218 |
| 219 // Finally set the state to kCreated. |
| 220 state_ = kCreated; |
| 221 |
| 222 // And then report we have been created if we haven't done so already. |
| 223 if (!is_for_device_change) |
| 224 handler_->OnCreated(std::move(stream_ptr_), callback); |
| 225 } |
| 226 |
| 157 void AudioOutputController::DoPlay() { | 227 void AudioOutputController::DoPlay() { |
| 158 DCHECK(message_loop_->BelongsToCurrentThread()); | 228 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 159 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.PlayTime"); | 229 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.PlayTime"); |
| 160 TRACE_EVENT0("audio", "AudioOutputController::DoPlay"); | 230 TRACE_EVENT0("audio", "AudioOutputController::DoPlay"); |
| 161 | 231 |
| 162 // We can start from created or paused state. | 232 // We can start from created or paused state. |
| 163 if (state_ != kCreated && state_ != kPaused) | 233 if (state_ != kCreated && state_ != kPaused) |
| 164 return; | 234 return; |
| 165 | 235 |
| 166 // Ask for first packet. | 236 // Ask for first packet. |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 DCHECK(message_loop_->BelongsToCurrentThread()); | 498 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 429 | 499 |
| 430 // If we should be playing and we haven't, that's a wedge. | 500 // If we should be playing and we haven't, that's a wedge. |
| 431 if (state_ == kPlaying) { | 501 if (state_ == kPlaying) { |
| 432 UMA_HISTOGRAM_BOOLEAN("Media.AudioOutputControllerPlaybackStartupSuccess", | 502 UMA_HISTOGRAM_BOOLEAN("Media.AudioOutputControllerPlaybackStartupSuccess", |
| 433 base::AtomicRefCountIsOne(&on_more_io_data_called_)); | 503 base::AtomicRefCountIsOne(&on_more_io_data_called_)); |
| 434 } | 504 } |
| 435 } | 505 } |
| 436 | 506 |
| 437 } // namespace media | 507 } // namespace media |
| OLD | NEW |