Index: media/filters/audio_renderer_impl.cc |
diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc |
index 182e1490534cca2546ce4caaca39c21eabd86d63..1da4d51b4fd38c6ae29a8dcdbe4d555f3f634dee 100644 |
--- a/media/filters/audio_renderer_impl.cc |
+++ b/media/filters/audio_renderer_impl.cc |
@@ -45,8 +45,9 @@ AudioRendererImpl::AudioRendererImpl( |
: task_runner_(task_runner), |
weak_factory_(this), |
sink_(sink), |
- decoder_selector_(new AudioDecoderSelector( |
- task_runner, decoders.Pass(), set_decryptor_ready_cb)), |
+ audio_buffer_stream_(task_runner, |
+ decoders.Pass(), |
+ set_decryptor_ready_cb), |
now_cb_(base::Bind(&base::TimeTicks::Now)), |
state_(kUninitialized), |
sink_playing_(false), |
@@ -56,8 +57,7 @@ AudioRendererImpl::AudioRendererImpl( |
audio_time_buffered_(kNoTimestamp()), |
current_time_(kNoTimestamp()), |
underflow_disabled_(false), |
- preroll_aborted_(false) { |
-} |
+ preroll_aborted_(false) {} |
AudioRendererImpl::~AudioRendererImpl() { |
// Stop() should have been called and |algorithm_| should have been destroyed. |
@@ -146,18 +146,8 @@ void AudioRendererImpl::DoFlush_Locked() { |
DCHECK(!pending_read_); |
DCHECK_EQ(state_, kPaused); |
- if (decrypting_demuxer_stream_) { |
- decrypting_demuxer_stream_->Reset( |
- base::Bind(&AudioRendererImpl::ResetDecoder, weak_this_)); |
- return; |
- } |
- |
- ResetDecoder(); |
-} |
- |
-void AudioRendererImpl::ResetDecoder() { |
- DCHECK(task_runner_->BelongsToCurrentThread()); |
- decoder_->Reset(base::Bind(&AudioRendererImpl::ResetDecoderDone, weak_this_)); |
+ audio_buffer_stream_.Reset( |
+ base::Bind(&AudioRendererImpl::ResetDecoderDone, weak_this_)); |
} |
void AudioRendererImpl::ResetDecoderDone() { |
@@ -186,22 +176,15 @@ void AudioRendererImpl::ResetDecoderDone() { |
void AudioRendererImpl::Stop(const base::Closure& callback) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
DCHECK(!callback.is_null()); |
- DCHECK(stop_cb_.is_null()); |
- |
- stop_cb_ = callback; |
// TODO(scherkus): Consider invalidating |weak_factory_| and replacing |
// task-running guards that check |state_| with DCHECK(). |
{ |
base::AutoLock auto_lock(lock_); |
- if (state_ == kInitializing) { |
- decoder_selector_->Abort(); |
- return; |
- } |
if (state_ == kStopped) { |
- task_runner_->PostTask(FROM_HERE, base::ResetAndReturn(&stop_cb_)); |
+ task_runner_->PostTask(FROM_HERE, callback); |
return; |
} |
@@ -217,25 +200,7 @@ void AudioRendererImpl::Stop(const base::Closure& callback) { |
sink_ = NULL; |
} |
- if (decrypting_demuxer_stream_) { |
- decrypting_demuxer_stream_->Stop( |
- base::Bind(&AudioRendererImpl::StopDecoder, weak_this_)); |
- return; |
- } |
- |
- StopDecoder(); |
-} |
- |
-void AudioRendererImpl::StopDecoder() { |
- DCHECK(task_runner_->BelongsToCurrentThread()); |
- DCHECK(!stop_cb_.is_null()); |
- |
- if (decoder_) { |
- decoder_->Stop(base::ResetAndReturn(&stop_cb_)); |
- return; |
- } |
- |
- task_runner_->PostTask(FROM_HERE, base::ResetAndReturn(&stop_cb_)); |
+ audio_buffer_stream_.Stop(callback); |
} |
void AudioRendererImpl::Preroll(base::TimeDelta time, |
@@ -280,53 +245,49 @@ void AudioRendererImpl::Initialize(DemuxerStream* stream, |
weak_this_ = weak_factory_.GetWeakPtr(); |
init_cb_ = init_cb; |
- statistics_cb_ = statistics_cb; |
underflow_cb_ = underflow_cb; |
time_cb_ = time_cb; |
ended_cb_ = ended_cb; |
disabled_cb_ = disabled_cb; |
error_cb_ = error_cb; |
- decoder_selector_->SelectDecoder( |
+ audio_buffer_stream_.Initialize( |
stream, |
statistics_cb, |
- base::Bind(&AudioRendererImpl::OnDecoderSelected, weak_this_)); |
+ base::Bind(&AudioRendererImpl::OnAudioBufferStreamInitialized, |
+ weak_this_)); |
} |
-void AudioRendererImpl::OnDecoderSelected( |
- scoped_ptr<AudioDecoder> decoder, |
- scoped_ptr<DecryptingDemuxerStream> decrypting_demuxer_stream) { |
+void AudioRendererImpl::OnAudioBufferStreamInitialized(bool success) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- scoped_ptr<AudioDecoderSelector> deleter(decoder_selector_.Pass()); |
- decoder_ = decoder.Pass(); |
+ base::AutoLock auto_lock(lock_); |
- if (!decoder_ || !stop_cb_.is_null()) { |
- { |
- base::AutoLock auto_lock(lock_); |
- ChangeState_Locked(kUninitialized); |
- } |
- // Stop() called during initialization. |
- if (!stop_cb_.is_null()) { |
- base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT); |
- Stop(base::ResetAndReturn(&stop_cb_)); |
- } else { |
- base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
- } |
+ if (state_ == kStopped) { |
+ base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT); |
return; |
} |
- base::AutoLock auto_lock(lock_); |
- decrypting_demuxer_stream_ = decrypting_demuxer_stream.Pass(); |
+ if (!success) { |
+ state_ = kUninitialized; |
+ base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
+ return; |
+ } |
- int sample_rate = decoder_->samples_per_second(); |
+ int sample_rate = audio_buffer_stream_.decoder()->samples_per_second(); |
// The actual buffer size is controlled via the size of the AudioBus |
// provided to Render(), so just choose something reasonable here for looks. |
- int buffer_size = decoder_->samples_per_second() / 100; |
- audio_parameters_ = AudioParameters( |
- AudioParameters::AUDIO_PCM_LOW_LATENCY, decoder_->channel_layout(), |
- sample_rate, decoder_->bits_per_channel(), buffer_size); |
+ int buffer_size = audio_buffer_stream_.decoder()->samples_per_second() / 100; |
+ |
+ // TODO(rileya): Remove the channel_layout/bits_per_channel/samples_per_second |
+ // getters from AudioDecoder, and adjust this accordingly. |
+ audio_parameters_ = |
+ AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, |
+ audio_buffer_stream_.decoder()->channel_layout(), |
+ sample_rate, |
+ audio_buffer_stream_.decoder()->bits_per_channel(), |
+ buffer_size); |
if (!audio_parameters_.IsValid()) { |
ChangeState_Locked(kUninitialized); |
base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_INITIALIZATION_FAILED); |
@@ -382,7 +343,7 @@ void AudioRendererImpl::SetVolume(float volume) { |
} |
void AudioRendererImpl::DecodedAudioReady( |
- AudioDecoder::Status status, |
+ AudioBufferStream::Status status, |
const scoped_refptr<AudioBuffer>& buffer) { |
DVLOG(1) << __FUNCTION__ << "(" << status << ")"; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
@@ -393,17 +354,18 @@ void AudioRendererImpl::DecodedAudioReady( |
CHECK(pending_read_); |
pending_read_ = false; |
- if (status == AudioDecoder::kAborted) { |
+ if (status == AudioBufferStream::ABORTED || |
+ status == AudioBufferStream::DEMUXER_READ_ABORTED) { |
HandleAbortedReadOrDecodeError(false); |
return; |
} |
- if (status == AudioDecoder::kDecodeError) { |
+ if (status == AudioBufferStream::DECODE_ERROR) { |
HandleAbortedReadOrDecodeError(true); |
return; |
} |
- DCHECK_EQ(status, AudioDecoder::kOk); |
+ DCHECK_EQ(status, AudioBufferStream::OK); |
DCHECK(buffer.get()); |
if (state_ == kFlushing) { |
@@ -510,7 +472,8 @@ void AudioRendererImpl::AttemptRead_Locked() { |
return; |
pending_read_ = true; |
- decoder_->Read(base::Bind(&AudioRendererImpl::DecodedAudioReady, weak_this_)); |
+ audio_buffer_stream_.Read( |
+ base::Bind(&AudioRendererImpl::DecodedAudioReady, weak_this_)); |
} |
bool AudioRendererImpl::CanRead_Locked() { |