Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Side by Side Diff: webrtc/modules/audio_processing/audio_processing_impl.cc

Issue 1348903004: Adding APM configuration in AEC dump. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: removing an unnecessary test Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698