Add API for disabling the high pass filter.

BUG=issue419
TEST=manually with voe_cmd_test

Review URL: https://webrtc-codereview.appspot.com/509003

git-svn-id: http://webrtc.googlecode.com/svn/trunk@2105 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
andrew@webrtc.org
2012-04-24 18:38:03 +00:00
parent 48a5df6481
commit 369166a179
5 changed files with 45 additions and 12 deletions

View File

@ -292,8 +292,8 @@ int AudioProcessingImpl::ProcessStream(AudioFrame* frame) {
frame->_audioChannel = num_output_channels_; frame->_audioChannel = num_output_channels_;
} }
bool data_changed = stream_data_changed(); bool data_processed = is_data_processed();
if (analysis_needed(data_changed)) { if (analysis_needed(data_processed)) {
for (int i = 0; i < num_output_channels_; i++) { for (int i = 0; i < num_output_channels_; i++) {
// Split into a low and high band. // Split into a low and high band.
SplittingFilterAnalysis(capture_audio_->data(i), SplittingFilterAnalysis(capture_audio_->data(i),
@ -344,7 +344,7 @@ int AudioProcessingImpl::ProcessStream(AudioFrame* frame) {
return err; return err;
} }
if (synthesis_needed(data_changed)) { if (synthesis_needed(data_processed)) {
for (int i = 0; i < num_output_channels_; i++) { for (int i = 0; i < num_output_channels_; i++) {
// Recombine low and high bands. // Recombine low and high bands.
SplittingFilterSynthesis(capture_audio_->low_pass_split_data(i), SplittingFilterSynthesis(capture_audio_->low_pass_split_data(i),
@ -361,7 +361,7 @@ int AudioProcessingImpl::ProcessStream(AudioFrame* frame) {
return err; return err;
} }
capture_audio_->InterleaveTo(frame, data_changed); capture_audio_->InterleaveTo(frame, interleave_needed(data_processed));
#ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP
if (debug_file_->Open()) { if (debug_file_->Open()) {
@ -567,7 +567,7 @@ WebRtc_Word32 AudioProcessingImpl::ChangeUniqueId(const WebRtc_Word32 id) {
return kNoError; return kNoError;
} }
bool AudioProcessingImpl::stream_data_changed() const { bool AudioProcessingImpl::is_data_processed() const {
int enabled_count = 0; int enabled_count = 0;
std::list<ProcessingComponent*>::const_iterator it; std::list<ProcessingComponent*>::const_iterator it;
for (it = component_list_.begin(); it != component_list_.end(); it++) { for (it = component_list_.begin(); it != component_list_.end(); it++) {
@ -592,12 +592,17 @@ bool AudioProcessingImpl::stream_data_changed() const {
return true; return true;
} }
bool AudioProcessingImpl::synthesis_needed(bool stream_data_changed) const { bool AudioProcessingImpl::interleave_needed(bool is_data_processed) const {
return (stream_data_changed && sample_rate_hz_ == kSampleRate32kHz); // Check if we've upmixed or downmixed the audio.
return (num_output_channels_ != num_input_channels_ || is_data_processed);
} }
bool AudioProcessingImpl::analysis_needed(bool stream_data_changed) const { bool AudioProcessingImpl::synthesis_needed(bool is_data_processed) const {
if (!stream_data_changed && !voice_detection_->is_enabled()) { return (is_data_processed && sample_rate_hz_ == kSampleRate32kHz);
}
bool AudioProcessingImpl::analysis_needed(bool is_data_processed) const {
if (!is_data_processed && !voice_detection_->is_enabled()) {
// Only level_estimator_ is enabled. // Only level_estimator_ is enabled.
return false; return false;
} else if (sample_rate_hz_ == kSampleRate32kHz) { } else if (sample_rate_hz_ == kSampleRate32kHz) {

View File

@ -85,9 +85,10 @@ class AudioProcessingImpl : public AudioProcessing {
virtual WebRtc_Word32 ChangeUniqueId(const WebRtc_Word32 id); virtual WebRtc_Word32 ChangeUniqueId(const WebRtc_Word32 id);
private: private:
bool stream_data_changed() const; bool is_data_processed() const;
bool synthesis_needed(bool stream_data_changed) const; bool interleave_needed(bool is_data_processed) const;
bool analysis_needed(bool stream_data_changed) const; bool synthesis_needed(bool is_data_processed) const;
bool analysis_needed(bool is_data_processed) const;
int id_; int id_;

View File

@ -112,6 +112,11 @@ public:
// Gets settings for the AECM. // Gets settings for the AECM.
virtual int GetAecmMode(AecmModes& mode, bool& enabledCNG) = 0; virtual int GetAecmMode(AecmModes& mode, bool& enabledCNG) = 0;
// Enables a high pass filter on the capture signal. This removes DC bias
// and low-frequency noise. Recommended to be enabled.
virtual int EnableHighPassFilter(bool enable) = 0;
virtual bool IsHighPassFilterEnabled() = 0;
// Sets status and mode of the receiving-side (Rx) NS. // Sets status and mode of the receiving-side (Rx) NS.
// The Rx NS reduces noise in the received signal for the specified // The Rx NS reduces noise in the received signal for the specified
// |channel|. Intended for advanced usage only. // |channel|. Intended for advanced usage only.

View File

@ -734,6 +734,25 @@ int VoEAudioProcessingImpl::GetAecmMode(AecmModes& mode, bool& enabledCNG) {
#endif #endif
} }
int VoEAudioProcessingImpl::EnableHighPassFilter(bool enable) {
WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
"EnableHighPassFilter(%d)", enable);
if (_shared->audio_processing()->high_pass_filter()->Enable(enable) !=
AudioProcessing::kNoError) {
_shared->SetLastError(VE_APM_ERROR, kTraceError,
"HighPassFilter::Enable() failed.");
return -1;
}
return 0;
}
bool VoEAudioProcessingImpl::IsHighPassFilterEnabled() {
WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
"IsHighPassFilterEnabled()");
return _shared->audio_processing()->high_pass_filter()->is_enabled();
}
int VoEAudioProcessingImpl::RegisterRxVadObserver( int VoEAudioProcessingImpl::RegisterRxVadObserver(
int channel, int channel,
VoERxVadCallback& observer) { VoERxVadCallback& observer) {

View File

@ -65,6 +65,9 @@ class VoEAudioProcessingImpl
virtual int GetAecmMode(AecmModes& mode, bool& enabledCNG); virtual int GetAecmMode(AecmModes& mode, bool& enabledCNG);
virtual int EnableHighPassFilter(bool enable);
virtual bool IsHighPassFilterEnabled();
virtual int RegisterRxVadObserver(int channel, virtual int RegisterRxVadObserver(int channel,
VoERxVadCallback& observer); VoERxVadCallback& observer);