Index: media/renderers/audio_renderer_impl.cc |
diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc |
index 596603b96f99dbda5c65adf925e85025ee78dd79..523d5d6dccae05255b6bd1e7b0815c341fc82585 100644 |
--- a/media/renderers/audio_renderer_impl.cc |
+++ b/media/renderers/audio_renderer_impl.cc |
@@ -36,13 +36,11 @@ namespace media { |
AudioRendererImpl::AudioRendererImpl( |
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
media::AudioRendererSink* sink, |
- ScopedVector<AudioDecoder> decoders, |
+ const CreateAudioDecodersCB& create_audio_decoders_cb, |
const scoped_refptr<MediaLog>& media_log) |
: task_runner_(task_runner), |
expecting_config_changes_(false), |
sink_(sink), |
- audio_buffer_stream_( |
- new AudioBufferStream(task_runner, std::move(decoders), media_log)), |
media_log_(media_log), |
client_(nullptr), |
tick_clock_(new base::DefaultTickClock()), |
@@ -51,6 +49,7 @@ AudioRendererImpl::AudioRendererImpl( |
last_decoded_channel_layout_(CHANNEL_LAYOUT_NONE), |
playback_rate_(0.0), |
state_(kUninitialized), |
+ create_audio_decoders_cb_(create_audio_decoders_cb), |
buffering_state_(BUFFERING_HAVE_NOTHING), |
rendering_(false), |
sink_playing_(false), |
@@ -59,9 +58,7 @@ AudioRendererImpl::AudioRendererImpl( |
rendered_end_of_stream_(false), |
is_suspending_(false), |
weak_factory_(this) { |
- audio_buffer_stream_->set_config_change_observer(base::Bind( |
- &AudioRendererImpl::OnConfigChange, weak_factory_.GetWeakPtr())); |
- |
+ DCHECK(create_audio_decoders_cb_); |
// Tests may not have a power monitor. |
base::PowerMonitor* monitor = base::PowerMonitor::Get(); |
if (!monitor) |
@@ -340,9 +337,16 @@ void AudioRendererImpl::Initialize(DemuxerStream* stream, |
DCHECK(stream); |
DCHECK_EQ(stream->type(), DemuxerStream::AUDIO); |
DCHECK(!init_cb.is_null()); |
- DCHECK_EQ(kUninitialized, state_); |
+ DCHECK(state_ == kUninitialized || state_ == kFlushed); |
DCHECK(sink_.get()); |
+ // If we are re-initializing playback (e.g. switching media tracks), stop the |
+ // sink first. |
+ if (state_ == kFlushed) { |
+ sink_->Stop(); |
+ audio_clock_.reset(); |
+ } |
+ |
// Trying to track down AudioClock crash, http://crbug.com/674856. |
// AudioRenderImpl should only be initialized once to avoid destroying |
// AudioClock while the audio thread is still using it. |
@@ -351,6 +355,12 @@ void AudioRendererImpl::Initialize(DemuxerStream* stream, |
state_ = kInitializing; |
client_ = client; |
+ audio_buffer_stream_ = base::MakeUnique<AudioBufferStream>( |
+ task_runner_, create_audio_decoders_cb_.Run(), media_log_); |
+ |
+ audio_buffer_stream_->set_config_change_observer(base::Bind( |
+ &AudioRendererImpl::OnConfigChange, weak_factory_.GetWeakPtr())); |
+ |
// Always post |init_cb_| because |this| could be destroyed if initialization |
// failed. |
init_cb_ = BindToCurrentLoop(init_cb); |