Chromium Code Reviews| Index: media/filters/audio_renderer_impl.cc |
| diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc |
| index f08ef83b418a5fb97808f973c9428ee899243817..82d887497abc66739791826928c9998ad2ea8e9a 100644 |
| --- a/media/filters/audio_renderer_impl.cc |
| +++ b/media/filters/audio_renderer_impl.cc |
| @@ -44,8 +44,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), |
| @@ -55,10 +56,10 @@ AudioRendererImpl::AudioRendererImpl( |
| audio_time_buffered_(kNoTimestamp()), |
| current_time_(kNoTimestamp()), |
| underflow_disabled_(false), |
| - preroll_aborted_(false) { |
| -} |
| + preroll_aborted_(false) {} |
| AudioRendererImpl::~AudioRendererImpl() { |
| + base::AutoLock auto_lock(lock_); |
|
DaleCurtis
2014/02/21 21:48:48
What's this for? To ensure outstanding calls have
rileya (GONE FROM CHROMIUM)
2014/02/21 23:04:02
Yeah, I added this because of VRI doing it, I wasn
xhwang
2014/02/21 23:57:56
Yeah, this shouldn't be necessary unless someone i
rileya (GONE FROM CHROMIUM)
2014/02/24 21:04:11
Alright, removed it. The one in VRI should probabl
|
| // Stop() should have been called and |algorithm_| should have been destroyed. |
| DCHECK(state_ == kUninitialized || state_ == kStopped); |
| DCHECK(!algorithm_.get()); |
| @@ -145,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() { |
| @@ -194,10 +185,6 @@ void AudioRendererImpl::Stop(const base::Closure& callback) { |
| { |
| base::AutoLock auto_lock(lock_); |
| - if (state_ == kInitializing) { |
| - decoder_selector_->Abort(); |
| - return; |
| - } |
| if (state_ == kStopped) { |
| task_runner_->PostTask(FROM_HERE, base::ResetAndReturn(&stop_cb_)); |
| @@ -216,12 +203,7 @@ void AudioRendererImpl::Stop(const base::Closure& callback) { |
| sink_ = NULL; |
| } |
| - if (decoder_) { |
| - decoder_->Stop(base::ResetAndReturn(&stop_cb_)); |
| - return; |
| - } |
| - |
| - task_runner_->PostTask(FROM_HERE, base::ResetAndReturn(&stop_cb_)); |
| + audio_buffer_stream_.Stop(base::ResetAndReturn(&stop_cb_)); |
| } |
| void AudioRendererImpl::Preroll(base::TimeDelta time, |
| @@ -266,53 +248,45 @@ 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()); |
| - if (!decoder) { |
| - { |
| - 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); |
| - } |
| + base::AutoLock auto_lock(lock_); |
| + |
| + if (!success) { |
| + state_ = kUninitialized; |
| + base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
| return; |
| } |
| - base::AutoLock auto_lock(lock_); |
| - decoder_ = decoder.Pass(); |
| - decrypting_demuxer_stream_ = decrypting_demuxer_stream.Pass(); |
| - |
| - 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. |
|
rileya (GONE FROM CHROMIUM)
2014/02/19 22:37:51
This will require some plumbing that's beyond the
DaleCurtis
2014/02/21 21:48:48
My plan was for ARI and ARA to be agnostic to conf
|
| + 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); |
| @@ -368,7 +342,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()); |
| @@ -379,17 +353,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) { |
| @@ -496,7 +471,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() { |