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 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 | 235 |
236 noise_suppression_ = new NoiseSuppressionImpl(this, crit_); | 236 noise_suppression_ = new NoiseSuppressionImpl(this, crit_); |
237 component_list_.push_back(noise_suppression_); | 237 component_list_.push_back(noise_suppression_); |
238 | 238 |
239 voice_detection_ = new VoiceDetectionImpl(this, crit_); | 239 voice_detection_ = new VoiceDetectionImpl(this, crit_); |
240 component_list_.push_back(voice_detection_); | 240 component_list_.push_back(voice_detection_); |
241 | 241 |
242 gain_control_for_new_agc_.reset(new GainControlForNewAgc(gain_control_)); | 242 gain_control_for_new_agc_.reset(new GainControlForNewAgc(gain_control_)); |
243 | 243 |
244 SetExtraOptions(config); | 244 SetExtraOptions(config); |
245 | |
246 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP | |
247 UpdateCurrentConfig(); | |
248 #endif | |
249 } | 245 } |
250 | 246 |
251 AudioProcessingImpl::~AudioProcessingImpl() { | 247 AudioProcessingImpl::~AudioProcessingImpl() { |
252 { | 248 { |
253 CriticalSectionScoped crit_scoped(crit_); | 249 CriticalSectionScoped crit_scoped(crit_); |
254 // Depends on gain_control_ and gain_control_for_new_agc_. | 250 // Depends on gain_control_ and gain_control_for_new_agc_. |
255 agc_manager_.reset(); | 251 agc_manager_.reset(); |
256 // Depends on gain_control_. | 252 // Depends on gain_control_. |
257 gain_control_for_new_agc_.reset(); | 253 gain_control_for_new_agc_.reset(); |
258 while (!component_list_.empty()) { | 254 while (!component_list_.empty()) { |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 | 545 |
550 ProcessingConfig processing_config = api_format_; | 546 ProcessingConfig processing_config = api_format_; |
551 processing_config.input_stream() = input_config; | 547 processing_config.input_stream() = input_config; |
552 processing_config.output_stream() = output_config; | 548 processing_config.output_stream() = output_config; |
553 | 549 |
554 RETURN_ON_ERR(MaybeInitializeLocked(processing_config)); | 550 RETURN_ON_ERR(MaybeInitializeLocked(processing_config)); |
555 assert(processing_config.input_stream().num_frames() == | 551 assert(processing_config.input_stream().num_frames() == |
556 api_format_.input_stream().num_frames()); | 552 api_format_.input_stream().num_frames()); |
557 | 553 |
558 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP | 554 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP |
559 if (debug_file_->Open() && UpdateCurrentConfig()) { | 555 if (debug_file_->Open()) { |
560 RETURN_ON_ERR(WriteConfigMessage()); | 556 RETURN_ON_ERR(WriteConfigMessageIfChanged()); |
561 } | |
562 | 557 |
563 if (debug_file_->Open()) { | |
564 event_msg_->set_type(audioproc::Event::STREAM); | 558 event_msg_->set_type(audioproc::Event::STREAM); |
565 audioproc::Stream* msg = event_msg_->mutable_stream(); | 559 audioproc::Stream* msg = event_msg_->mutable_stream(); |
566 const size_t channel_size = | 560 const size_t channel_size = |
567 sizeof(float) * api_format_.input_stream().num_frames(); | 561 sizeof(float) * api_format_.input_stream().num_frames(); |
568 for (int i = 0; i < api_format_.input_stream().num_channels(); ++i) | 562 for (int i = 0; i < api_format_.input_stream().num_channels(); ++i) |
569 msg->add_input_channel(src[i], channel_size); | 563 msg->add_input_channel(src[i], channel_size); |
570 } | 564 } |
571 #endif | 565 #endif |
572 | 566 |
573 capture_audio_->CopyFrom(src, api_format_.input_stream()); | 567 capture_audio_->CopyFrom(src, api_format_.input_stream()); |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
939 if (debug_file_->CloseFile() == -1) { | 933 if (debug_file_->CloseFile() == -1) { |
940 return kFileError; | 934 return kFileError; |
941 } | 935 } |
942 } | 936 } |
943 | 937 |
944 if (debug_file_->OpenFile(filename, false) == -1) { | 938 if (debug_file_->OpenFile(filename, false) == -1) { |
945 debug_file_->CloseFile(); | 939 debug_file_->CloseFile(); |
946 return kFileError; | 940 return kFileError; |
947 } | 941 } |
948 | 942 |
949 UpdateCurrentConfig(); | 943 RETURN_ON_ERR(WriteConfigMessageIfChanged()); |
950 int err = WriteConfigMessage(); | 944 RETURN_ON_ERR(WriteInitMessage()); |
951 if (err != kNoError) { | |
952 return err; | |
953 } | |
954 | |
955 err = WriteInitMessage(); | |
956 if (err != kNoError) { | |
957 return err; | |
958 } | |
959 return kNoError; | 945 return kNoError; |
960 #else | 946 #else |
961 return kUnsupportedFunctionError; | 947 return kUnsupportedFunctionError; |
962 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP | 948 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP |
963 } | 949 } |
964 | 950 |
965 int AudioProcessingImpl::StartDebugRecording(FILE* handle) { | 951 int AudioProcessingImpl::StartDebugRecording(FILE* handle) { |
966 CriticalSectionScoped crit_scoped(crit_); | 952 CriticalSectionScoped crit_scoped(crit_); |
967 | 953 |
968 if (handle == NULL) { | 954 if (handle == NULL) { |
969 return kNullPointerError; | 955 return kNullPointerError; |
970 } | 956 } |
971 | 957 |
972 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP | 958 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP |
973 // Stop any ongoing recording. | 959 // Stop any ongoing recording. |
974 if (debug_file_->Open()) { | 960 if (debug_file_->Open()) { |
975 if (debug_file_->CloseFile() == -1) { | 961 if (debug_file_->CloseFile() == -1) { |
976 return kFileError; | 962 return kFileError; |
977 } | 963 } |
978 } | 964 } |
979 | 965 |
980 if (debug_file_->OpenFromFileHandle(handle, true, false) == -1) { | 966 if (debug_file_->OpenFromFileHandle(handle, true, false) == -1) { |
981 return kFileError; | 967 return kFileError; |
982 } | 968 } |
983 | 969 |
984 UpdateCurrentConfig(); | 970 RETURN_ON_ERR(WriteConfigMessageIfChanged()); |
985 int err = WriteConfigMessage(); | 971 RETURN_ON_ERR(WriteInitMessage()); |
986 if (err != kNoError) { | |
987 return err; | |
988 } | |
989 | |
990 err = WriteInitMessage(); | |
991 if (err != kNoError) { | |
992 return err; | |
993 } | |
994 return kNoError; | 972 return kNoError; |
995 #else | 973 #else |
996 return kUnsupportedFunctionError; | 974 return kUnsupportedFunctionError; |
997 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP | 975 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP |
998 } | 976 } |
999 | 977 |
1000 int AudioProcessingImpl::StartDebugRecordingForPlatformFile( | 978 int AudioProcessingImpl::StartDebugRecordingForPlatformFile( |
1001 rtc::PlatformFile handle) { | 979 rtc::PlatformFile handle) { |
1002 FILE* stream = rtc::FdopenPlatformFileForWriting(handle); | 980 FILE* stream = rtc::FdopenPlatformFileForWriting(handle); |
1003 return StartDebugRecording(stream); | 981 return StartDebugRecording(stream); |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1261 // TODO(ekmeyerson): Add reverse output fields to event_msg_. | 1239 // TODO(ekmeyerson): Add reverse output fields to event_msg_. |
1262 | 1240 |
1263 int err = WriteMessageToDebugFile(); | 1241 int err = WriteMessageToDebugFile(); |
1264 if (err != kNoError) { | 1242 if (err != kNoError) { |
1265 return err; | 1243 return err; |
1266 } | 1244 } |
1267 | 1245 |
1268 return kNoError; | 1246 return kNoError; |
1269 } | 1247 } |
1270 | 1248 |
1271 bool AudioProcessingImpl::UpdateCurrentConfig() { | 1249 int AudioProcessingImpl::WriteConfigMessageIfChanged() { |
1272 bool changed = false; | 1250 audioproc::Config config; |
| 1251 config.set_aec_enabled(echo_cancellation_->is_enabled()); |
| 1252 config.set_aec_delay_agnostic( |
| 1253 echo_cancellation_->is_delay_agnostic_enabled()); |
| 1254 config.set_agc_enabled(gain_control_->is_enabled()); |
| 1255 // More fields... |
1273 | 1256 |
1274 // Acoustic echo canceler. | 1257 std::string serialized_config = config.SerializeAsString(); |
1275 { | 1258 if (serialized_config != last_serialized_config_) { |
1276 const bool value = echo_cancellation_->is_enabled(); | 1259 last_serialized_config_ = serialized_config; |
1277 if (!config_->has_aec_enabled() || value != config_->aec_enabled()) { | |
1278 config_->set_aec_enabled(value); | |
1279 changed = true; | |
1280 } | |
1281 } | |
1282 { | |
1283 const bool value = echo_cancellation_->is_delay_agnostic_enabled(); | |
1284 if (!config_->has_aec_delay_agnostic() || | |
1285 value != config_->aec_delay_agnostic()) { | |
1286 config_->set_aec_delay_agnostic(value); | |
1287 changed = true; | |
1288 } | |
1289 } | |
1290 { | |
1291 const bool value = echo_cancellation_->is_drift_compensation_enabled(); | |
1292 if (!config_->has_aec_drift_compensation() || | |
1293 value != config_->aec_drift_compensation()) { | |
1294 config_->set_aec_drift_compensation(value); | |
1295 changed = true; | |
1296 } | |
1297 } | |
1298 { | |
1299 const bool value = echo_cancellation_->is_extended_filter_enabled(); | |
1300 if (!config_->has_aec_extended_filter() || | |
1301 value != config_->aec_extended_filter()) { | |
1302 config_->set_aec_extended_filter(value); | |
1303 changed = true; | |
1304 } | |
1305 } | |
1306 { | |
1307 const int value = static_cast<int>(echo_cancellation_->suppression_level()); | |
1308 if (!config_->has_aec_suppression_level() || | |
1309 value != config_->aec_suppression_level()) { | |
1310 config_->set_aec_suppression_level(value); | |
1311 changed = true; | |
1312 } | |
1313 } | |
1314 | 1260 |
1315 // Mobile AEC. | 1261 event_msg_->set_type(audioproc::Event::CONFIG); |
1316 { | 1262 event_msg_->mutable_config()->CopyFrom(config); |
1317 const bool value = echo_control_mobile_->is_enabled(); | |
1318 if (!config_->has_aecm_enabled() || value != config_->aecm_enabled()) { | |
1319 config_->set_aecm_enabled(value); | |
1320 changed = true; | |
1321 } | |
1322 } | |
1323 { | |
1324 const bool value = echo_control_mobile_->is_comfort_noise_enabled(); | |
1325 if (!config_->has_aecm_comfort_noise() || | |
1326 value != config_->aecm_comfort_noise()) { | |
1327 config_->set_aecm_comfort_noise(value); | |
1328 changed = true; | |
1329 } | |
1330 } | |
1331 { | |
1332 const int value = static_cast<int>(echo_control_mobile_->routing_mode()); | |
1333 if (!config_->has_aecm_routing_mode() || | |
1334 value != config_->aecm_routing_mode()) { | |
1335 config_->set_aecm_routing_mode(value); | |
1336 changed = true; | |
1337 } | |
1338 } | |
1339 | 1263 |
1340 // Automatic gain controller. | 1264 RETURN_ON_ERR(WriteMessageToDebugFile()); |
1341 { | |
1342 const bool value = gain_control_->is_enabled(); | |
1343 if (!config_->has_agc_enabled() || value != config_->agc_enabled()) { | |
1344 config_->set_agc_enabled(value); | |
1345 changed = true; | |
1346 } | |
1347 } | |
1348 { | |
1349 const bool value = use_new_agc_; | |
1350 if (!config_->has_agc_experiment() || value != config_->agc_experiment()) { | |
1351 config_->set_agc_experiment(value); | |
1352 changed = true; | |
1353 } | |
1354 } | |
1355 { | |
1356 const int value = static_cast<int>(gain_control_->mode()); | |
1357 if (!config_->has_agc_mode() || value != config_->agc_mode()) { | |
1358 config_->set_agc_mode(value); | |
1359 changed = true; | |
1360 } | |
1361 } | |
1362 { | |
1363 const bool value = gain_control_->is_limiter_enabled(); | |
1364 if (!config_->has_agc_limiter() || value != config_->agc_limiter()) { | |
1365 config_->set_agc_limiter(value); | |
1366 changed = true; | |
1367 } | |
1368 } | |
1369 | |
1370 // High pass filter. | |
1371 { | |
1372 const bool value = high_pass_filter_->is_enabled(); | |
1373 if (!config_->has_hpf_enabled() || value != config_->hpf_enabled()) { | |
1374 config_->set_hpf_enabled(value); | |
1375 changed = true; | |
1376 } | |
1377 } | |
1378 | |
1379 // Noise suppression. | |
1380 { | |
1381 const bool value = noise_suppression_->is_enabled(); | |
1382 if (!config_->has_ns_enabled() || value != config_->ns_enabled()) { | |
1383 config_->set_ns_enabled(value); | |
1384 changed = true; | |
1385 } | |
1386 } | |
1387 { | |
1388 const bool value = transient_suppressor_enabled_; | |
1389 if (!config_->has_ns_experiment() || value != config_->ns_experiment()) { | |
1390 config_->set_ns_experiment(value); | |
1391 changed = true; | |
1392 } | |
1393 } | |
1394 { | |
1395 const int value = static_cast<int>(noise_suppression_->level()); | |
1396 if (!config_->has_ns_level() || value != config_->ns_level()) { | |
1397 config_->set_ns_level(value); | |
1398 changed = true; | |
1399 } | |
1400 } | |
1401 | |
1402 return changed; | |
1403 } | |
1404 | |
1405 int AudioProcessingImpl::WriteConfigMessage() { | |
1406 event_msg_->set_type(audioproc::Event::CONFIG); | |
1407 event_msg_->mutable_config()->CopyFrom(*config_); | |
1408 | |
1409 int err = WriteMessageToDebugFile(); | |
1410 if (err != kNoError) { | |
1411 return err; | |
1412 } | 1265 } |
1413 | 1266 |
1414 return kNoError; | 1267 return kNoError; |
1415 } | 1268 } |
1416 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP | 1269 #endif // WEBRTC_AUDIOPROC_DEBUG_DUMP |
1417 | 1270 |
1418 } // namespace webrtc | 1271 } // namespace webrtc |
OLD | NEW |