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..f27fd8104c09f0a68f247dcbd8c1f7484ced159e 100644 |
--- a/media/audio/audio_output_resampler.cc |
+++ b/media/audio/audio_output_resampler.cc |
@@ -28,12 +28,23 @@ |
namespace media { |
+namespace { |
+ |
+// Helper function for when we have no debug recording register callback. |
+std::unique_ptr<AudioDebugRecorder> GetNullptrAudioDebugRecorder( |
+ const AudioParameters& params) { |
+ return nullptr; |
+} |
+ |
+} // namespace |
+ |
class OnMoreDataConverter |
: public AudioOutputStream::AudioSourceCallback, |
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. |
@@ -84,6 +95,9 @@ class OnMoreDataConverter |
const int input_buffer_size_; |
const int output_buffer_size_; |
+ // For audio debug recordings. |
+ std::unique_ptr<AudioDebugRecorder> debug_recorder_; |
+ |
DISALLOW_COPY_AND_ASSIGN(OnMoreDataConverter); |
}; |
@@ -215,11 +229,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 +247,10 @@ AudioOutputResampler::AudioOutputResampler(AudioManager* audio_manager, |
base::Bind(&AudioOutputResampler::Reinitialize, |
base::Unretained(this)), |
false), |
+ register_debug_recording_source_callback_( |
+ register_debug_recording_source_callback |
+ ? register_debug_recording_source_callback |
+ : base::BindRepeating(&GetNullptrAudioDebugRecorder)), |
o1ka
2017/02/10 15:21:53
Pass this into constructor instead? Why to deffer
Henrik Grunell
2017/02/13 15:16:48
Absolutely, done.
|
weak_factory_(this) { |
DCHECK(input_params.IsValid()); |
DCHECK(output_params.IsValid()); |
@@ -341,7 +362,12 @@ 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_); |
+ // If a register callback has been given, register and pass the returned |
+ // recoder to the converter. Data is fed to same recorder for the lifetime |
+ // of the converter, which is until the stream is closed. |
+ resampler_callback = new OnMoreDataConverter( |
+ params_, output_params_, |
+ register_debug_recording_source_callback_.Run(output_params_)); |
callbacks_[stream_proxy] = |
base::WrapUnique<OnMoreDataConverter>(resampler_callback); |
} else { |
@@ -408,8 +434,10 @@ void AudioOutputResampler::StopStreamInternal( |
dispatcher_->CloseAllIdleStreams(); |
} |
-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 +445,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_buffer_size_(output_params.frames_per_buffer()), |
+ debug_recorder_(std::move(debug_recorder)) { |
RecordRebufferingStats(input_params, output_params); |
} |
@@ -454,6 +483,9 @@ int OnMoreDataConverter::OnMoreData(base::TimeDelta delay, |
current_delay_timestamp_ = delay_timestamp; |
audio_converter_.Convert(dest); |
+ if (debug_recorder_) |
+ 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(); |