| Index: media/filters/audio_renderer_base.cc
|
| diff --git a/media/filters/audio_renderer_base.cc b/media/filters/audio_renderer_base.cc
|
| index bbf485adef7cdb902ac84ffdb29884e62e15aaa0..0162f6650416d4743a458fd40d4a6a183afafa9c 100644
|
| --- a/media/filters/audio_renderer_base.cc
|
| +++ b/media/filters/audio_renderer_base.cc
|
| @@ -17,8 +17,9 @@ namespace media {
|
| AudioRendererBase::AudioRendererBase()
|
| : state_(kUninitialized),
|
| pending_read_(false),
|
| - recieved_end_of_stream_(false),
|
| + received_end_of_stream_(false),
|
| rendered_end_of_stream_(false),
|
| + bytes_per_frame_(0),
|
| read_cb_(base::Bind(&AudioRendererBase::DecodedAudioReady,
|
| base::Unretained(this))) {
|
| }
|
| @@ -81,7 +82,7 @@ void AudioRendererBase::Seek(base::TimeDelta time, const FilterStatusCB& cb) {
|
|
|
| // Throw away everything and schedule our reads.
|
| last_fill_buffer_time_ = base::TimeDelta();
|
| - recieved_end_of_stream_ = false;
|
| + received_end_of_stream_ = false;
|
| rendered_end_of_stream_ = false;
|
|
|
| // |algorithm_| will request more reads.
|
| @@ -113,6 +114,8 @@ void AudioRendererBase::Initialize(const scoped_refptr<AudioDecoder>& decoder,
|
| int channels = ChannelLayoutToChannelCount(channel_layout);
|
| int bits_per_channel = decoder_->bits_per_channel();
|
| int sample_rate = decoder_->samples_per_second();
|
| + // TODO(vrk): Add method to AudioDecoder to compute bytes per frame.
|
| + bytes_per_frame_ = channels * bits_per_channel / 8;
|
|
|
| bool config_ok = algorithm_->ValidateConfig(channels, sample_rate,
|
| bits_per_channel);
|
| @@ -133,11 +136,9 @@ void AudioRendererBase::Initialize(const scoped_refptr<AudioDecoder>& decoder,
|
|
|
| bool AudioRendererBase::HasEnded() {
|
| base::AutoLock auto_lock(lock_);
|
| - if (rendered_end_of_stream_) {
|
| - DCHECK(algorithm_->IsQueueEmpty())
|
| - << "Audio queue should be empty if we have rendered end of stream";
|
| - }
|
| - return recieved_end_of_stream_ && rendered_end_of_stream_;
|
| + DCHECK(!rendered_end_of_stream_ || algorithm_->NeedsMoreData());
|
| +
|
| + return received_end_of_stream_ && rendered_end_of_stream_;
|
| }
|
|
|
| void AudioRendererBase::ResumeAfterUnderflow(bool buffer_more_audio) {
|
| @@ -159,7 +160,7 @@ void AudioRendererBase::DecodedAudioReady(scoped_refptr<Buffer> buffer) {
|
| pending_read_ = false;
|
|
|
| if (buffer && buffer->IsEndOfStream()) {
|
| - recieved_end_of_stream_ = true;
|
| + received_end_of_stream_ = true;
|
|
|
| // Transition to kPlaying if we are currently handling an underflow since
|
| // no more data will be arriving.
|
| @@ -202,12 +203,12 @@ void AudioRendererBase::DecodedAudioReady(scoped_refptr<Buffer> buffer) {
|
| }
|
|
|
| uint32 AudioRendererBase::FillBuffer(uint8* dest,
|
| - uint32 dest_len,
|
| + uint32 requested_frames,
|
| const base::TimeDelta& playback_delay) {
|
| // The timestamp of the last buffer written during the last call to
|
| // FillBuffer().
|
| base::TimeDelta last_fill_buffer_time;
|
| - size_t dest_written = 0;
|
| + size_t frames_written = 0;
|
| base::Closure underflow_cb;
|
| {
|
| base::AutoLock auto_lock(lock_);
|
| @@ -224,9 +225,10 @@ uint32 AudioRendererBase::FillBuffer(uint8* dest,
|
| //
|
| // This should get handled by the subclass http://crbug.com/106600
|
| const uint32 kZeroLength = 8192;
|
| - dest_written = std::min(kZeroLength, dest_len);
|
| - memset(dest, 0, dest_written);
|
| - return dest_written;
|
| + size_t zeros_to_write =
|
| + std::min(kZeroLength, requested_frames * bytes_per_frame_);
|
| + memset(dest, 0, zeros_to_write);
|
| + return zeros_to_write / bytes_per_frame_;
|
| }
|
|
|
| // Save a local copy of last fill buffer time and reset the member.
|
| @@ -234,9 +236,9 @@ uint32 AudioRendererBase::FillBuffer(uint8* dest,
|
| last_fill_buffer_time_ = base::TimeDelta();
|
|
|
| // Use three conditions to determine the end of playback:
|
| - // 1. Algorithm has no audio data. (algorithm_->IsQueueEmpty() == true)
|
| - // 2. We've recieved an end of stream buffer.
|
| - // (recieved_end_of_stream_ == true)
|
| + // 1. Algorithm needs more audio data.
|
| + // 2. We've received an end of stream buffer.
|
| + // (received_end_of_stream_ == true)
|
| // 3. Browser process has no audio data being played.
|
| // There is no way to check that condition that would work for all
|
| // derived classes, so call virtual method that would either render
|
| @@ -246,8 +248,8 @@ uint32 AudioRendererBase::FillBuffer(uint8* dest,
|
| // 1. Algorithm has no audio data.
|
| // 2. Currently in the kPlaying state.
|
| // 3. Have not received an end of stream buffer.
|
| - if (algorithm_->IsQueueEmpty()) {
|
| - if (recieved_end_of_stream_) {
|
| + if (algorithm_->NeedsMoreData()) {
|
| + if (received_end_of_stream_) {
|
| OnRenderEndOfStream();
|
| } else if (state_ == kPlaying) {
|
| state_ = kUnderflow;
|
| @@ -255,7 +257,7 @@ uint32 AudioRendererBase::FillBuffer(uint8* dest,
|
| }
|
| } else {
|
| // Otherwise fill the buffer.
|
| - dest_written = algorithm_->FillBuffer(dest, dest_len);
|
| + frames_written = algorithm_->FillBuffer(dest, requested_frames);
|
| }
|
|
|
| // Get the current time.
|
| @@ -273,11 +275,11 @@ uint32 AudioRendererBase::FillBuffer(uint8* dest,
|
| if (!underflow_cb.is_null())
|
| underflow_cb.Run();
|
|
|
| - return dest_written;
|
| + return frames_written;
|
| }
|
|
|
| void AudioRendererBase::SignalEndOfStream() {
|
| - DCHECK(recieved_end_of_stream_);
|
| + DCHECK(received_end_of_stream_);
|
| if (!rendered_end_of_stream_) {
|
| rendered_end_of_stream_ = true;
|
| host()->NotifyEnded();
|
|
|