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

Unified Diff: media/renderers/audio_renderer_impl.cc

Issue 2684103005: Allow media track switching. (Closed)
Patch Set: Fixed comments Created 3 years, 8 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
« no previous file with comments | « media/renderers/audio_renderer_impl.h ('k') | media/renderers/audio_renderer_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « media/renderers/audio_renderer_impl.h ('k') | media/renderers/audio_renderer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698