| Index: content/renderer/media/webrtc_local_audio_source_provider.cc
|
| diff --git a/content/renderer/media/webrtc_local_audio_source_provider.cc b/content/renderer/media/webrtc_local_audio_source_provider.cc
|
| index cc70c785a97fd8b783496a356d3d435c42856ecb..f1f944d06142d0effe8e6d2d721ed894531bf212 100644
|
| --- a/content/renderer/media/webrtc_local_audio_source_provider.cc
|
| +++ b/content/renderer/media/webrtc_local_audio_source_provider.cc
|
| @@ -23,10 +23,7 @@ static const size_t kMaxNumberOfBuffers = 10;
|
| const size_t WebRtcLocalAudioSourceProvider::kWebAudioRenderBufferSize = 128;
|
|
|
| WebRtcLocalAudioSourceProvider::WebRtcLocalAudioSourceProvider()
|
| - : audio_delay_ms_(0),
|
| - volume_(1),
|
| - key_pressed_(false),
|
| - is_enabled_(false) {
|
| + : is_enabled_(false) {
|
| }
|
|
|
| WebRtcLocalAudioSourceProvider::~WebRtcLocalAudioSourceProvider() {
|
| @@ -34,9 +31,10 @@ WebRtcLocalAudioSourceProvider::~WebRtcLocalAudioSourceProvider() {
|
| audio_converter_->RemoveInput(this);
|
| }
|
|
|
| -void WebRtcLocalAudioSourceProvider::Initialize(
|
| - const media::AudioParameters& source_params) {
|
| +void WebRtcLocalAudioSourceProvider::SetCaptureFormat(
|
| + const media::AudioParameters& params) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK(params.IsValid());
|
|
|
| // Use the native audio output hardware sample-rate for the sink.
|
| if (RenderThreadImpl::current()) {
|
| @@ -44,8 +42,8 @@ void WebRtcLocalAudioSourceProvider::Initialize(
|
| RenderThreadImpl::current()->GetAudioHardwareConfig();
|
| int sample_rate = hardware_config->GetOutputSampleRate();
|
| sink_params_.Reset(
|
| - source_params.format(), media::CHANNEL_LAYOUT_STEREO, 2, 0,
|
| - sample_rate, source_params.bits_per_sample(),
|
| + params.format(), media::CHANNEL_LAYOUT_STEREO, 2, 0,
|
| + sample_rate, params.bits_per_sample(),
|
| kWebAudioRenderBufferSize);
|
| } else {
|
| // This happens on unittests which does not have a valid RenderThreadImpl,
|
| @@ -54,56 +52,51 @@ void WebRtcLocalAudioSourceProvider::Initialize(
|
| }
|
|
|
| base::AutoLock auto_lock(lock_);
|
| - source_params_ = source_params;
|
| + source_params_ = params;
|
| // Create the audio converter with |disable_fifo| as false so that the
|
| // converter will request source_params.frames_per_buffer() each time.
|
| // This will not increase the complexity as there is only one client to
|
| // the converter.
|
| audio_converter_.reset(
|
| - new media::AudioConverter(source_params, sink_params_, false));
|
| + new media::AudioConverter(params, sink_params_, false));
|
| audio_converter_->AddInput(this);
|
| fifo_.reset(new media::AudioFifo(
|
| - source_params.channels(),
|
| - kMaxNumberOfBuffers * source_params.frames_per_buffer()));
|
| + params.channels(),
|
| + kMaxNumberOfBuffers * params.frames_per_buffer()));
|
| + input_wrapper_ = media::AudioBus::Create(source_params_.channels(),
|
| + source_params_.frames_per_buffer());
|
| }
|
|
|
| -void WebRtcLocalAudioSourceProvider::DeliverData(
|
| - media::AudioBus* audio_source,
|
| +int WebRtcLocalAudioSourceProvider::CaptureData(
|
| + const std::vector<int>& channels,
|
| + const int16* audio_data,
|
| + int sample_rate,
|
| + int number_of_channels,
|
| + int number_of_frames,
|
| int audio_delay_milliseconds,
|
| - int volume,
|
| + int current_volume,
|
| + bool need_audio_processing,
|
| bool key_pressed) {
|
| base::AutoLock auto_lock(lock_);
|
| if (!is_enabled_)
|
| - return;
|
| + return 0;
|
|
|
| DCHECK(fifo_.get());
|
| -
|
| - if (fifo_->frames() + audio_source->frames() <= fifo_->max_frames()) {
|
| - fifo_->Push(audio_source);
|
| + // TODO(xians): A better way to handle the interleaved and deinterleaved
|
| + // format switching.
|
| + DCHECK(input_wrapper_->frames() == number_of_frames);
|
| + CHECK(input_wrapper_->channels() == number_of_channels);
|
| + input_wrapper_->FromInterleaved(audio_data, number_of_frames, 2);
|
| +
|
| + if (fifo_->frames() + number_of_frames <= fifo_->max_frames()) {
|
| + fifo_->Push(input_wrapper_.get());
|
| } else {
|
| // This can happen if the data in FIFO is too slowed to be consumed or
|
| // WebAudio stops consuming data.
|
| DLOG(WARNING) << "Local source provicer FIFO is full" << fifo_->frames();
|
| }
|
|
|
| - // Cache the values for GetAudioProcessingParams().
|
| - last_fill_ = base::TimeTicks::Now();
|
| - audio_delay_ms_ = audio_delay_milliseconds;
|
| - volume_ = volume;
|
| - key_pressed_ = key_pressed;
|
| -}
|
| -
|
| -void WebRtcLocalAudioSourceProvider::GetAudioProcessingParams(
|
| - int* delay_ms, int* volume, bool* key_pressed) {
|
| - int elapsed_ms = 0;
|
| - if (!last_fill_.is_null()) {
|
| - elapsed_ms = static_cast<int>(
|
| - (base::TimeTicks::Now() - last_fill_).InMilliseconds());
|
| - }
|
| - *delay_ms = audio_delay_ms_ + elapsed_ms + static_cast<int>(
|
| - 1000 * fifo_->frames() / source_params_.sample_rate() + 0.5);
|
| - *volume = volume_;
|
| - *key_pressed = key_pressed_;
|
| + return 0;
|
| }
|
|
|
| void WebRtcLocalAudioSourceProvider::setClient(
|
| @@ -114,20 +107,20 @@ void WebRtcLocalAudioSourceProvider::setClient(
|
| void WebRtcLocalAudioSourceProvider::provideInput(
|
| const WebVector<float*>& audio_data, size_t number_of_frames) {
|
| DCHECK_EQ(number_of_frames, kWebAudioRenderBufferSize);
|
| - if (!bus_wrapper_ ||
|
| - static_cast<size_t>(bus_wrapper_->channels()) != audio_data.size()) {
|
| - bus_wrapper_ = media::AudioBus::CreateWrapper(audio_data.size());
|
| + if (!output_wrapper_ ||
|
| + static_cast<size_t>(output_wrapper_->channels()) != audio_data.size()) {
|
| + output_wrapper_ = media::AudioBus::CreateWrapper(audio_data.size());
|
| }
|
|
|
| - bus_wrapper_->set_frames(number_of_frames);
|
| + output_wrapper_->set_frames(number_of_frames);
|
| for (size_t i = 0; i < audio_data.size(); ++i)
|
| - bus_wrapper_->SetChannelData(i, audio_data[i]);
|
| + output_wrapper_->SetChannelData(i, audio_data[i]);
|
|
|
| base::AutoLock auto_lock(lock_);
|
| DCHECK(audio_converter_.get());
|
| DCHECK(fifo_.get());
|
| is_enabled_ = true;
|
| - audio_converter_->Convert(bus_wrapper_.get());
|
| + audio_converter_->Convert(output_wrapper_.get());
|
| }
|
|
|
| double WebRtcLocalAudioSourceProvider::ProvideInput(
|
| @@ -136,11 +129,9 @@ double WebRtcLocalAudioSourceProvider::ProvideInput(
|
| fifo_->Consume(audio_bus, 0, audio_bus->frames());
|
| } else {
|
| audio_bus->Zero();
|
| - if (!last_fill_.is_null()) {
|
| - DLOG(WARNING) << "Underrun, FIFO has data " << fifo_->frames()
|
| - << " samples but " << audio_bus->frames()
|
| - << " samples are needed";
|
| - }
|
| + DVLOG(1) << "WARNING: Underrun, FIFO has data " << fifo_->frames()
|
| + << " samples but " << audio_bus->frames()
|
| + << " samples are needed";
|
| }
|
|
|
| return 1.0;
|
|
|