Index: media/renderers/audio_renderer_impl.cc |
diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc |
index 7cb22ffb1695abb831acbfac99a6b19983c33dae..955c60f87c595969ae5c2bc6fabf82f5c17b99e1 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_.is_null()); |
xhwang
2017/03/27 19:13:53
FYI:
I think you can do this now:
DCHECK(create
servolk
2017/03/27 22:34:12
Nice, thanks, I didn't know about this. Done.
|
// Tests may not have a power monitor. |
base::PowerMonitor* monitor = base::PowerMonitor::Get(); |
if (!monitor) |
@@ -334,12 +331,23 @@ 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(); |
+ |
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); |