Index: media/renderers/audio_renderer_impl.cc |
diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc |
index bda439c5e59075325bd72eaf4b8aa84f25cc5647..5853864bf278f19e39e9f5242d7bea761316da52 100644 |
--- a/media/renderers/audio_renderer_impl.cc |
+++ b/media/renderers/audio_renderer_impl.cc |
@@ -25,6 +25,7 @@ |
#include "media/base/demuxer_stream.h" |
#include "media/base/media_log.h" |
#include "media/base/media_switches.h" |
+#include "media/base/renderer_client.h" |
#include "media/base/timestamp_constants.h" |
#include "media/filters/audio_clock.h" |
#include "media/filters/decrypting_demuxer_stream.h" |
@@ -44,6 +45,7 @@ AudioRendererImpl::AudioRendererImpl( |
new AudioBufferStream(task_runner, std::move(decoders), media_log)), |
hardware_config_(hardware_config), |
media_log_(media_log), |
+ client_(nullptr), |
tick_clock_(new base::DefaultTickClock()), |
last_audio_memory_usage_(0), |
last_decoded_sample_rate_(0), |
@@ -311,38 +313,26 @@ void AudioRendererImpl::StartPlaying() { |
AttemptRead_Locked(); |
} |
-void AudioRendererImpl::Initialize( |
- DemuxerStream* stream, |
- const PipelineStatusCB& init_cb, |
- CdmContext* cdm_context, |
- const StatisticsCB& statistics_cb, |
- const BufferingStateCB& buffering_state_cb, |
- const base::Closure& ended_cb, |
- const PipelineStatusCB& error_cb, |
- const base::Closure& waiting_for_decryption_key_cb) { |
+void AudioRendererImpl::Initialize(DemuxerStream* stream, |
+ CdmContext* cdm_context, |
+ RendererClient* client, |
+ const PipelineStatusCB& init_cb) { |
DVLOG(1) << __FUNCTION__; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
+ DCHECK(client); |
DCHECK(stream); |
DCHECK_EQ(stream->type(), DemuxerStream::AUDIO); |
DCHECK(!init_cb.is_null()); |
- DCHECK(!statistics_cb.is_null()); |
- DCHECK(!buffering_state_cb.is_null()); |
- DCHECK(!ended_cb.is_null()); |
- DCHECK(!error_cb.is_null()); |
DCHECK_EQ(kUninitialized, state_); |
DCHECK(sink_.get()); |
state_ = kInitializing; |
+ client_ = client; |
// Always post |init_cb_| because |this| could be destroyed if initialization |
// failed. |
init_cb_ = BindToCurrentLoop(init_cb); |
- buffering_state_cb_ = buffering_state_cb; |
- ended_cb_ = ended_cb; |
- error_cb_ = error_cb; |
- statistics_cb_ = statistics_cb; |
- |
const AudioParameters& hw_params = hardware_config_.GetOutputConfig(); |
expecting_config_changes_ = stream->SupportsConfigChanges(); |
if (!expecting_config_changes_ || !hw_params.IsValid() || |
@@ -431,7 +421,10 @@ void AudioRendererImpl::Initialize( |
audio_buffer_stream_->Initialize( |
stream, base::Bind(&AudioRendererImpl::OnAudioBufferStreamInitialized, |
weak_factory_.GetWeakPtr()), |
- cdm_context, statistics_cb, waiting_for_decryption_key_cb); |
+ cdm_context, base::Bind(&AudioRendererImpl::OnStatisticsUpdate, |
+ weak_factory_.GetWeakPtr()), |
+ base::Bind(&AudioRendererImpl::OnWaitingForDecryptionKey, |
+ weak_factory_.GetWeakPtr())); |
} |
void AudioRendererImpl::OnAudioBufferStreamInitialized(bool success) { |
@@ -478,6 +471,31 @@ void AudioRendererImpl::OnAudioBufferStreamInitialized(bool success) { |
base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); |
} |
+void AudioRendererImpl::OnPlaybackError(PipelineStatus error) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ client_->OnError(error); |
+} |
+ |
+void AudioRendererImpl::OnPlaybackEnded() { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ client_->OnEnded(); |
+} |
+ |
+void AudioRendererImpl::OnStatisticsUpdate(const PipelineStatistics& stats) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ client_->OnStatisticsUpdate(stats); |
+} |
+ |
+void AudioRendererImpl::OnBufferingStateChange(BufferingState state) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ client_->OnBufferingStateChange(state); |
+} |
+ |
+void AudioRendererImpl::OnWaitingForDecryptionKey() { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ client_->OnWaitingForDecryptionKey(); |
+} |
+ |
void AudioRendererImpl::SetVolume(float volume) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
DCHECK(sink_.get()); |
@@ -612,7 +630,9 @@ bool AudioRendererImpl::HandleSplicerBuffer_Locked( |
PipelineStatistics stats; |
stats.audio_memory_usage = memory_usage - last_audio_memory_usage_; |
last_audio_memory_usage_ = memory_usage; |
- task_runner_->PostTask(FROM_HERE, base::Bind(statistics_cb_, stats)); |
+ task_runner_->PostTask(FROM_HERE, |
+ base::Bind(&AudioRendererImpl::OnStatisticsUpdate, |
+ weak_factory_.GetWeakPtr(), stats)); |
switch (state_) { |
case kUninitialized: |
@@ -824,7 +844,9 @@ int AudioRendererImpl::Render(AudioBus* audio_bus, |
if (audio_clock_->front_timestamp() >= ended_timestamp_ && |
!rendered_end_of_stream_) { |
rendered_end_of_stream_ = true; |
- task_runner_->PostTask(FROM_HERE, ended_cb_); |
+ task_runner_->PostTask(FROM_HERE, |
+ base::Bind(&AudioRendererImpl::OnPlaybackEnded, |
+ weak_factory_.GetWeakPtr())); |
} |
} |
@@ -836,8 +858,9 @@ void AudioRendererImpl::OnRenderError() { |
MEDIA_LOG(ERROR, media_log_) << "audio render error"; |
// Post to |task_runner_| as this is called on the audio callback thread. |
- task_runner_->PostTask(FROM_HERE, |
- base::Bind(error_cb_, AUDIO_RENDERER_ERROR)); |
+ task_runner_->PostTask( |
+ FROM_HERE, base::Bind(&AudioRendererImpl::OnPlaybackError, |
+ weak_factory_.GetWeakPtr(), AUDIO_RENDERER_ERROR)); |
} |
void AudioRendererImpl::HandleAbortedReadOrDecodeError(PipelineStatus status) { |
@@ -858,7 +881,7 @@ void AudioRendererImpl::HandleAbortedReadOrDecodeError(PipelineStatus status) { |
MEDIA_LOG(ERROR, media_log_) << "audio error during flushing, status: " |
<< MediaLog::PipelineStatusToString(status); |
- error_cb_.Run(status); |
+ client_->OnError(status); |
base::ResetAndReturn(&flush_cb_).Run(); |
return; |
@@ -868,7 +891,7 @@ void AudioRendererImpl::HandleAbortedReadOrDecodeError(PipelineStatus status) { |
MEDIA_LOG(ERROR, media_log_) |
<< "audio error during playing, status: " |
<< MediaLog::PipelineStatusToString(status); |
- error_cb_.Run(status); |
+ client_->OnError(status); |
} |
return; |
} |
@@ -904,8 +927,9 @@ void AudioRendererImpl::SetBufferingState_Locked( |
lock_.AssertAcquired(); |
buffering_state_ = buffering_state; |
- task_runner_->PostTask(FROM_HERE, |
- base::Bind(buffering_state_cb_, buffering_state_)); |
+ task_runner_->PostTask( |
+ FROM_HERE, base::Bind(&AudioRendererImpl::OnBufferingStateChange, |
+ weak_factory_.GetWeakPtr(), buffering_state_)); |
} |
} // namespace media |