Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1245)

Unified Diff: content/renderer/media/webaudio_capturer_source.cc

Issue 1714593003: Introduce media::AudioPushFifo and a couple of use cases (and clean-ups). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix unittest compile breakage caused by recent method rename. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/media/webaudio_capturer_source.h ('k') | media/base/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « content/renderer/media/webaudio_capturer_source.h ('k') | media/base/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698