| Index: webrtc/modules/audio_processing/audio_processing_impl.h | 
| diff --git a/webrtc/modules/audio_processing/audio_processing_impl.h b/webrtc/modules/audio_processing/audio_processing_impl.h | 
| index 37b15c28935f29cb6450f5f5cec3d53fe640f50f..1284d6a3e595e9eb0fc42d0ebca8edddb5c7ef0f 100644 | 
| --- a/webrtc/modules/audio_processing/audio_processing_impl.h | 
| +++ b/webrtc/modules/audio_processing/audio_processing_impl.h | 
| @@ -23,6 +23,7 @@ | 
| #include "webrtc/base/swap_queue.h" | 
| #include "webrtc/base/thread_annotations.h" | 
| #include "webrtc/modules/audio_processing/audio_buffer.h" | 
| +#include "webrtc/modules/audio_processing/include/aec_dump.h" | 
| #include "webrtc/modules/audio_processing/include/audio_processing.h" | 
| #include "webrtc/modules/audio_processing/render_queue_item_verifier.h" | 
| #include "webrtc/modules/audio_processing/rms_level.h" | 
| @@ -66,6 +67,8 @@ class AudioProcessingImpl : public AudioProcessing { | 
| void ApplyConfig(const AudioProcessing::Config& config) override; | 
| void SetExtraOptions(const webrtc::Config& config) override; | 
| void UpdateHistogramsOnCallEnd() override; | 
| +  void AttachAecDump(std::unique_ptr<AecDump> aec_dump) override; | 
| +  void DetachAecDump() override; | 
| int StartDebugRecording(const char filename[kMaxFilenameSize], | 
| int64_t max_log_size_bytes) override; | 
| int StartDebugRecording(FILE* handle, int64_t max_log_size_bytes) override; | 
| @@ -275,6 +278,37 @@ class AudioProcessingImpl : public AudioProcessing { | 
| EXCLUSIVE_LOCKS_REQUIRED(crit_render_); | 
| int ProcessRenderStreamLocked() EXCLUSIVE_LOCKS_REQUIRED(crit_render_); | 
|  | 
| +  // Collects configuration settings from public and private | 
| +  // submodules to be saved as an audioproc::Config message. | 
| +  InternalAPMConfig CollectApmConfig() const | 
| +      EXCLUSIVE_LOCKS_REQUIRED(crit_capture_) | 
| +          EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | 
| + | 
| +  // Creates and returns new CaptureStreamInfo filled with the capture | 
| +  // stream and data (delay, drift etc). | 
| +  AecDump::CaptureStreamInfo* RecordUnprocessedCaptureStream( | 
| +      const float* const* capture_stream) const | 
| +      EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | 
| + | 
| +  AecDump::CaptureStreamInfo* RecordUnprocessedCaptureStream( | 
| +      const AudioFrame& capture_frame) const | 
| +      EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | 
| + | 
| +  // Fills the CaptureStreamInfo object with the processed capture | 
| +  // stream and sends it to be written with AecDump. | 
| +  void RecordProcessedCaptureStream( | 
| +      const float* const* processed_capture_stream, | 
| +      AecDump::CaptureStreamInfo* stream_info) const | 
| +      EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | 
| + | 
| +  void RecordProcessedCaptureStream(const AudioFrame& processed_capture_frame, | 
| +                                    AecDump::CaptureStreamInfo* stream_info) | 
| +      const EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | 
| + | 
| +  // Copies data (delay, drift, etc) into the |stream_info| object. | 
| +  void PopulateStreamInfoWithState(AecDump::CaptureStreamInfo* stream_info) | 
| +      const EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); | 
| + | 
| // Debug dump methods that are internal and called without locks. | 
| // TODO(peah): Make thread safe. | 
| #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP | 
| @@ -299,6 +333,10 @@ class AudioProcessingImpl : public AudioProcessing { | 
| ApmDebugDumpState debug_dump_; | 
| #endif | 
|  | 
| +  // AecDump instance used for optionally logging APM config, input | 
| +  // and output to file in the AEC-dump format defined in debug.proto. | 
| +  std::unique_ptr<AecDump> aec_dump_; | 
| + | 
| // Critical sections. | 
| rtc::CriticalSection crit_render_ ACQUIRED_BEFORE(crit_capture_); | 
| rtc::CriticalSection crit_capture_; | 
|  |