| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 #include "webrtc/modules/audio_processing/noise_suppression_impl.h" | 35 #include "webrtc/modules/audio_processing/noise_suppression_impl.h" |
| 36 #include "webrtc/modules/audio_processing/processing_component.h" | 36 #include "webrtc/modules/audio_processing/processing_component.h" |
| 37 #include "webrtc/modules/audio_processing/transient/transient_suppressor.h" | 37 #include "webrtc/modules/audio_processing/transient/transient_suppressor.h" |
| 38 #include "webrtc/modules/audio_processing/voice_detection_impl.h" | 38 #include "webrtc/modules/audio_processing/voice_detection_impl.h" |
| 39 #include "webrtc/modules/interface/module_common_types.h" | 39 #include "webrtc/modules/interface/module_common_types.h" |
| 40 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" | 40 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" |
| 41 #include "webrtc/system_wrappers/interface/file_wrapper.h" | 41 #include "webrtc/system_wrappers/interface/file_wrapper.h" |
| 42 #include "webrtc/system_wrappers/interface/logging.h" | 42 #include "webrtc/system_wrappers/interface/logging.h" |
| 43 #include "webrtc/system_wrappers/interface/metrics.h" | 43 #include "webrtc/system_wrappers/interface/metrics.h" |
| 44 | 44 |
| 45 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP | |
| 46 // Files generated at build-time by the protobuf compiler. | |
| 47 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD | |
| 48 #include "external/webrtc/webrtc/modules/audio_processing/debug.pb.h" | |
| 49 #else | |
| 50 #include "webrtc/audio_processing/debug.pb.h" | |
| 51 #endif | |
| 52 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP | |
| 53 | |
| 54 #define RETURN_ON_ERR(expr) \ | 45 #define RETURN_ON_ERR(expr) \ |
| 55 do { \ | 46 do { \ |
| 56 int err = (expr); \ | 47 int err = (expr); \ |
| 57 if (err != kNoError) { \ | 48 if (err != kNoError) { \ |
| 58 return err; \ | 49 return err; \ |
| 59 } \ | 50 } \ |
| 60 } while (0) | 51 } while (0) |
| 61 | 52 |
| 53 #define UPDATE_CONFIG(field_name, new_value) \ |
| 54 { \ |
| 55 const auto value = new_value; \ |
| 56 if (!config_->has_##field_name() || config_->field_name() != value) { \ |
| 57 config_->set_##field_name(value); \ |
| 58 changed = true; \ |
| 59 } \ |
| 60 } |
| 61 |
| 62 namespace webrtc { | 62 namespace webrtc { |
| 63 namespace { | 63 namespace { |
| 64 | 64 |
| 65 static bool LayoutHasKeyboard(AudioProcessing::ChannelLayout layout) { | 65 static bool LayoutHasKeyboard(AudioProcessing::ChannelLayout layout) { |
| 66 switch (layout) { | 66 switch (layout) { |
| 67 case AudioProcessing::kMono: | 67 case AudioProcessing::kMono: |
| 68 case AudioProcessing::kStereo: | 68 case AudioProcessing::kStereo: |
| 69 return false; | 69 return false; |
| 70 case AudioProcessing::kMonoAndKeyboard: | 70 case AudioProcessing::kMonoAndKeyboard: |
| 71 case AudioProcessing::kStereoAndKeyboard: | 71 case AudioProcessing::kStereoAndKeyboard: |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 echo_control_mobile_(NULL), | 187 echo_control_mobile_(NULL), |
| 188 gain_control_(NULL), | 188 gain_control_(NULL), |
| 189 high_pass_filter_(NULL), | 189 high_pass_filter_(NULL), |
| 190 level_estimator_(NULL), | 190 level_estimator_(NULL), |
| 191 noise_suppression_(NULL), | 191 noise_suppression_(NULL), |
| 192 voice_detection_(NULL), | 192 voice_detection_(NULL), |
| 193 crit_(CriticalSectionWrapper::CreateCriticalSection()), | 193 crit_(CriticalSectionWrapper::CreateCriticalSection()), |
| 194 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP | 194 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP |
| 195 debug_file_(FileWrapper::Create()), | 195 debug_file_(FileWrapper::Create()), |
| 196 event_msg_(new audioproc::Event()), | 196 event_msg_(new audioproc::Event()), |
| 197 config_(new audioproc::Config()), |
| 197 #endif | 198 #endif |
| 198 api_format_({{{kSampleRate16kHz, 1, false}, | 199 api_format_({{{kSampleRate16kHz, 1, false}, |
| 199 {kSampleRate16kHz, 1, false}, | 200 {kSampleRate16kHz, 1, false}, |
| 200 {kSampleRate16kHz, 1, false}, | 201 {kSampleRate16kHz, 1, false}, |
| 201 {kSampleRate16kHz, 1, false}}}), | 202 {kSampleRate16kHz, 1, false}}}), |
| 202 fwd_proc_format_(kSampleRate16kHz), | 203 fwd_proc_format_(kSampleRate16kHz), |
| 203 rev_proc_format_(kSampleRate16kHz, 1), | 204 rev_proc_format_(kSampleRate16kHz, 1), |
| 204 split_rate_(kSampleRate16kHz), | 205 split_rate_(kSampleRate16kHz), |
| 205 stream_delay_ms_(0), | 206 stream_delay_ms_(0), |
| 206 delay_offset_ms_(0), | 207 delay_offset_ms_(0), |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 | 244 |
| 244 noise_suppression_ = new NoiseSuppressionImpl(this, crit_); | 245 noise_suppression_ = new NoiseSuppressionImpl(this, crit_); |
| 245 component_list_.push_back(noise_suppression_); | 246 component_list_.push_back(noise_suppression_); |
| 246 | 247 |
| 247 voice_detection_ = new VoiceDetectionImpl(this, crit_); | 248 voice_detection_ = new VoiceDetectionImpl(this, crit_); |
| 248 component_list_.push_back(voice_detection_); | 249 component_list_.push_back(voice_detection_); |
| 249 | 250 |
| 250 gain_control_for_new_agc_.reset(new GainControlForNewAgc(gain_control_)); | 251 gain_control_for_new_agc_.reset(new GainControlForNewAgc(gain_control_)); |
| 251 | 252 |
| 252 SetExtraOptions(config); | 253 SetExtraOptions(config); |
| 254 |
| 255 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP |
| 256 UpdateCurrentConfig(); |
| 257 #endif |
| 253 } | 258 } |
| 254 | 259 |
| 255 AudioProcessingImpl::~AudioProcessingImpl() { | 260 AudioProcessingImpl::~AudioProcessingImpl() { |
| 256 { | 261 { |
| 257 CriticalSectionScoped crit_scoped(crit_); | 262 CriticalSectionScoped crit_scoped(crit_); |
| 258 // Depends on gain_control_ and gain_control_for_new_agc_. | 263 // Depends on gain_control_ and gain_control_for_new_agc_. |
| 259 agc_manager_.reset(); | 264 agc_manager_.reset(); |
| 260 // Depends on gain_control_. | 265 // Depends on gain_control_. |
| 261 gain_control_for_new_agc_.reset(); | 266 gain_control_for_new_agc_.reset(); |
| 262 while (!component_list_.empty()) { | 267 while (!component_list_.empty()) { |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 | 558 |
| 554 ProcessingConfig processing_config = api_format_; | 559 ProcessingConfig processing_config = api_format_; |
| 555 processing_config.input_stream() = input_config; | 560 processing_config.input_stream() = input_config; |
| 556 processing_config.output_stream() = output_config; | 561 processing_config.output_stream() = output_config; |
| 557 | 562 |
| 558 RETURN_ON_ERR(MaybeInitializeLocked(processing_config)); | 563 RETURN_ON_ERR(MaybeInitializeLocked(processing_config)); |
| 559 assert(processing_config.input_stream().num_frames() == | 564 assert(processing_config.input_stream().num_frames() == |
| 560 api_format_.input_stream().num_frames()); | 565 api_format_.input_stream().num_frames()); |
| 561 | 566 |
| 562 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP | 567 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP |
| 568 if (debug_file_->Open() && UpdateCurrentConfig()) { |
| 569 RETURN_ON_ERR(WriteConfigMessage()); |
| 570 } |
| 571 #endif |
| 572 |
| 573 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP |
| 563 if (debug_file_->Open()) { | 574 if (debug_file_->Open()) { |
| 564 event_msg_->set_type(audioproc::Event::STREAM); | 575 event_msg_->set_type(audioproc::Event::STREAM); |
| 565 audioproc::Stream* msg = event_msg_->mutable_stream(); | 576 audioproc::Stream* msg = event_msg_->mutable_stream(); |
| 566 const size_t channel_size = | 577 const size_t channel_size = |
| 567 sizeof(float) * api_format_.input_stream().num_frames(); | 578 sizeof(float) * api_format_.input_stream().num_frames(); |
| 568 for (int i = 0; i < api_format_.input_stream().num_channels(); ++i) | 579 for (int i = 0; i < api_format_.input_stream().num_channels(); ++i) |
| 569 msg->add_input_channel(src[i], channel_size); | 580 msg->add_input_channel(src[i], channel_size); |
| 570 } | 581 } |
| 571 #endif | 582 #endif |
| 572 | 583 |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 939 if (debug_file_->CloseFile() == -1) { | 950 if (debug_file_->CloseFile() == -1) { |
| 940 return kFileError; | 951 return kFileError; |
| 941 } | 952 } |
| 942 } | 953 } |
| 943 | 954 |
| 944 if (debug_file_->OpenFile(filename, false) == -1) { | 955 if (debug_file_->OpenFile(filename, false) == -1) { |
| 945 debug_file_->CloseFile(); | 956 debug_file_->CloseFile(); |
| 946 return kFileError; | 957 return kFileError; |
| 947 } | 958 } |
| 948 | 959 |
| 949 int err = WriteInitMessage(); | 960 UpdateCurrentConfig(); |
| 961 int err = WriteConfigMessage(); |
| 950 if (err != kNoError) { | 962 if (err != kNoError) { |
| 951 return err; | 963 return err; |
| 952 } | 964 } |
| 965 |
| 966 err = WriteInitMessage(); |
| 967 if (err != kNoError) { |
| 968 return err; |
| 969 } |
| 953 return kNoError; | 970 return kNoError; |
| 954 #else | 971 #else |
| 955 return kUnsupportedFunctionError; | 972 return kUnsupportedFunctionError; |
| 956 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP | 973 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP |
| 957 } | 974 } |
| 958 | 975 |
| 959 int AudioProcessingImpl::StartDebugRecording(FILE* handle) { | 976 int AudioProcessingImpl::StartDebugRecording(FILE* handle) { |
| 960 CriticalSectionScoped crit_scoped(crit_); | 977 CriticalSectionScoped crit_scoped(crit_); |
| 961 | 978 |
| 962 if (handle == NULL) { | 979 if (handle == NULL) { |
| 963 return kNullPointerError; | 980 return kNullPointerError; |
| 964 } | 981 } |
| 965 | 982 |
| 966 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP | 983 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP |
| 967 // Stop any ongoing recording. | 984 // Stop any ongoing recording. |
| 968 if (debug_file_->Open()) { | 985 if (debug_file_->Open()) { |
| 969 if (debug_file_->CloseFile() == -1) { | 986 if (debug_file_->CloseFile() == -1) { |
| 970 return kFileError; | 987 return kFileError; |
| 971 } | 988 } |
| 972 } | 989 } |
| 973 | 990 |
| 974 if (debug_file_->OpenFromFileHandle(handle, true, false) == -1) { | 991 if (debug_file_->OpenFromFileHandle(handle, true, false) == -1) { |
| 975 return kFileError; | 992 return kFileError; |
| 976 } | 993 } |
| 977 | 994 |
| 978 int err = WriteInitMessage(); | 995 UpdateCurrentConfig(); |
| 996 int err = WriteConfigMessage(); |
| 979 if (err != kNoError) { | 997 if (err != kNoError) { |
| 980 return err; | 998 return err; |
| 981 } | 999 } |
| 1000 |
| 1001 err = WriteInitMessage(); |
| 1002 if (err != kNoError) { |
| 1003 return err; |
| 1004 } |
| 982 return kNoError; | 1005 return kNoError; |
| 983 #else | 1006 #else |
| 984 return kUnsupportedFunctionError; | 1007 return kUnsupportedFunctionError; |
| 985 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP | 1008 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP |
| 986 } | 1009 } |
| 987 | 1010 |
| 988 int AudioProcessingImpl::StartDebugRecordingForPlatformFile( | 1011 int AudioProcessingImpl::StartDebugRecordingForPlatformFile( |
| 989 rtc::PlatformFile handle) { | 1012 rtc::PlatformFile handle) { |
| 990 FILE* stream = rtc::FdopenPlatformFileForWriting(handle); | 1013 FILE* stream = rtc::FdopenPlatformFileForWriting(handle); |
| 991 return StartDebugRecording(stream); | 1014 return StartDebugRecording(stream); |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1248 msg->set_output_sample_rate(api_format_.output_stream().sample_rate_hz()); | 1271 msg->set_output_sample_rate(api_format_.output_stream().sample_rate_hz()); |
| 1249 // TODO(ekmeyerson): Add reverse output fields to event_msg_. | 1272 // TODO(ekmeyerson): Add reverse output fields to event_msg_. |
| 1250 | 1273 |
| 1251 int err = WriteMessageToDebugFile(); | 1274 int err = WriteMessageToDebugFile(); |
| 1252 if (err != kNoError) { | 1275 if (err != kNoError) { |
| 1253 return err; | 1276 return err; |
| 1254 } | 1277 } |
| 1255 | 1278 |
| 1256 return kNoError; | 1279 return kNoError; |
| 1257 } | 1280 } |
| 1281 |
| 1282 bool AudioProcessingImpl::UpdateCurrentConfig() { |
| 1283 bool changed = false; |
| 1284 |
| 1285 // Acoustic echo canceler. |
| 1286 UPDATE_CONFIG(aec_enabled, echo_cancellation_->is_enabled()); |
| 1287 UPDATE_CONFIG(aec_delay_agnostic, |
| 1288 echo_cancellation_->is_delay_agnostic_enabled()); |
| 1289 UPDATE_CONFIG(aec_drift_compensation, |
| 1290 echo_cancellation_->is_drift_compensation_enabled()); |
| 1291 UPDATE_CONFIG(aec_extended_filter, |
| 1292 echo_cancellation_->is_extended_filter_enabled()); |
| 1293 UPDATE_CONFIG(aec_suppression_level, |
| 1294 static_cast<int>(echo_cancellation_->suppression_level())); |
| 1295 // Mobile AEC. |
| 1296 UPDATE_CONFIG(aecm_enabled, echo_control_mobile_->is_enabled()); |
| 1297 UPDATE_CONFIG(aecm_comfort_noise, |
| 1298 echo_control_mobile_->is_comfort_noise_enabled()); |
| 1299 UPDATE_CONFIG(aecm_routing_mode, |
| 1300 static_cast<int>(echo_control_mobile_->routing_mode())); |
| 1301 // Automatic gain controller. |
| 1302 UPDATE_CONFIG(agc_enabled, gain_control_->is_enabled()); |
| 1303 UPDATE_CONFIG(agc_experiment, use_new_agc_); |
| 1304 UPDATE_CONFIG(agc_mode, static_cast<int>(gain_control_->mode())); |
| 1305 UPDATE_CONFIG(agc_limiter, gain_control_->is_limiter_enabled()); |
| 1306 // High pass filter. |
| 1307 UPDATE_CONFIG(hpf_enabled, high_pass_filter_->is_enabled()); |
| 1308 // Noise suppression. |
| 1309 UPDATE_CONFIG(ns_enabled, noise_suppression_->is_enabled()); |
| 1310 UPDATE_CONFIG(ns_experiment, transient_suppressor_enabled_); |
| 1311 UPDATE_CONFIG(ns_level, static_cast<int>(noise_suppression_->level())); |
| 1312 |
| 1313 return changed; |
| 1314 } |
| 1315 |
| 1316 int AudioProcessingImpl::WriteConfigMessage() { |
| 1317 event_msg_->set_type(audioproc::Event::CONFIG); |
| 1318 event_msg_->mutable_config()->CopyFrom(*config_); |
| 1319 |
| 1320 int err = WriteMessageToDebugFile(); |
| 1321 if (err != kNoError) { |
| 1322 return err; |
| 1323 } |
| 1324 |
| 1325 return kNoError; |
| 1326 } |
| 1258 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP | 1327 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP |
| 1259 | 1328 |
| 1260 } // namespace webrtc | 1329 } // namespace webrtc |
| OLD | NEW |