blob: 831eabb8c6f1f5c1af50e81caa75649a2e17ef78 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
andrew@webrtc.org6f9f8172012-03-06 19:03:39 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_AUDIO_PROCESSING_IMPL_H_
12#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_AUDIO_PROCESSING_IMPL_H_
13
pbos@webrtc.org7fad4b82013-05-28 08:11:59 +000014#include "webrtc/modules/audio_processing/include/audio_processing.h"
andrew@webrtc.org7bf26462011-12-03 00:03:31 +000015
niklase@google.com470e71d2011-07-07 08:21:25 +000016#include <list>
ajm@google.com808e0e02011-08-03 21:08:51 +000017#include <string>
niklase@google.com470e71d2011-07-07 08:21:25 +000018
pbos@webrtc.org7fad4b82013-05-28 08:11:59 +000019#include "webrtc/system_wrappers/interface/scoped_ptr.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000020
21namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000022class AudioBuffer;
ajm@google.com808e0e02011-08-03 21:08:51 +000023class CriticalSectionWrapper;
andrew@webrtc.org61e596f2013-07-25 18:28:29 +000024class EchoCancellationImplWrapper;
niklase@google.com470e71d2011-07-07 08:21:25 +000025class EchoControlMobileImpl;
ajm@google.com808e0e02011-08-03 21:08:51 +000026class FileWrapper;
niklase@google.com470e71d2011-07-07 08:21:25 +000027class GainControlImpl;
28class HighPassFilterImpl;
29class LevelEstimatorImpl;
30class NoiseSuppressionImpl;
31class ProcessingComponent;
32class VoiceDetectionImpl;
33
andrew@webrtc.org7bf26462011-12-03 00:03:31 +000034#ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP
35namespace audioproc {
36
37class Event;
38
39} // namespace audioproc
40#endif
41
niklase@google.com470e71d2011-07-07 08:21:25 +000042class AudioProcessingImpl : public AudioProcessing {
43 public:
44 enum {
45 kSampleRate8kHz = 8000,
46 kSampleRate16kHz = 16000,
47 kSampleRate32kHz = 32000
48 };
49
50 explicit AudioProcessingImpl(int id);
51 virtual ~AudioProcessingImpl();
52
53 CriticalSectionWrapper* crit() const;
54
55 int split_sample_rate_hz() const;
56 bool was_stream_delay_set() const;
57
58 // AudioProcessing methods.
59 virtual int Initialize();
60 virtual int InitializeLocked();
andrew@webrtc.org61e596f2013-07-25 18:28:29 +000061 virtual void SetExtraOptions(const Config& config);
niklase@google.com470e71d2011-07-07 08:21:25 +000062 virtual int set_sample_rate_hz(int rate);
63 virtual int sample_rate_hz() const;
64 virtual int set_num_channels(int input_channels, int output_channels);
65 virtual int num_input_channels() const;
66 virtual int num_output_channels() const;
67 virtual int set_num_reverse_channels(int channels);
68 virtual int num_reverse_channels() const;
69 virtual int ProcessStream(AudioFrame* frame);
70 virtual int AnalyzeReverseStream(AudioFrame* frame);
71 virtual int set_stream_delay_ms(int delay);
72 virtual int stream_delay_ms() const;
andrew@webrtc.org6f9f8172012-03-06 19:03:39 +000073 virtual void set_delay_offset_ms(int offset);
74 virtual int delay_offset_ms() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000075 virtual int StartDebugRecording(const char filename[kMaxFilenameSize]);
76 virtual int StopDebugRecording();
77 virtual EchoCancellation* echo_cancellation() const;
78 virtual EchoControlMobile* echo_control_mobile() const;
79 virtual GainControl* gain_control() const;
80 virtual HighPassFilter* high_pass_filter() const;
81 virtual LevelEstimator* level_estimator() const;
82 virtual NoiseSuppression* noise_suppression() const;
83 virtual VoiceDetection* voice_detection() const;
84
85 // Module methods.
pbos@webrtc.orgb7192b82013-04-10 07:50:54 +000086 virtual int32_t ChangeUniqueId(const int32_t id);
niklase@google.com470e71d2011-07-07 08:21:25 +000087
88 private:
andrew@webrtc.org369166a2012-04-24 18:38:03 +000089 bool is_data_processed() const;
90 bool interleave_needed(bool is_data_processed) const;
91 bool synthesis_needed(bool is_data_processed) const;
92 bool analysis_needed(bool is_data_processed) const;
ajm@google.com808e0e02011-08-03 21:08:51 +000093
niklase@google.com470e71d2011-07-07 08:21:25 +000094 int id_;
95
andrew@webrtc.org61e596f2013-07-25 18:28:29 +000096 EchoCancellationImplWrapper* echo_cancellation_;
niklase@google.com470e71d2011-07-07 08:21:25 +000097 EchoControlMobileImpl* echo_control_mobile_;
98 GainControlImpl* gain_control_;
99 HighPassFilterImpl* high_pass_filter_;
100 LevelEstimatorImpl* level_estimator_;
101 NoiseSuppressionImpl* noise_suppression_;
102 VoiceDetectionImpl* voice_detection_;
103
104 std::list<ProcessingComponent*> component_list_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000105 CriticalSectionWrapper* crit_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000106 AudioBuffer* render_audio_;
107 AudioBuffer* capture_audio_;
andrew@webrtc.org7bf26462011-12-03 00:03:31 +0000108#ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP
109 // TODO(andrew): make this more graceful. Ideally we would split this stuff
110 // out into a separate class with an "enabled" and "disabled" implementation.
111 int WriteMessageToDebugFile();
112 int WriteInitMessage();
113 scoped_ptr<FileWrapper> debug_file_;
114 scoped_ptr<audioproc::Event> event_msg_; // Protobuf message.
115 std::string event_str_; // Memory for protobuf serialization.
116#endif
niklase@google.com470e71d2011-07-07 08:21:25 +0000117
118 int sample_rate_hz_;
119 int split_sample_rate_hz_;
120 int samples_per_channel_;
121 int stream_delay_ms_;
andrew@webrtc.org6f9f8172012-03-06 19:03:39 +0000122 int delay_offset_ms_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000123 bool was_stream_delay_set_;
124
ajm@google.com808e0e02011-08-03 21:08:51 +0000125 int num_reverse_channels_;
126 int num_input_channels_;
127 int num_output_channels_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000128};
129} // namespace webrtc
130
131#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_AUDIO_PROCESSING_IMPL_H_