| 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..d038fe87566e8ce9e7b2a4b71144b07d1dbca07b 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,10 @@ namespace content {
|
|
|
| WebRtcAudioSinkAdapter::WebRtcAudioSinkAdapter(
|
| webrtc::AudioTrackSinkInterface* sink)
|
| - : sink_(sink) {
|
| + : sink_(sink),
|
| + rechunker_(base::TimeDelta::FromMilliseconds(10),
|
| + base::Bind(&WebRtcAudioSinkAdapter::DeliverRechunkedAudio,
|
| + base::Unretained(this))) {
|
| DCHECK(sink);
|
| }
|
|
|
| @@ -25,26 +30,33 @@ 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
|
| + // DeliverRechunkedAudio().
|
| + rechunker_.Push(audio_bus, estimated_capture_time - base::TimeTicks());
|
| +}
|
| +
|
| +void WebRtcAudioSinkAdapter::DeliverRechunkedAudio(
|
| + const media::AudioBus& audio_bus,
|
| + base::TimeDelta timestamp) {
|
| // TODO(henrika): Remove this conversion once the interface in libjingle
|
| // supports float vectors.
|
| audio_bus.ToInterleaved(audio_bus.frames(),
|
| sizeof(interleaved_data_[0]),
|
| interleaved_data_.get());
|
| + // TODO(miu): Why doesn't a WebRTC sink care about the reference timestamp?
|
| + // How is AV sync achieved otherwise?
|
| sink_->OnData(interleaved_data_.get(),
|
| 16,
|
| - params_.sample_rate(),
|
| + rechunker_.sample_rate(),
|
| audio_bus.channels(),
|
| audio_bus.frames());
|
| }
|
|
|
| -void WebRtcAudioSinkAdapter::OnSetFormat(
|
| - const media::AudioParameters& params) {
|
| +void WebRtcAudioSinkAdapter::OnSetFormat(const media::AudioParameters& params) {
|
| DCHECK(params.IsValid());
|
| - params_ = params;
|
| + rechunker_.SetSampleRate(params.sample_rate());
|
| const int num_pcm16_data_elements =
|
| - params_.frames_per_buffer() * params_.channels();
|
| + rechunker_.output_frames() * params.channels();
|
| interleaved_data_.reset(new int16_t[num_pcm16_data_elements]);
|
| }
|
|
|
|
|