Chromium Code Reviews| 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..97e9efe7c0e2ef42419977268a53e319a88c31f1 100644 |
| --- a/media/audio/audio_output_resampler.cc |
| +++ b/media/audio/audio_output_resampler.cc |
| @@ -33,7 +33,8 @@ class OnMoreDataConverter |
| public AudioConverter::InputCallback { |
| public: |
| OnMoreDataConverter(const AudioParameters& input_params, |
| - const AudioParameters& output_params); |
| + const AudioParameters& output_params, |
| + std::unique_ptr<AudioDebugRecorder> debug_recorder); |
| ~OnMoreDataConverter() override; |
| // AudioSourceCallback interface. |
| @@ -54,6 +55,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 +83,14 @@ 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_; |
| + |
| + // For audio debug recordings. |
| + std::unique_ptr<AudioDebugRecorder> debug_recorder_; |
| DISALLOW_COPY_AND_ASSIGN(OnMoreDataConverter); |
| }; |
| @@ -215,11 +223,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 +241,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 +354,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_); |
| + std::unique_ptr<AudioDebugRecorder> debug_recorder = |
| + register_debug_recording_source_callback_.Run(output_params_); |
| + resampler_callback = new OnMoreDataConverter(params_, output_params_, |
| + std::move(debug_recorder)); |
| callbacks_[stream_proxy] = |
| base::WrapUnique<OnMoreDataConverter>(resampler_callback); |
| } else { |
| @@ -406,10 +422,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. |
|
o1ka
2017/01/31 11:00:11
Please figure this out. Now we register recording
Henrik Grunell
2017/02/08 11:29:38
I've looked into this now. We should unregister wh
|
| } |
| -OnMoreDataConverter::OnMoreDataConverter(const AudioParameters& input_params, |
| - const AudioParameters& output_params) |
| +OnMoreDataConverter::OnMoreDataConverter( |
| + const AudioParameters& input_params, |
| + const AudioParameters& output_params, |
| + std::unique_ptr<AudioDebugRecorder> debug_recorder) |
| : io_ratio_(static_cast<double>(input_params.GetBytesPerSecond()) / |
| output_params.GetBytesPerSecond()), |
| source_callback_(nullptr), |
| @@ -417,7 +438,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_(std::move(debug_recorder)) { |
| RecordRebufferingStats(input_params, output_params); |
| } |
| @@ -449,11 +471,15 @@ 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); |
| + if (debug_recorder_) |
|
o1ka
2017/01/31 11:00:11
If you are going to unregistered in Stop, there ma
Henrik Grunell
2017/02/08 11:29:38
See above comment - won't unregister in Stop().
|
| + debug_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(); |