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 2dab6018b8982cc9ab31afa29a568ecdeddf47c4..7998a8354be26949ee8a9eb32ee984d3d8642cec 100644 |
| --- a/media/filters/audio_renderer_impl.cc |
| +++ b/media/filters/audio_renderer_impl.cc |
| @@ -15,6 +15,8 @@ |
| #include "base/metrics/histogram.h" |
| #include "base/single_thread_task_runner.h" |
| #include "media/base/audio_buffer.h" |
| +#include "media/base/audio_buffer_converter.h" |
| +#include "media/base/audio_hardware_config.h" |
| #include "media/base/audio_splicer.h" |
| #include "media/base/bind_to_current_loop.h" |
| #include "media/base/demuxer_stream.h" |
| @@ -41,12 +43,14 @@ AudioRendererImpl::AudioRendererImpl( |
| const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| media::AudioRendererSink* sink, |
| ScopedVector<AudioDecoder> decoders, |
| - const SetDecryptorReadyCB& set_decryptor_ready_cb) |
| + const SetDecryptorReadyCB& set_decryptor_ready_cb, |
| + const AudioHardwareConfig& hardware_config) |
| : task_runner_(task_runner), |
| sink_(sink), |
| audio_buffer_stream_(task_runner, |
| decoders.Pass(), |
| set_decryptor_ready_cb), |
| + hardware_config_(hardware_config), |
| now_cb_(base::Bind(&base::TimeTicks::Now)), |
| state_(kUninitialized), |
| sink_playing_(false), |
| @@ -168,6 +172,8 @@ void AudioRendererImpl::ResetDecoderDone() { |
| earliest_end_time_ = now_cb_.Run(); |
| splicer_->Reset(); |
| + // TODO: add a Reset() or Flush() |
|
rileya (GONE FROM CHROMIUM)
2014/03/20 00:55:11
This is an immediate TODO for this CL that I forgo
|
| + buffer_converter_.reset(new AudioBufferConverter(audio_parameters_)); |
| algorithm_->FlushBuffers(); |
| } |
| base::ResetAndReturn(&flush_cb_).Run(); |
| @@ -273,27 +279,17 @@ void AudioRendererImpl::OnAudioBufferStreamInitialized(bool success) { |
| return; |
| } |
| - int sample_rate = audio_buffer_stream_.decoder()->samples_per_second(); |
| + // TODO(rileya): Support hardware config changes |
| + audio_parameters_ = hardware_config_.GetOutputConfig(); |
| - // 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 = 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); |
| return; |
| } |
| - splicer_.reset(new AudioSplicer(sample_rate)); |
| + buffer_converter_.reset(new AudioBufferConverter(audio_parameters_)); |
| + splicer_.reset(new AudioSplicer(audio_parameters_.sample_rate())); |
| // We're all good! Continue initializing the rest of the audio renderer |
| // based on the decoder format. |
| @@ -373,19 +369,26 @@ void AudioRendererImpl::DecodedAudioReady( |
| return; |
| } |
| - if (!splicer_->AddInput(buffer)) { |
| - HandleAbortedReadOrDecodeError(true); |
| - return; |
| - } |
| + buffer_converter_->AddInput(buffer); |
| + bool need_another_buffer = false; |
|
DaleCurtis
2014/03/20 19:29:01
Move with while below?
rileya (GONE FROM CHROMIUM)
2014/03/21 20:58:49
Done.
|
| - if (!splicer_->HasNextBuffer()) { |
| + if (!buffer_converter_->HasNextBuffer()) { |
| AttemptRead_Locked(); |
| return; |
| } |
| - bool need_another_buffer = false; |
| - while (splicer_->HasNextBuffer()) |
| - need_another_buffer = HandleSplicerBuffer(splicer_->GetNextBuffer()); |
| + while (buffer_converter_->HasNextBuffer()) { |
| + scoped_refptr<AudioBuffer> converted_buffer = |
| + buffer_converter_->GetNextBuffer(); |
| + |
| + if (!splicer_->AddInput(converted_buffer)) { |
| + HandleAbortedReadOrDecodeError(true); |
| + return; |
| + } |
| + |
| + while (splicer_->HasNextBuffer()) |
| + need_another_buffer = HandleSplicerBuffer(splicer_->GetNextBuffer()); |
| + } |
| if (!need_another_buffer && !CanRead_Locked()) |
| return; |
| @@ -395,6 +398,7 @@ void AudioRendererImpl::DecodedAudioReady( |
| bool AudioRendererImpl::HandleSplicerBuffer( |
| const scoped_refptr<AudioBuffer>& buffer) { |
| + |
|
DaleCurtis
2014/03/20 19:29:01
No extra line.
rileya (GONE FROM CHROMIUM)
2014/03/21 20:58:49
Done.
|
| if (buffer->end_of_stream()) { |
| received_end_of_stream_ = true; |