1 /* 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3 * 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 #include "noise_suppression_impl.h" 12 13 #include <cassert> 14 15 #include "critical_section_wrapper.h" 16 #if defined(WEBRTC_NS_FLOAT) 17 #include "noise_suppression.h" 18 #elif defined(WEBRTC_NS_FIXED) 19 #include "noise_suppression_x.h" 20 #endif 21 22 #include "audio_processing_impl.h" 23 #include "audio_buffer.h" 24 25 namespace webrtc { 26 27 #if defined(WEBRTC_NS_FLOAT) 28 typedef NsHandle Handle; 29 #elif defined(WEBRTC_NS_FIXED) 30 typedef NsxHandle Handle; 31 #endif 32 33 namespace { 34 int MapSetting(NoiseSuppression::Level level) { 35 switch (level) { 36 case NoiseSuppression::kLow: 37 return 0; 38 case NoiseSuppression::kModerate: 39 return 1; 40 case NoiseSuppression::kHigh: 41 return 2; 42 case NoiseSuppression::kVeryHigh: 43 return 3; 44 default: 45 return -1; 46 } 47 } 48 } // namespace 49 50 NoiseSuppressionImpl::NoiseSuppressionImpl(const AudioProcessingImpl* apm) 51 : ProcessingComponent(apm), 52 apm_(apm), 53 level_(kModerate) {} 54 55 NoiseSuppressionImpl::~NoiseSuppressionImpl() {} 56 57 int NoiseSuppressionImpl::ProcessCaptureAudio(AudioBuffer* audio) { 58 int err = apm_->kNoError; 59 60 if (!is_component_enabled()) { 61 return apm_->kNoError; 62 } 63 assert(audio->samples_per_split_channel() <= 160); 64 assert(audio->num_channels() == num_handles()); 65 66 for (int i = 0; i < num_handles(); i++) { 67 Handle* my_handle = static_cast<Handle*>(handle(i)); 68 #if defined(WEBRTC_NS_FLOAT) 69 err = WebRtcNs_Process(static_cast<Handle*>(handle(i)), 70 audio->low_pass_split_data(i), 71 audio->high_pass_split_data(i), 72 audio->low_pass_split_data(i), 73 audio->high_pass_split_data(i)); 74 #elif defined(WEBRTC_NS_FIXED) 75 err = WebRtcNsx_Process(static_cast<Handle*>(handle(i)), 76 audio->low_pass_split_data(i), 77 audio->high_pass_split_data(i), 78 audio->low_pass_split_data(i), 79 audio->high_pass_split_data(i)); 80 #endif 81 82 if (err != apm_->kNoError) { 83 return GetHandleError(my_handle); 84 } 85 } 86 87 return apm_->kNoError; 88 } 89 90 int NoiseSuppressionImpl::Enable(bool enable) { 91 CriticalSectionScoped crit_scoped(*apm_->crit()); 92 return EnableComponent(enable); 93 } 94 95 bool NoiseSuppressionImpl::is_enabled() const { 96 return is_component_enabled(); 97 } 98 99 int NoiseSuppressionImpl::set_level(Level level) { 100 CriticalSectionScoped crit_scoped(*apm_->crit()); 101 if (MapSetting(level) == -1) { 102 return apm_->kBadParameterError; 103 } 104 105 level_ = level; 106 return Configure(); 107 } 108 109 NoiseSuppression::Level NoiseSuppressionImpl::level() const { 110 return level_; 111 } 112 113 int NoiseSuppressionImpl::get_version(char* version, 114 int version_len_bytes) const { 115 #if defined(WEBRTC_NS_FLOAT) 116 if (WebRtcNs_get_version(version, version_len_bytes) != 0) 117 #elif defined(WEBRTC_NS_FIXED) 118 if (WebRtcNsx_get_version(version, version_len_bytes) != 0) 119 #endif 120 { 121 return apm_->kBadParameterError; 122 } 123 124 return apm_->kNoError; 125 } 126 127 void* NoiseSuppressionImpl::CreateHandle() const { 128 Handle* handle = NULL; 129 #if defined(WEBRTC_NS_FLOAT) 130 if (WebRtcNs_Create(&handle) != apm_->kNoError) 131 #elif defined(WEBRTC_NS_FIXED) 132 if (WebRtcNsx_Create(&handle) != apm_->kNoError) 133 #endif 134 { 135 handle = NULL; 136 } else { 137 assert(handle != NULL); 138 } 139 140 return handle; 141 } 142 143 int NoiseSuppressionImpl::DestroyHandle(void* handle) const { 144 #if defined(WEBRTC_NS_FLOAT) 145 return WebRtcNs_Free(static_cast<Handle*>(handle)); 146 #elif defined(WEBRTC_NS_FIXED) 147 return WebRtcNsx_Free(static_cast<Handle*>(handle)); 148 #endif 149 } 150 151 int NoiseSuppressionImpl::InitializeHandle(void* handle) const { 152 #if defined(WEBRTC_NS_FLOAT) 153 return WebRtcNs_Init(static_cast<Handle*>(handle), apm_->sample_rate_hz()); 154 #elif defined(WEBRTC_NS_FIXED) 155 return WebRtcNsx_Init(static_cast<Handle*>(handle), apm_->sample_rate_hz()); 156 #endif 157 } 158 159 int NoiseSuppressionImpl::ConfigureHandle(void* handle) const { 160 #if defined(WEBRTC_NS_FLOAT) 161 return WebRtcNs_set_policy(static_cast<Handle*>(handle), 162 MapSetting(level_)); 163 #elif defined(WEBRTC_NS_FIXED) 164 return WebRtcNsx_set_policy(static_cast<Handle*>(handle), 165 MapSetting(level_)); 166 #endif 167 } 168 169 int NoiseSuppressionImpl::num_handles_required() const { 170 return apm_->num_output_channels(); 171 } 172 173 int NoiseSuppressionImpl::GetHandleError(void* handle) const { 174 // The NS has no get_error() function. 175 assert(handle != NULL); 176 return apm_->kUnspecifiedError; 177 } 178 } // namespace webrtc 179 180