| Index: media/audio/audio_output_resampler.cc
|
| diff --git a/media/audio/audio_output_resampler.cc b/media/audio/audio_output_resampler.cc
|
| index 9439a634fcdb45a6e38d32768662c8310a5c888e..43b9db29ae054761c93713c7da85979976891a5c 100644
|
| --- a/media/audio/audio_output_resampler.cc
|
| +++ b/media/audio/audio_output_resampler.cc
|
| @@ -32,8 +32,10 @@ class OnMoreDataConverter
|
| : public AudioOutputStream::AudioSourceCallback,
|
| public AudioConverter::InputCallback {
|
| public:
|
| - OnMoreDataConverter(const AudioParameters& input_params,
|
| - const AudioParameters& output_params);
|
| + OnMoreDataConverter(
|
| + const AudioParameters& input_params,
|
| + const AudioParameters& output_params,
|
| + AudioDebugRecorderWrapperUniquePtr debug_recorder_wrapper);
|
| ~OnMoreDataConverter() override;
|
|
|
| // AudioSourceCallback interface.
|
| @@ -54,6 +56,8 @@ class OnMoreDataConverter
|
|
|
| bool error_occurred() const { return error_occurred_; }
|
|
|
| + const AudioParameters& output_params() const { return output_params_; }
|
| +
|
| private:
|
| // AudioConverter::InputCallback implementation.
|
| double ProvideInput(AudioBus* audio_bus, uint32_t frames_delayed) override;
|
| @@ -80,9 +84,15 @@ class OnMoreDataConverter
|
| // stream has been stopped.
|
| bool error_occurred_;
|
|
|
| - // Information about input and output buffer sizes to be traced.
|
| + // Information about input buffer sizes to be traced.
|
| const int input_buffer_size_;
|
| - const int output_buffer_size_;
|
| +
|
| + // Output parameters used for buffer size tracing and for users to get.
|
| + const AudioParameters output_params_;
|
| +
|
| + // Used for audio debug recordings. See comment on SetDebugRecordingCallback()
|
| + // above. |id_| is a unique running id used in the callback.
|
| + AudioDebugRecorderWrapperUniquePtr debug_recorder_wrapper_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(OnMoreDataConverter);
|
| };
|
| @@ -215,11 +225,14 @@ void AudioOutputResampler::SetupFallbackParams() {
|
| #endif
|
| }
|
|
|
| -AudioOutputResampler::AudioOutputResampler(AudioManager* audio_manager,
|
| - const AudioParameters& input_params,
|
| - const AudioParameters& output_params,
|
| - const std::string& output_device_id,
|
| - const base::TimeDelta& close_delay)
|
| +AudioOutputResampler::AudioOutputResampler(
|
| + AudioManager* audio_manager,
|
| + const AudioParameters& input_params,
|
| + const AudioParameters& output_params,
|
| + const std::string& output_device_id,
|
| + base::TimeDelta close_delay,
|
| + const RegisterDebugRecordingSourceCallback&
|
| + register_debug_recording_source_callback)
|
| : AudioOutputDispatcher(audio_manager, input_params, output_device_id),
|
| close_delay_(close_delay),
|
| output_params_(output_params),
|
| @@ -230,6 +243,8 @@ AudioOutputResampler::AudioOutputResampler(AudioManager* audio_manager,
|
| base::Bind(&AudioOutputResampler::Reinitialize,
|
| base::Unretained(this)),
|
| false),
|
| + register_debug_recording_source_callback_(
|
| + register_debug_recording_source_callback),
|
| weak_factory_(this) {
|
| DCHECK(input_params.IsValid());
|
| DCHECK(output_params.IsValid());
|
| @@ -341,7 +356,10 @@ bool AudioOutputResampler::StartStream(
|
| OnMoreDataConverter* resampler_callback = nullptr;
|
| CallbackMap::iterator it = callbacks_.find(stream_proxy);
|
| if (it == callbacks_.end()) {
|
| - resampler_callback = new OnMoreDataConverter(params_, output_params_);
|
| + AudioDebugRecorderWrapperUniquePtr recorder_wrapper =
|
| + register_debug_recording_source_callback_.Run(output_params_);
|
| + resampler_callback = new OnMoreDataConverter(params_, output_params_,
|
| + std::move(recorder_wrapper));
|
| callbacks_[stream_proxy] =
|
| base::WrapUnique<OnMoreDataConverter>(resampler_callback);
|
| } else {
|
| @@ -406,10 +424,15 @@ void AudioOutputResampler::StopStreamInternal(
|
| // call above.
|
| if (callback->error_occurred())
|
| dispatcher_->CloseAllIdleStreams();
|
| +
|
| + // TODO BEFORE COMMIT: I think we need to clear the recorder wrapper here and
|
| + // register again at start. Seems like converters are re-used.
|
| }
|
|
|
| -OnMoreDataConverter::OnMoreDataConverter(const AudioParameters& input_params,
|
| - const AudioParameters& output_params)
|
| +OnMoreDataConverter::OnMoreDataConverter(
|
| + const AudioParameters& input_params,
|
| + const AudioParameters& output_params,
|
| + AudioDebugRecorderWrapperUniquePtr debug_recorder_wrapper)
|
| : io_ratio_(static_cast<double>(input_params.GetBytesPerSecond()) /
|
| output_params.GetBytesPerSecond()),
|
| source_callback_(nullptr),
|
| @@ -417,7 +440,8 @@ OnMoreDataConverter::OnMoreDataConverter(const AudioParameters& input_params,
|
| audio_converter_(input_params, output_params, false),
|
| error_occurred_(false),
|
| input_buffer_size_(input_params.frames_per_buffer()),
|
| - output_buffer_size_(output_params.frames_per_buffer()) {
|
| + output_params_(output_params),
|
| + debug_recorder_wrapper_(std::move(debug_recorder_wrapper)) {
|
| RecordRebufferingStats(input_params, output_params);
|
| }
|
|
|
| @@ -449,11 +473,14 @@ int OnMoreDataConverter::OnMoreData(base::TimeDelta delay,
|
| int /* prior_frames_skipped */,
|
| AudioBus* dest) {
|
| TRACE_EVENT2("audio", "OnMoreDataConverter::OnMoreData", "input buffer size",
|
| - input_buffer_size_, "output buffer size", output_buffer_size_);
|
| + input_buffer_size_, "output buffer size",
|
| + output_params_.frames_per_buffer());
|
| current_delay_ = delay;
|
| current_delay_timestamp_ = delay_timestamp;
|
| audio_converter_.Convert(dest);
|
|
|
| + debug_recorder_wrapper_->recorder->OnData(dest);
|
| +
|
| // Always return the full number of frames requested, ProvideInput()
|
| // will pad with silence if it wasn't able to acquire enough data.
|
| return dest->frames();
|
|
|