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 |