Index: content/renderer/media/track_audio_renderer.cc |
diff --git a/content/renderer/media/track_audio_renderer.cc b/content/renderer/media/track_audio_renderer.cc |
index 23f2dadd52af10b6f2ce3df1849d1007dea8209c..f80cb8ad3144c030c24f129d47bcbc42a8a07601 100644 |
--- a/content/renderer/media/track_audio_renderer.cc |
+++ b/content/renderer/media/track_audio_renderer.cc |
@@ -137,7 +137,7 @@ TrackAudioRenderer::TrackAudioRenderer( |
TrackAudioRenderer::~TrackAudioRenderer() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- DCHECK(!sink_.get()); |
+ DCHECK(!sink_); |
DVLOG(1) << "TrackAudioRenderer::~TrackAudioRenderer()"; |
} |
@@ -149,7 +149,7 @@ void TrackAudioRenderer::Start() { |
// We get audio data from |audio_track_|... |
MediaStreamAudioSink::AddToAudioTrack(this, audio_track_); |
// ...and |sink_| will get audio data from us. |
- DCHECK(!sink_.get()); |
+ DCHECK(!sink_); |
sink_ = AudioDeviceFactory::NewAudioRendererSink( |
AudioDeviceFactory::kSourceNonRtcAudioTrack, playout_render_frame_id_, |
session_id_, output_device_id_, security_origin_); |
@@ -168,7 +168,7 @@ void TrackAudioRenderer::Stop() { |
// Stop the output audio stream, i.e, stop asking for data to render. |
// It is safer to call Stop() on the |sink_| to clean up the resources even |
// when the |sink_| is never started. |
- if (sink_.get()) { |
+ if (sink_) { |
sink_->Stop(); |
sink_ = NULL; |
} |
@@ -187,7 +187,7 @@ void TrackAudioRenderer::Play() { |
DVLOG(1) << "TrackAudioRenderer::Play()"; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- if (!sink_.get()) |
+ if (!sink_) |
return; |
playing_ = true; |
@@ -199,7 +199,7 @@ void TrackAudioRenderer::Pause() { |
DVLOG(1) << "TrackAudioRenderer::Pause()"; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- if (!sink_.get()) |
+ if (!sink_) |
return; |
playing_ = false; |
@@ -215,13 +215,13 @@ void TrackAudioRenderer::SetVolume(float volume) { |
// Cache the volume. Whenever |sink_| is re-created, call SetVolume() with |
// this cached volume. |
volume_ = volume; |
- if (sink_.get()) |
+ if (sink_) |
sink_->SetVolume(volume); |
} |
media::OutputDevice* TrackAudioRenderer::GetOutputDevice() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- return this; |
+ return sink_ ? sink_->GetOutputDevice() : nullptr; |
} |
base::TimeDelta TrackAudioRenderer::GetCurrentRenderTime() const { |
@@ -256,8 +256,11 @@ void TrackAudioRenderer::SwitchOutputDevice( |
AudioDeviceFactory::NewAudioRendererSink( |
AudioDeviceFactory::kSourceNonRtcAudioTrack, playout_render_frame_id_, |
session_id_, device_id, security_origin); |
+ |
+ media::OutputDevice* device = new_sink->GetOutputDevice(); |
media::OutputDeviceStatus new_sink_status = |
- new_sink->GetOutputDevice()->GetDeviceStatus(); |
+ device ? device->GetDeviceStatus() |
+ : media::OUTPUT_DEVICE_STATUS_ERROR_INTERNAL; |
if (new_sink_status != media::OUTPUT_DEVICE_STATUS_OK) { |
callback.Run(new_sink_status); |
return; |
@@ -267,7 +270,7 @@ void TrackAudioRenderer::SwitchOutputDevice( |
security_origin_ = security_origin; |
bool was_sink_started = sink_started_; |
- if (sink_.get()) |
+ if (sink_) |
sink_->Stop(); |
sink_started_ = false; |
@@ -278,35 +281,11 @@ void TrackAudioRenderer::SwitchOutputDevice( |
callback.Run(media::OUTPUT_DEVICE_STATUS_OK); |
} |
-media::AudioParameters TrackAudioRenderer::GetOutputParameters() { |
- DCHECK(task_runner_->BelongsToCurrentThread()); |
- if (!sink_ || !source_params_.IsValid()) |
- return media::AudioParameters(); |
- |
- // Output parameters consist of the same channel layout and sample rate as the |
- // source, but having the buffer duration preferred by the hardware. |
- const media::AudioParameters& preferred_params = |
- sink_->GetOutputDevice()->GetOutputParameters(); |
- return media::AudioParameters( |
- preferred_params.format(), source_params_.channel_layout(), |
- source_params_.sample_rate(), source_params_.bits_per_sample(), |
- preferred_params.frames_per_buffer() * source_params_.sample_rate() / |
- preferred_params.sample_rate()); |
-} |
- |
-media::OutputDeviceStatus TrackAudioRenderer::GetDeviceStatus() { |
- DCHECK(task_runner_->BelongsToCurrentThread()); |
- if (!sink_.get()) |
- return media::OUTPUT_DEVICE_STATUS_ERROR_INTERNAL; |
- |
- return sink_->GetOutputDevice()->GetDeviceStatus(); |
-} |
- |
void TrackAudioRenderer::MaybeStartSink() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
DVLOG(1) << "TrackAudioRenderer::MaybeStartSink()"; |
- if (!sink_.get() || !source_params_.IsValid() || !playing_) |
+ if (!(sink_ && source_params_.IsValid() && playing_)) |
return; |
// Re-create the AudioShifter to drop old audio data and reset to a starting |
@@ -315,17 +294,26 @@ void TrackAudioRenderer::MaybeStartSink() { |
// time-sync state is invalid. |
CreateAudioShifter(); |
- if (sink_started_ || |
- sink_->GetOutputDevice()->GetDeviceStatus() != |
- media::OUTPUT_DEVICE_STATUS_OK) { |
+ media::OutputDevice* device = sink_->GetOutputDevice(); |
+ if (sink_started_ || !device || |
+ device->GetDeviceStatus() != media::OUTPUT_DEVICE_STATUS_OK) { |
return; |
} |
+ // Output parameters consist of the same channel layout and sample rate as the |
+ // source, but having the buffer duration preferred by the hardware. |
+ const media::AudioParameters& preferred_params = |
+ device->GetOutputParameters(); |
+ media::AudioParameters sink_params( |
+ preferred_params.format(), source_params_.channel_layout(), |
+ source_params_.sample_rate(), source_params_.bits_per_sample(), |
+ preferred_params.frames_per_buffer() * source_params_.sample_rate() / |
+ preferred_params.sample_rate()); |
DVLOG(1) << ("TrackAudioRenderer::MaybeStartSink() -- Starting sink. " |
"source_params_={") |
<< source_params_.AsHumanReadableString() << "}, sink parameters={" |
- << GetOutputParameters().AsHumanReadableString() << '}'; |
- sink_->Initialize(GetOutputParameters(), this); |
+ << sink_params.AsHumanReadableString() << '}'; |
+ sink_->Initialize(sink_params, this); |
sink_->Start(); |
sink_->SetVolume(volume_); |
sink_->Play(); // Not all the sinks play on start. |
@@ -345,7 +333,7 @@ void TrackAudioRenderer::ReconfigureSink(const media::AudioParameters& params) { |
return; |
source_params_ = params; |
- if (!sink_.get()) |
+ if (!sink_) |
return; // TrackAudioRenderer has not yet been started. |
// Stop |sink_| and re-create a new one to be initialized with different audio |