| Index: content/renderer/media/webrtc/webrtc_audio_sink_adapter.cc
|
| diff --git a/content/renderer/media/webrtc/webrtc_audio_sink_adapter.cc b/content/renderer/media/webrtc/webrtc_audio_sink_adapter.cc
|
| index 2679aff9648a438574fc06749be4af57b5e724fb..e2cfd01ae958ab0f298153695e88314d1c5c6d93 100644
|
| --- a/content/renderer/media/webrtc/webrtc_audio_sink_adapter.cc
|
| +++ b/content/renderer/media/webrtc/webrtc_audio_sink_adapter.cc
|
| @@ -2,6 +2,8 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| #include "base/logging.h"
|
| #include "content/renderer/media/webrtc/webrtc_audio_sink_adapter.h"
|
| #include "media/base/audio_bus.h"
|
| @@ -11,7 +13,9 @@ namespace content {
|
|
|
| WebRtcAudioSinkAdapter::WebRtcAudioSinkAdapter(
|
| webrtc::AudioTrackSinkInterface* sink)
|
| - : sink_(sink) {
|
| + : sink_(sink),
|
| + fifo_(base::Bind(&WebRtcAudioSinkAdapter::DeliverRebufferedAudio,
|
| + base::Unretained(this))) {
|
| DCHECK(sink);
|
| }
|
|
|
| @@ -25,8 +29,17 @@ bool WebRtcAudioSinkAdapter::IsEqual(
|
|
|
| void WebRtcAudioSinkAdapter::OnData(const media::AudioBus& audio_bus,
|
| base::TimeTicks estimated_capture_time) {
|
| - DCHECK_EQ(audio_bus.frames(), params_.frames_per_buffer());
|
| - DCHECK_EQ(audio_bus.channels(), params_.channels());
|
| + // The following will result in zero, one, or multiple synchronous calls to
|
| + // DeliverRebufferedAudio().
|
| + fifo_.Push(audio_bus);
|
| +}
|
| +
|
| +void WebRtcAudioSinkAdapter::DeliverRebufferedAudio(
|
| + const media::AudioBus& audio_bus,
|
| + int frame_delay) {
|
| + // TODO(miu): Why doesn't a WebRTC sink care about reference time passed to
|
| + // OnData(), and the |frame_delay| here? How is AV sync achieved otherwise?
|
| +
|
| // TODO(henrika): Remove this conversion once the interface in libjingle
|
| // supports float vectors.
|
| audio_bus.ToInterleaved(audio_bus.frames(),
|
| @@ -43,6 +56,7 @@ void WebRtcAudioSinkAdapter::OnSetFormat(
|
| const media::AudioParameters& params) {
|
| DCHECK(params.IsValid());
|
| params_ = params;
|
| + fifo_.Reset(params_.frames_per_buffer());
|
| const int num_pcm16_data_elements =
|
| params_.frames_per_buffer() * params_.channels();
|
| interleaved_data_.reset(new int16_t[num_pcm16_data_elements]);
|
|
|