| Index: content/renderer/media_recorder/audio_track_recorder.cc
|
| diff --git a/content/renderer/media_recorder/audio_track_recorder.cc b/content/renderer/media_recorder/audio_track_recorder.cc
|
| index 9c017226e3a4361ca7244e5222f869ba3d9c428e..9f96801895a91ce1f8daa61b0ec50e1f6c6855b0 100644
|
| --- a/content/renderer/media_recorder/audio_track_recorder.cc
|
| +++ b/content/renderer/media_recorder/audio_track_recorder.cc
|
| @@ -13,6 +13,7 @@
|
| #include "content/renderer/media/media_stream_audio_track.h"
|
| #include "media/base/audio_bus.h"
|
| #include "media/base/audio_converter.h"
|
| +#include "media/base/audio_fifo.h"
|
| #include "media/base/audio_parameters.h"
|
| #include "media/base/audio_sample_types.h"
|
| #include "media/base/bind_to_current_loop.h"
|
| @@ -126,15 +127,13 @@
|
|
|
| // Sampling rate adapter between an OpusEncoder supported and the provided.
|
| std::unique_ptr<media::AudioConverter> converter_;
|
| - std::deque<std::unique_ptr<media::AudioBus>> audio_bus_queue_;
|
| + std::unique_ptr<media::AudioFifo> fifo_;
|
|
|
| // Buffer for passing AudioBus data to OpusEncoder.
|
| std::unique_ptr<float[]> buffer_;
|
|
|
| // While |paused_|, AudioBuses are not encoded.
|
| bool paused_;
|
| -
|
| - int frames_queued_;
|
|
|
| OpusEncoder* opus_encoder_;
|
|
|
| @@ -147,7 +146,6 @@
|
| : on_encoded_audio_cb_(on_encoded_audio_cb),
|
| bits_per_second_(bits_per_second),
|
| paused_(false),
|
| - frames_queued_(0),
|
| opus_encoder_(nullptr) {
|
| // AudioEncoder is constructed on the thread that ATR lives on, but should
|
| // operate only on the encoder thread after that. Reset
|
| @@ -175,7 +173,6 @@
|
| DLOG(ERROR) << "Invalid params: " << input_params.AsHumanReadableString();
|
| return;
|
| }
|
| -
|
| input_params_ = input_params;
|
| input_params_.set_frames_per_buffer(input_params_.sample_rate() *
|
| kOpusPreferredBufferDurationMs /
|
| @@ -197,8 +194,9 @@
|
| converter_->AddInput(this);
|
| converter_->PrimeWithSilence();
|
|
|
| - frames_queued_ = 0;
|
| - audio_bus_queue_.clear();
|
| + fifo_.reset(new media::AudioFifo(
|
| + input_params_.channels(),
|
| + kMaxNumberOfFifoBuffers * input_params_.frames_per_buffer()));
|
|
|
| buffer_.reset(new float[output_params_.channels() *
|
| output_params_.frames_per_buffer()]);
|
| @@ -239,19 +237,14 @@
|
|
|
| if (!is_initialized() || paused_)
|
| return;
|
| -
|
| - frames_queued_ += input_bus->frames();
|
| - audio_bus_queue_.push_back(std::move(input_bus));
|
| -
|
| - const int max_frame_limit =
|
| - kMaxNumberOfFifoBuffers * input_params_.frames_per_buffer();
|
| - while (frames_queued_ > max_frame_limit) {
|
| - frames_queued_ -= audio_bus_queue_.front()->frames();
|
| - audio_bus_queue_.pop_front();
|
| - }
|
| + // TODO(mcasas): Consider using a std::deque<std::unique_ptr<AudioBus>>
|
| + // instead of
|
| + // an AudioFifo, to avoid copying data needlessly since we know the sizes of
|
| + // both input and output and they are multiples.
|
| + fifo_->Push(input_bus.get());
|
|
|
| // Wait to have enough |input_bus|s to guarantee a satisfactory conversion.
|
| - while (frames_queued_ >= input_params_.frames_per_buffer()) {
|
| + while (fifo_->frames() >= input_params_.frames_per_buffer()) {
|
| std::unique_ptr<media::AudioBus> audio_bus = media::AudioBus::Create(
|
| output_params_.channels(), kOpusPreferredFramesPerBuffer);
|
| converter_->Convert(audio_bus.get());
|
| @@ -263,7 +256,7 @@
|
| encoded_data.get())) {
|
| const base::TimeTicks capture_time_of_first_sample =
|
| capture_time -
|
| - base::TimeDelta::FromMicroseconds(frames_queued_ *
|
| + base::TimeDelta::FromMicroseconds(fifo_->frames() *
|
| base::Time::kMicrosecondsPerSecond /
|
| input_params_.sample_rate());
|
| on_encoded_audio_cb_.Run(output_params_, std::move(encoded_data),
|
| @@ -275,14 +268,7 @@
|
| double AudioTrackRecorder::AudioEncoder::ProvideInput(
|
| media::AudioBus* audio_bus,
|
| uint32_t frames_delayed) {
|
| - if (audio_bus_queue_.empty()) {
|
| - audio_bus->Zero();
|
| - return 0.0;
|
| - }
|
| -
|
| - frames_queued_ -= audio_bus->frames();
|
| - audio_bus_queue_.front()->CopyTo(audio_bus);
|
| - audio_bus_queue_.pop_front();
|
| + fifo_->Consume(audio_bus, 0, audio_bus->frames());
|
| return 1.0; // Return volume greater than zero to indicate we have more data.
|
| }
|
|
|
|
|