| Index: webrtc/modules/audio_processing/include/aec_dump.h | 
| diff --git a/webrtc/modules/audio_processing/include/aec_dump.h b/webrtc/modules/audio_processing/include/aec_dump.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..2640f07284123b089d624dbcd5534968815f5cac | 
| --- /dev/null | 
| +++ b/webrtc/modules/audio_processing/include/aec_dump.h | 
| @@ -0,0 +1,141 @@ | 
| +/* | 
| + *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 
| + * | 
| + *  Use of this source code is governed by a BSD-style license | 
| + *  that can be found in the LICENSE file in the root of the source | 
| + *  tree. An additional intellectual property rights grant can be found | 
| + *  in the file PATENTS.  All contributing project authors may | 
| + *  be found in the AUTHORS file in the root of the source tree. | 
| + */ | 
| + | 
| +#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_INCLUDE_AEC_DUMP_H_ | 
| +#define WEBRTC_MODULES_AUDIO_PROCESSING_INCLUDE_AEC_DUMP_H_ | 
| + | 
| +#include <memory> | 
| +#include <string> | 
| +#include <vector> | 
| + | 
| +#include "webrtc/base/array_view.h" | 
| + | 
| +namespace webrtc { | 
| + | 
| +class AudioFrame; | 
| + | 
| +// Struct for passing current config from APM without having to | 
| +// include protobuf headers. | 
| +struct InternalAPMConfig { | 
| +  InternalAPMConfig(); | 
| +  InternalAPMConfig(const InternalAPMConfig&); | 
| +  InternalAPMConfig(InternalAPMConfig&&); | 
| + | 
| +  InternalAPMConfig& operator=(const InternalAPMConfig&); | 
| +  InternalAPMConfig& operator=(InternalAPMConfig&&) = delete; | 
| + | 
| +  bool operator==(const InternalAPMConfig& other); | 
| + | 
| +  bool aec_enabled = false; | 
| +  bool aec_delay_agnostic_enabled = false; | 
| +  bool aec_drift_compensation_enabled = false; | 
| +  bool aec_extended_filter_enabled = false; | 
| +  int aec_suppression_level = 0; | 
| +  bool aecm_enabled = false; | 
| +  bool aecm_comfort_noise_enabled = false; | 
| +  int aecm_routing_mode = 0; | 
| +  bool agc_enabled = false; | 
| +  int agc_mode = 0; | 
| +  bool agc_limiter_enabled = false; | 
| +  bool hpf_enabled = false; | 
| +  bool ns_enabled = false; | 
| +  int ns_level = 0; | 
| +  bool transient_suppression_enabled = false; | 
| +  bool intelligibility_enhancer_enabled = false; | 
| +  bool noise_robust_agc_enabled = false; | 
| +  std::string experiments_description = ""; | 
| +}; | 
| + | 
| +struct InternalAPMStreamsConfig { | 
| +  int input_sample_rate = 0; | 
| +  int output_sample_rate = 0; | 
| +  int render_input_sample_rate = 0; | 
| +  int render_output_sample_rate = 0; | 
| + | 
| +  size_t input_num_channels = 0; | 
| +  size_t output_num_channels = 0; | 
| +  size_t render_input_num_channels = 0; | 
| +  size_t render_output_num_channels = 0; | 
| +}; | 
| + | 
| +// Class to pass audio data in float** format. This is to avoid | 
| +// dependence on AudioBuffer, and avoid problems associated with | 
| +// rtc::ArrayView<rtc::ArrayView>. | 
| +class FloatAudioFrame { | 
| + public: | 
| +  // |num_channels| and |channel_size| describe the float** | 
| +  // |audio_samples|. |audio_samples| is assumed to point to a | 
| +  // two-dimensional |num_channels * channel_size| array of floats. | 
| +  FloatAudioFrame(const float* const* audio_samples, | 
| +                  size_t num_channels, | 
| +                  size_t channel_size) | 
| +      : audio_samples_(audio_samples), | 
| +        num_channels_(num_channels), | 
| +        channel_size_(channel_size) {} | 
| + | 
| +  FloatAudioFrame() = delete; | 
| + | 
| +  size_t num_channels() const { return num_channels_; } | 
| + | 
| +  rtc::ArrayView<const float> channel(size_t idx) const { | 
| +    RTC_DCHECK_LE(0, idx); | 
| +    RTC_DCHECK_LE(idx, num_channels_); | 
| +    return rtc::ArrayView<const float>(audio_samples_[idx], channel_size_); | 
| +  } | 
| + | 
| + private: | 
| +  const float* const* audio_samples_; | 
| +  size_t num_channels_; | 
| +  size_t channel_size_; | 
| +}; | 
| + | 
| +// An interface for recording configuration and input/output streams | 
| +// of the Audio Processing Module. The recordings are called | 
| +// 'aec-dumps' and are stored in a protobuf format defined in | 
| +// debug.proto. | 
| +// The Write* methods are always safe to call concurrently or | 
| +// otherwise for all implementing subclasses. The intended mode of | 
| +// operation is to create a protobuf object from the input, and send | 
| +// it away to be written to file asynchronously. | 
| +class AecDump { | 
| + public: | 
| +  struct AudioProcessingState { | 
| +    int delay; | 
| +    int drift; | 
| +    int level; | 
| +    bool keypress; | 
| +  }; | 
| + | 
| +  virtual ~AecDump() = default; | 
| + | 
| +  // Logs Event::Type INIT message. | 
| +  virtual void WriteInitMessage( | 
| +      const InternalAPMStreamsConfig& streams_config) = 0; | 
| + | 
| +  // Logs Event::Type STREAM message. To log an input/output pair, | 
| +  // call the AddCapture* and AddAudioProcessingState methods followed | 
| +  // by a WriteCaptureStreamMessage call. | 
| +  virtual void AddCaptureStreamInput(const FloatAudioFrame& src) = 0; | 
| +  virtual void AddCaptureStreamOutput(const FloatAudioFrame& src) = 0; | 
| +  virtual void AddCaptureStreamInput(const AudioFrame& frame) = 0; | 
| +  virtual void AddCaptureStreamOutput(const AudioFrame& frame) = 0; | 
| +  virtual void AddAudioProcessingState(const AudioProcessingState& state) = 0; | 
| +  virtual void WriteCaptureStreamMessage() = 0; | 
| + | 
| +  // Logs Event::Type REVERSE_STREAM message. | 
| +  virtual void WriteRenderStreamMessage(const AudioFrame& frame) = 0; | 
| +  virtual void WriteRenderStreamMessage(const FloatAudioFrame& src) = 0; | 
| + | 
| +  // Logs Event::Type CONFIG message. | 
| +  virtual void WriteConfig(const InternalAPMConfig& config) = 0; | 
| +}; | 
| +}  // namespace webrtc | 
| + | 
| +#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_INCLUDE_AEC_DUMP_H_ | 
|  |