Chromium Code Reviews| 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()); |
|
o1ka
2016/04/01 15:11:41
What is the guarantee that there is no race betwee
miu
2016/04/19 00:40:23
Done. (This method moved to the new WebRtcAudioSi
|
| const int num_pcm16_data_elements = |
| params_.frames_per_buffer() * params_.channels(); |
| interleaved_data_.reset(new int16_t[num_pcm16_data_elements]); |