1e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/* 2e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 4e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Use of this source code is governed by a BSD-style license 5e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * that can be found in the LICENSE file in the root of the source 6e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * tree. An additional intellectual property rights grant can be found 7e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * in the file PATENTS. All contributing project authors may 8e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * be found in the AUTHORS file in the root of the source tree. 9e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 10e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 11e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_AUDIO_PROCESSING_IMPL_H_ 12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_AUDIO_PROCESSING_IMPL_H_ 13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 14c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "audio_processing.h" 15c55a96383497a772a307b346368133960b02ad03Eric Laurent 16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include <list> 17c55a96383497a772a307b346368133960b02ad03Eric Laurent#include <string> 18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 19c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "scoped_ptr.h" 20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentnamespace webrtc { 22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass AudioBuffer; 23c55a96383497a772a307b346368133960b02ad03Eric Laurentclass CriticalSectionWrapper; 24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass EchoCancellationImpl; 25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass EchoControlMobileImpl; 26c55a96383497a772a307b346368133960b02ad03Eric Laurentclass FileWrapper; 27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass GainControlImpl; 28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass HighPassFilterImpl; 29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass LevelEstimatorImpl; 30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass NoiseSuppressionImpl; 31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass ProcessingComponent; 32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass VoiceDetectionImpl; 33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 34c55a96383497a772a307b346368133960b02ad03Eric Laurent#ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP 35c55a96383497a772a307b346368133960b02ad03Eric Laurentnamespace audioproc { 36c55a96383497a772a307b346368133960b02ad03Eric Laurent 37c55a96383497a772a307b346368133960b02ad03Eric Laurentclass Event; 38c55a96383497a772a307b346368133960b02ad03Eric Laurent 39c55a96383497a772a307b346368133960b02ad03Eric Laurent} // namespace audioproc 40c55a96383497a772a307b346368133960b02ad03Eric Laurent#endif 41c55a96383497a772a307b346368133960b02ad03Eric Laurent 42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass AudioProcessingImpl : public AudioProcessing { 43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent public: 44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent enum { 45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kSampleRate8kHz = 8000, 46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kSampleRate16kHz = 16000, 47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kSampleRate32kHz = 32000 48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent }; 49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent explicit AudioProcessingImpl(int id); 51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual ~AudioProcessingImpl(); 52e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent CriticalSectionWrapper* crit() const; 54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int split_sample_rate_hz() const; 56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool was_stream_delay_set() const; 57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // AudioProcessing methods. 59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int Initialize(); 60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int InitializeLocked(); 61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int set_sample_rate_hz(int rate); 62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int sample_rate_hz() const; 63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int set_num_channels(int input_channels, int output_channels); 64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int num_input_channels() const; 65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int num_output_channels() const; 66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int set_num_reverse_channels(int channels); 67e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int num_reverse_channels() const; 68e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int ProcessStream(AudioFrame* frame); 69e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int AnalyzeReverseStream(AudioFrame* frame); 70e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int set_stream_delay_ms(int delay); 71e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int stream_delay_ms() const; 72e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int StartDebugRecording(const char filename[kMaxFilenameSize]); 73e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int StopDebugRecording(); 74e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual EchoCancellation* echo_cancellation() const; 75e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual EchoControlMobile* echo_control_mobile() const; 76e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual GainControl* gain_control() const; 77e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual HighPassFilter* high_pass_filter() const; 78e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual LevelEstimator* level_estimator() const; 79e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual NoiseSuppression* noise_suppression() const; 80e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual VoiceDetection* voice_detection() const; 81e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 82e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Module methods. 83e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual WebRtc_Word32 ChangeUniqueId(const WebRtc_Word32 id); 84e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 85e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent private: 86c55a96383497a772a307b346368133960b02ad03Eric Laurent bool stream_data_changed() const; 87c55a96383497a772a307b346368133960b02ad03Eric Laurent bool synthesis_needed(bool stream_data_changed) const; 88c55a96383497a772a307b346368133960b02ad03Eric Laurent bool analysis_needed(bool stream_data_changed) const; 89c55a96383497a772a307b346368133960b02ad03Eric Laurent 90e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int id_; 91e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 92e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent EchoCancellationImpl* echo_cancellation_; 93e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent EchoControlMobileImpl* echo_control_mobile_; 94e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent GainControlImpl* gain_control_; 95e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent HighPassFilterImpl* high_pass_filter_; 96e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent LevelEstimatorImpl* level_estimator_; 97e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent NoiseSuppressionImpl* noise_suppression_; 98e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent VoiceDetectionImpl* voice_detection_; 99e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 100e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent std::list<ProcessingComponent*> component_list_; 101e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent CriticalSectionWrapper* crit_; 102e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent AudioBuffer* render_audio_; 103e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent AudioBuffer* capture_audio_; 104c55a96383497a772a307b346368133960b02ad03Eric Laurent#ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP 105c55a96383497a772a307b346368133960b02ad03Eric Laurent // TODO(andrew): make this more graceful. Ideally we would split this stuff 106c55a96383497a772a307b346368133960b02ad03Eric Laurent // out into a separate class with an "enabled" and "disabled" implementation. 107c55a96383497a772a307b346368133960b02ad03Eric Laurent int WriteMessageToDebugFile(); 108c55a96383497a772a307b346368133960b02ad03Eric Laurent int WriteInitMessage(); 109c55a96383497a772a307b346368133960b02ad03Eric Laurent scoped_ptr<FileWrapper> debug_file_; 110c55a96383497a772a307b346368133960b02ad03Eric Laurent scoped_ptr<audioproc::Event> event_msg_; // Protobuf message. 111c55a96383497a772a307b346368133960b02ad03Eric Laurent std::string event_str_; // Memory for protobuf serialization. 112c55a96383497a772a307b346368133960b02ad03Eric Laurent#endif 113e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 114e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int sample_rate_hz_; 115e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int split_sample_rate_hz_; 116e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int samples_per_channel_; 117e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int stream_delay_ms_; 118e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool was_stream_delay_set_; 119e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 120c55a96383497a772a307b346368133960b02ad03Eric Laurent int num_reverse_channels_; 121c55a96383497a772a307b346368133960b02ad03Eric Laurent int num_input_channels_; 122c55a96383497a772a307b346368133960b02ad03Eric Laurent int num_output_channels_; 123e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 124e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} // namespace webrtc 125e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 126e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_AUDIO_PROCESSING_IMPL_H_ 127