|  | /* | 
|  | *  Copyright (c) 2012 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 MODULES_AUDIO_PROCESSING_ECHO_CONTROL_MOBILE_IMPL_H_ | 
|  | #define MODULES_AUDIO_PROCESSING_ECHO_CONTROL_MOBILE_IMPL_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <memory> | 
|  | #include <vector> | 
|  |  | 
|  | #include "api/array_view.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | class AudioBuffer; | 
|  |  | 
|  | // The acoustic echo control for mobile (AECM) component is a low complexity | 
|  | // robust option intended for use on mobile devices. | 
|  | class EchoControlMobileImpl { | 
|  | public: | 
|  | EchoControlMobileImpl(); | 
|  |  | 
|  | ~EchoControlMobileImpl(); | 
|  |  | 
|  | // Recommended settings for particular audio routes. In general, the louder | 
|  | // the echo is expected to be, the higher this value should be set. The | 
|  | // preferred setting may vary from device to device. | 
|  | enum RoutingMode { | 
|  | kQuietEarpieceOrHeadset, | 
|  | kEarpiece, | 
|  | kLoudEarpiece, | 
|  | kSpeakerphone, | 
|  | kLoudSpeakerphone | 
|  | }; | 
|  |  | 
|  | // Sets echo control appropriate for the audio routing |mode| on the device. | 
|  | // It can and should be updated during a call if the audio routing changes. | 
|  | int set_routing_mode(RoutingMode mode); | 
|  | RoutingMode routing_mode() const; | 
|  |  | 
|  | // Comfort noise replaces suppressed background noise to maintain a | 
|  | // consistent signal level. | 
|  | int enable_comfort_noise(bool enable); | 
|  | bool is_comfort_noise_enabled() const; | 
|  |  | 
|  | void ProcessRenderAudio(rtc::ArrayView<const int16_t> packed_render_audio); | 
|  | int ProcessCaptureAudio(AudioBuffer* audio, int stream_delay_ms); | 
|  |  | 
|  | void Initialize(int sample_rate_hz, | 
|  | size_t num_reverse_channels, | 
|  | size_t num_output_channels); | 
|  |  | 
|  | static void PackRenderAudioBuffer(const AudioBuffer* audio, | 
|  | size_t num_output_channels, | 
|  | size_t num_channels, | 
|  | std::vector<int16_t>* packed_buffer); | 
|  |  | 
|  | static size_t NumCancellersRequired(size_t num_output_channels, | 
|  | size_t num_reverse_channels); | 
|  |  | 
|  | private: | 
|  | class Canceller; | 
|  | struct StreamProperties; | 
|  |  | 
|  | int Configure(); | 
|  |  | 
|  | RoutingMode routing_mode_; | 
|  | bool comfort_noise_enabled_; | 
|  |  | 
|  | std::vector<std::unique_ptr<Canceller>> cancellers_; | 
|  | std::unique_ptr<StreamProperties> stream_properties_; | 
|  | std::vector<std::array<int16_t, 160>> low_pass_reference_; | 
|  | bool reference_copied_ = false; | 
|  | }; | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // MODULES_AUDIO_PROCESSING_ECHO_CONTROL_MOBILE_IMPL_H_ |