Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Unified Diff: media/renderers/audio_renderer_impl.cc

Issue 2684103005: Allow media track switching. (Closed)
Patch Set: Added a LayoutTest for media track switching Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698