| 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..c4ae69e5c3374def96dc3e6e504cf310b5bcb207 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() {
|
| +media::OutputDeviceInfo TrackAudioRenderer::GetOutputDeviceInfo() {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| - return this;
|
| + return sink_ ? sink_->GetOutputDeviceInfo() : media::OutputDeviceInfo();
|
| }
|
|
|
| base::TimeDelta TrackAudioRenderer::GetCurrentRenderTime() const {
|
| @@ -243,7 +243,7 @@ bool TrackAudioRenderer::IsLocalRenderer() const {
|
| void TrackAudioRenderer::SwitchOutputDevice(
|
| const std::string& device_id,
|
| const url::Origin& security_origin,
|
| - const media::SwitchOutputDeviceCB& callback) {
|
| + const media::OutputDeviceStatusCB& callback) {
|
| DVLOG(1) << "TrackAudioRenderer::SwitchOutputDevice()";
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
|
|
| @@ -256,8 +256,9 @@ void TrackAudioRenderer::SwitchOutputDevice(
|
| AudioDeviceFactory::NewAudioRendererSink(
|
| AudioDeviceFactory::kSourceNonRtcAudioTrack, playout_render_frame_id_,
|
| session_id_, device_id, security_origin);
|
| +
|
| media::OutputDeviceStatus new_sink_status =
|
| - new_sink->GetOutputDevice()->GetDeviceStatus();
|
| + new_sink->GetOutputDeviceInfo().device_status();
|
| if (new_sink_status != media::OUTPUT_DEVICE_STATUS_OK) {
|
| callback.Run(new_sink_status);
|
| return;
|
| @@ -267,7 +268,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 +279,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 +292,26 @@ void TrackAudioRenderer::MaybeStartSink() {
|
| // time-sync state is invalid.
|
| CreateAudioShifter();
|
|
|
| - if (sink_started_ ||
|
| - sink_->GetOutputDevice()->GetDeviceStatus() !=
|
| - media::OUTPUT_DEVICE_STATUS_OK) {
|
| + if (sink_started_)
|
| return;
|
| - }
|
|
|
| + const media::OutputDeviceInfo& device_info = sink_->GetOutputDeviceInfo();
|
| + if (device_info.device_status() != 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& hardware_params = device_info.output_params();
|
| + media::AudioParameters sink_params(
|
| + hardware_params.format(), source_params_.channel_layout(),
|
| + source_params_.sample_rate(), source_params_.bits_per_sample(),
|
| + hardware_params.frames_per_buffer() * source_params_.sample_rate() /
|
| + hardware_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 +331,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
|
|
|