| Index: content/renderer/media/audio_renderer_impl.cc
|
| ===================================================================
|
| --- content/renderer/media/audio_renderer_impl.cc (revision 113847)
|
| +++ content/renderer/media/audio_renderer_impl.cc (working copy)
|
| @@ -38,7 +38,8 @@
|
| AudioRendererImpl::AudioRendererImpl()
|
| : AudioRendererBase(),
|
| bytes_per_second_(0),
|
| - stopped_(false) {
|
| + stopped_(false),
|
| + prepopulated_(false) {
|
| // We create the AudioDevice here because it must be created in the
|
| // main thread. But we don't yet know the audio format (sample-rate, etc.)
|
| // at this point. Later, when OnInitialize() is called, we have
|
| @@ -192,14 +193,22 @@
|
| audio_device_->Pause(true);
|
| }
|
|
|
| -void AudioRendererImpl::Render(const std::vector<float*>& audio_data,
|
| - size_t number_of_frames,
|
| - size_t audio_delay_milliseconds) {
|
| +size_t AudioRendererImpl::Render(const std::vector<float*>& audio_data,
|
| + size_t number_of_frames,
|
| + size_t audio_delay_milliseconds) {
|
| + // Ignore first pre-populating call.
|
| + // It is issued when creating the stream, and there was no request for data
|
| + // from AudioSyncReader. We will get that first request when player issue
|
| + // "play" command.
|
| + if (!prepopulated_) {
|
| + prepopulated_ = true;
|
| + return 0;
|
| + }
|
| if (stopped_ || GetPlaybackRate() == 0.0f) {
|
| // Output silence if stopped.
|
| for (size_t i = 0; i < audio_data.size(); ++i)
|
| memset(audio_data[i], 0, sizeof(float) * number_of_frames);
|
| - return;
|
| + return 0;
|
| }
|
|
|
| // Adjust the playback delay.
|
| @@ -227,6 +236,7 @@
|
| request_delay,
|
| time_now >= earliest_end_time_);
|
| DCHECK_LE(filled, buf_size);
|
| + UpdateEarliestEndTime(filled, request_delay, time_now);
|
|
|
| uint32 filled_frames = filled / bytes_per_frame;
|
|
|
| @@ -246,4 +256,5 @@
|
| memset(audio_data[channel_index], 0, sizeof(float) * frames_to_zero);
|
| }
|
| }
|
| + return filled_frames;
|
| }
|
|
|