| Index: media/renderers/audio_renderer_impl.cc
|
| diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc
|
| index c478bbd2d7dd25bd6db0e5c4bc2b7561b0c83cda..ce94d751ce42fbe6eb1a3dcb845fe977734775f2 100644
|
| --- a/media/renderers/audio_renderer_impl.cc
|
| +++ b/media/renderers/audio_renderer_impl.cc
|
| @@ -363,14 +363,17 @@ void AudioRendererImpl::Initialize(DemuxerStream* stream,
|
| if (!expecting_config_changes_ || !hw_params.IsValid() ||
|
| hw_params.format() == AudioParameters::AUDIO_FAKE) {
|
| // 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 = stream->audio_decoder_config().samples_per_second() / 100;
|
| - audio_parameters_.Reset(
|
| - AudioParameters::AUDIO_PCM_LOW_LATENCY,
|
| - stream->audio_decoder_config().channel_layout(),
|
| - stream->audio_decoder_config().samples_per_second(),
|
| - stream->audio_decoder_config().bits_per_channel(),
|
| - buffer_size);
|
| + // provided to Render(), but we should choose a value here based on hardware
|
| + // parameters if possible since it affects the initial buffer size used by
|
| + // the algorithm. Too little will cause underflow on Bluetooth devices.
|
| + int buffer_size =
|
| + std::max(stream->audio_decoder_config().samples_per_second() / 100,
|
| + hw_params.IsValid() ? hw_params.frames_per_buffer() : 0);
|
| + audio_parameters_.Reset(AudioParameters::AUDIO_PCM_LOW_LATENCY,
|
| + stream->audio_decoder_config().channel_layout(),
|
| + stream->audio_decoder_config().samples_per_second(),
|
| + stream->audio_decoder_config().bits_per_channel(),
|
| + buffer_size);
|
| buffer_converter_.reset();
|
| } else {
|
| // To allow for seamless sample rate adaptations (i.e. changes from say
|
| @@ -865,6 +868,10 @@ int AudioRendererImpl::Render(AudioBus* audio_bus,
|
| algorithm_->IncreaseQueueCapacity();
|
| SetBufferingState_Locked(BUFFERING_HAVE_NOTHING);
|
| }
|
| + } else if (frames_written < frames_requested && !received_end_of_stream_) {
|
| + // If we only partially filled the request and should have more data, go
|
| + // ahead and increase queue capacity to try and meet the next request.
|
| + algorithm_->IncreaseQueueCapacity();
|
| }
|
|
|
| audio_clock_->WroteAudio(frames_written + frames_after_end_of_stream,
|
|
|