| Index: content/renderer/media/webaudio_capturer_source.cc
|
| diff --git a/content/renderer/media/webaudio_capturer_source.cc b/content/renderer/media/webaudio_capturer_source.cc
|
| index bcebcbb3e24e523288827db01d6b740a019a29fd..2d663430e3e13dc1d58d9a1b83f17e25897e12cb 100644
|
| --- a/content/renderer/media/webaudio_capturer_source.cc
|
| +++ b/content/renderer/media/webaudio_capturer_source.cc
|
| @@ -4,27 +4,26 @@
|
|
|
| #include "content/renderer/media/webaudio_capturer_source.h"
|
|
|
| +#include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| #include "base/logging.h"
|
| -#include "base/time/time.h"
|
| #include "content/renderer/media/webrtc_local_audio_track.h"
|
|
|
| using media::AudioBus;
|
| -using media::AudioFifo;
|
| using media::AudioParameters;
|
| using media::ChannelLayout;
|
| using media::CHANNEL_LAYOUT_MONO;
|
| using media::CHANNEL_LAYOUT_STEREO;
|
|
|
| -static const int kMaxNumberOfBuffersInFifo = 5;
|
| -
|
| namespace content {
|
|
|
| WebAudioCapturerSource::WebAudioCapturerSource(
|
| const blink::WebMediaStreamSource& blink_source)
|
| : track_(NULL),
|
| audio_format_changed_(false),
|
| - blink_source_(blink_source) {
|
| -}
|
| + fifo_(base::Bind(&WebAudioCapturerSource::DeliverRebufferedAudio,
|
| + base::Unretained(this))),
|
| + blink_source_(blink_source) {}
|
|
|
| WebAudioCapturerSource::~WebAudioCapturerSource() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| @@ -48,20 +47,19 @@ void WebAudioCapturerSource::setFormat(
|
| // Set the format used by this WebAudioCapturerSource. We are using 10ms data
|
| // as buffer size since that is the native buffer size of WebRtc packet
|
| // running on.
|
| + fifo_.Reset(sample_rate / 100);
|
| params_.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout,
|
| - sample_rate, 16, sample_rate / 100);
|
| + sample_rate, 16, fifo_.frames_per_buffer());
|
|
|
| // Take care of the discrete channel layout case.
|
| params_.set_channels_for_discrete(number_of_channels);
|
|
|
| audio_format_changed_ = true;
|
|
|
| - wrapper_bus_ = AudioBus::CreateWrapper(params_.channels());
|
| - capture_bus_ = AudioBus::Create(params_);
|
| -
|
| - fifo_.reset(new AudioFifo(
|
| - params_.channels(),
|
| - kMaxNumberOfBuffersInFifo * params_.frames_per_buffer()));
|
| + if (!wrapper_bus_ ||
|
| + wrapper_bus_->channels() != static_cast<int>(number_of_channels)) {
|
| + wrapper_bus_ = AudioBus::CreateWrapper(params_.channels());
|
| + }
|
| }
|
|
|
| void WebAudioCapturerSource::Start(WebRtcLocalAudioTrack* track) {
|
| @@ -85,6 +83,11 @@ void WebAudioCapturerSource::Stop() {
|
| void WebAudioCapturerSource::consumeAudio(
|
| const blink::WebVector<const float*>& audio_data,
|
| size_t number_of_frames) {
|
| + // TODO(miu): Plumbing is needed to determine the actual capture timestamp
|
| + // of the audio, instead of just snapshotting TimeTicks::Now(), for proper
|
| + // audio/video sync. http://crbug.com/335335
|
| + current_reference_time_ = base::TimeTicks::Now();
|
| +
|
| base::AutoLock auto_lock(lock_);
|
| if (!track_)
|
| return;
|
| @@ -96,36 +99,25 @@ void WebAudioCapturerSource::consumeAudio(
|
| }
|
|
|
| wrapper_bus_->set_frames(number_of_frames);
|
| -
|
| - // Make sure WebKit is honoring what it told us up front
|
| - // about the channels.
|
| DCHECK_EQ(params_.channels(), static_cast<int>(audio_data.size()));
|
| -
|
| for (size_t i = 0; i < audio_data.size(); ++i)
|
| wrapper_bus_->SetChannelData(i, const_cast<float*>(audio_data[i]));
|
|
|
| - // Handle mismatch between WebAudio buffer-size and WebRTC.
|
| - int available = fifo_->max_frames() - fifo_->frames();
|
| - if (available < static_cast<int>(number_of_frames)) {
|
| - NOTREACHED() << "WebAudioCapturerSource::Consume() : FIFO overrun.";
|
| - return;
|
| - }
|
| -
|
| - // Compute the estimated capture time of the first sample frame of audio that
|
| - // will be consumed from the FIFO in the loop below.
|
| - base::TimeTicks estimated_capture_time = base::TimeTicks::Now() -
|
| - fifo_->frames() * base::TimeDelta::FromSeconds(1) / params_.sample_rate();
|
| -
|
| - fifo_->Push(wrapper_bus_.get());
|
| - while (fifo_->frames() >= capture_bus_->frames()) {
|
| - fifo_->Consume(capture_bus_.get(), 0, capture_bus_->frames());
|
| - track_->Capture(*capture_bus_, estimated_capture_time, false);
|
| + // The following will result in zero, one, or multiple synchronous calls to
|
| + // DeliverRebufferedAudio().
|
| + fifo_.Push(*wrapper_bus_);
|
| +}
|
|
|
| - // Advance the estimated capture time for the next FIFO consume operation.
|
| - estimated_capture_time +=
|
| - capture_bus_->frames() * base::TimeDelta::FromSeconds(1) /
|
| - params_.sample_rate();
|
| - }
|
| +void WebAudioCapturerSource::DeliverRebufferedAudio(
|
| + const media::AudioBus& audio_bus,
|
| + int frame_delay) {
|
| + lock_.AssertAcquired();
|
| + const base::TimeTicks reference_time =
|
| + current_reference_time_ +
|
| + base::TimeDelta::FromMicroseconds(frame_delay *
|
| + base::Time::kMicrosecondsPerSecond /
|
| + params_.sample_rate());
|
| + track_->Capture(audio_bus, reference_time, false);
|
| }
|
|
|
| // If registered as audio consumer in |blink_source_|, deregister from
|
|
|