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

Side by Side Diff: webrtc/modules/audio_processing/test/audio_processing_unittest.cc

Issue 1534193008: Misc. small cleanups (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Unnecessary parens Created 4 years, 11 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
11 #include <math.h> 11 #include <math.h>
12 #include <stdio.h> 12 #include <stdio.h>
13 #include <algorithm> 13 #include <algorithm>
14 #include <limits> 14 #include <limits>
15 #include <queue> 15 #include <queue>
16 16
17 #include "webrtc/base/arraysize.h"
17 #include "webrtc/base/scoped_ptr.h" 18 #include "webrtc/base/scoped_ptr.h"
18 #include "webrtc/common_audio/include/audio_util.h" 19 #include "webrtc/common_audio/include/audio_util.h"
19 #include "webrtc/common_audio/resampler/include/push_resampler.h" 20 #include "webrtc/common_audio/resampler/include/push_resampler.h"
20 #include "webrtc/common_audio/resampler/push_sinc_resampler.h" 21 #include "webrtc/common_audio/resampler/push_sinc_resampler.h"
21 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h" 22 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h"
22 #include "webrtc/modules/audio_processing/beamformer/mock_nonlinear_beamformer.h " 23 #include "webrtc/modules/audio_processing/beamformer/mock_nonlinear_beamformer.h "
23 #include "webrtc/modules/audio_processing/common.h" 24 #include "webrtc/modules/audio_processing/common.h"
24 #include "webrtc/modules/audio_processing/include/audio_processing.h" 25 #include "webrtc/modules/audio_processing/include/audio_processing.h"
25 #include "webrtc/modules/audio_processing/test/protobuf_utils.h" 26 #include "webrtc/modules/audio_processing/test/protobuf_utils.h"
26 #include "webrtc/modules/audio_processing/test/test_utils.h" 27 #include "webrtc/modules/audio_processing/test/test_utils.h"
(...skipping 15 matching lines...) Expand all
42 // TODO(ekmeyerson): Switch to using StreamConfig and ProcessingConfig where 43 // TODO(ekmeyerson): Switch to using StreamConfig and ProcessingConfig where
43 // applicable. 44 // applicable.
44 45
45 // TODO(bjornv): This is not feasible until the functionality has been 46 // TODO(bjornv): This is not feasible until the functionality has been
46 // re-implemented; see comment at the bottom of this file. For now, the user has 47 // re-implemented; see comment at the bottom of this file. For now, the user has
47 // to hard code the |write_ref_data| value. 48 // to hard code the |write_ref_data| value.
48 // When false, this will compare the output data with the results stored to 49 // When false, this will compare the output data with the results stored to
49 // file. This is the typical case. When the file should be updated, it can 50 // file. This is the typical case. When the file should be updated, it can
50 // be set to true with the command-line switch --write_ref_data. 51 // be set to true with the command-line switch --write_ref_data.
51 bool write_ref_data = false; 52 bool write_ref_data = false;
52 const int kChannels[] = {1, 2}; 53 const google::protobuf::int32 kChannels[] = {1, 2};
53 const size_t kChannelsSize = sizeof(kChannels) / sizeof(*kChannels);
54
55 const int kSampleRates[] = {8000, 16000, 32000, 48000}; 54 const int kSampleRates[] = {8000, 16000, 32000, 48000};
56 const size_t kSampleRatesSize = sizeof(kSampleRates) / sizeof(*kSampleRates);
57 55
58 #if defined(WEBRTC_AUDIOPROC_FIXED_PROFILE) 56 #if defined(WEBRTC_AUDIOPROC_FIXED_PROFILE)
59 // AECM doesn't support super-wb. 57 // AECM doesn't support super-wb.
60 const int kProcessSampleRates[] = {8000, 16000}; 58 const int kProcessSampleRates[] = {8000, 16000};
61 #elif defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE) 59 #elif defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
62 const int kProcessSampleRates[] = {8000, 16000, 32000, 48000}; 60 const int kProcessSampleRates[] = {8000, 16000, 32000, 48000};
63 #endif 61 #endif
64 const size_t kProcessSampleRatesSize = sizeof(kProcessSampleRates) /
65 sizeof(*kProcessSampleRates);
66 62
67 enum StreamDirection { kForward = 0, kReverse }; 63 enum StreamDirection { kForward = 0, kReverse };
68 64
69 void ConvertToFloat(const int16_t* int_data, ChannelBuffer<float>* cb) { 65 void ConvertToFloat(const int16_t* int_data, ChannelBuffer<float>* cb) {
70 ChannelBuffer<int16_t> cb_int(cb->num_frames(), 66 ChannelBuffer<int16_t> cb_int(cb->num_frames(),
71 cb->num_channels()); 67 cb->num_channels());
72 Deinterleave(int_data, 68 Deinterleave(int_data,
73 cb->num_frames(), 69 cb->num_frames(),
74 cb->num_channels(), 70 cb->num_channels(),
75 cb_int.channels()); 71 cb_int.channels());
(...skipping 13 matching lines...) Expand all
89 switch (layout) { 85 switch (layout) {
90 case AudioProcessing::kMono: 86 case AudioProcessing::kMono:
91 return 1; 87 return 1;
92 case AudioProcessing::kMonoAndKeyboard: 88 case AudioProcessing::kMonoAndKeyboard:
93 case AudioProcessing::kStereo: 89 case AudioProcessing::kStereo:
94 return 2; 90 return 2;
95 case AudioProcessing::kStereoAndKeyboard: 91 case AudioProcessing::kStereoAndKeyboard:
96 return 3; 92 return 3;
97 } 93 }
98 assert(false); 94 assert(false);
99 return -1; 95 return 0;
100 } 96 }
101 97
102 int TruncateToMultipleOf10(int value) { 98 int TruncateToMultipleOf10(int value) {
103 return (value / 10) * 10; 99 return (value / 10) * 10;
104 } 100 }
105 101
106 void MixStereoToMono(const float* stereo, float* mono, 102 void MixStereoToMono(const float* stereo, float* mono,
107 int samples_per_channel) { 103 size_t samples_per_channel) {
108 for (int i = 0; i < samples_per_channel; ++i) 104 for (size_t i = 0; i < samples_per_channel; ++i)
109 mono[i] = (stereo[i * 2] + stereo[i * 2 + 1]) / 2; 105 mono[i] = (stereo[i * 2] + stereo[i * 2 + 1]) / 2;
110 } 106 }
111 107
112 void MixStereoToMono(const int16_t* stereo, int16_t* mono, 108 void MixStereoToMono(const int16_t* stereo, int16_t* mono,
113 int samples_per_channel) { 109 size_t samples_per_channel) {
114 for (int i = 0; i < samples_per_channel; ++i) 110 for (size_t i = 0; i < samples_per_channel; ++i)
115 mono[i] = (stereo[i * 2] + stereo[i * 2 + 1]) >> 1; 111 mono[i] = (stereo[i * 2] + stereo[i * 2 + 1]) >> 1;
116 } 112 }
117 113
118 void CopyLeftToRightChannel(int16_t* stereo, int samples_per_channel) { 114 void CopyLeftToRightChannel(int16_t* stereo, size_t samples_per_channel) {
119 for (int i = 0; i < samples_per_channel; i++) { 115 for (size_t i = 0; i < samples_per_channel; i++) {
120 stereo[i * 2 + 1] = stereo[i * 2]; 116 stereo[i * 2 + 1] = stereo[i * 2];
121 } 117 }
122 } 118 }
123 119
124 void VerifyChannelsAreEqual(int16_t* stereo, int samples_per_channel) { 120 void VerifyChannelsAreEqual(int16_t* stereo, size_t samples_per_channel) {
125 for (int i = 0; i < samples_per_channel; i++) { 121 for (size_t i = 0; i < samples_per_channel; i++) {
126 EXPECT_EQ(stereo[i * 2 + 1], stereo[i * 2]); 122 EXPECT_EQ(stereo[i * 2 + 1], stereo[i * 2]);
127 } 123 }
128 } 124 }
129 125
130 void SetFrameTo(AudioFrame* frame, int16_t value) { 126 void SetFrameTo(AudioFrame* frame, int16_t value) {
131 for (size_t i = 0; i < frame->samples_per_channel_ * frame->num_channels_; 127 for (size_t i = 0; i < frame->samples_per_channel_ * frame->num_channels_;
132 ++i) { 128 ++i) {
133 frame->data_[i] = value; 129 frame->data_[i] = value;
134 } 130 }
135 } 131 }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 EXPECT_NOERR(ap->voice_detection()->Enable(true)); 184 EXPECT_NOERR(ap->voice_detection()->Enable(true));
189 } 185 }
190 186
191 // These functions are only used by ApmTest.Process. 187 // These functions are only used by ApmTest.Process.
192 template <class T> 188 template <class T>
193 T AbsValue(T a) { 189 T AbsValue(T a) {
194 return a > 0 ? a: -a; 190 return a > 0 ? a: -a;
195 } 191 }
196 192
197 int16_t MaxAudioFrame(const AudioFrame& frame) { 193 int16_t MaxAudioFrame(const AudioFrame& frame) {
198 const int length = frame.samples_per_channel_ * frame.num_channels_; 194 const size_t length = frame.samples_per_channel_ * frame.num_channels_;
199 int16_t max_data = AbsValue(frame.data_[0]); 195 int16_t max_data = AbsValue(frame.data_[0]);
200 for (int i = 1; i < length; i++) { 196 for (size_t i = 1; i < length; i++) {
201 max_data = std::max(max_data, AbsValue(frame.data_[i])); 197 max_data = std::max(max_data, AbsValue(frame.data_[i]));
202 } 198 }
203 199
204 return max_data; 200 return max_data;
205 } 201 }
206 202
207 #if defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE) 203 #if defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
208 void TestStats(const AudioProcessing::Statistic& test, 204 void TestStats(const AudioProcessing::Statistic& test,
209 const audioproc::Test::Statistic& reference) { 205 const audioproc::Test::Statistic& reference) {
210 EXPECT_EQ(reference.instant(), test.instant); 206 EXPECT_EQ(reference.instant(), test.instant);
(...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after
891 } 887 }
892 } 888 }
893 } 889 }
894 890
895 TEST_F(ApmTest, SampleRatesInt) { 891 TEST_F(ApmTest, SampleRatesInt) {
896 // Testing invalid sample rates 892 // Testing invalid sample rates
897 SetContainerFormat(10000, 2, frame_, &float_cb_); 893 SetContainerFormat(10000, 2, frame_, &float_cb_);
898 EXPECT_EQ(apm_->kBadSampleRateError, ProcessStreamChooser(kIntFormat)); 894 EXPECT_EQ(apm_->kBadSampleRateError, ProcessStreamChooser(kIntFormat));
899 // Testing valid sample rates 895 // Testing valid sample rates
900 int fs[] = {8000, 16000, 32000, 48000}; 896 int fs[] = {8000, 16000, 32000, 48000};
901 for (size_t i = 0; i < sizeof(fs) / sizeof(*fs); i++) { 897 for (size_t i = 0; i < arraysize(fs); i++) {
902 SetContainerFormat(fs[i], 2, frame_, &float_cb_); 898 SetContainerFormat(fs[i], 2, frame_, &float_cb_);
903 EXPECT_NOERR(ProcessStreamChooser(kIntFormat)); 899 EXPECT_NOERR(ProcessStreamChooser(kIntFormat));
904 } 900 }
905 } 901 }
906 902
907 TEST_F(ApmTest, EchoCancellation) { 903 TEST_F(ApmTest, EchoCancellation) {
908 EXPECT_EQ(apm_->kNoError, 904 EXPECT_EQ(apm_->kNoError,
909 apm_->echo_cancellation()->enable_drift_compensation(true)); 905 apm_->echo_cancellation()->enable_drift_compensation(true));
910 EXPECT_TRUE(apm_->echo_cancellation()->is_drift_compensation_enabled()); 906 EXPECT_TRUE(apm_->echo_cancellation()->is_drift_compensation_enabled());
911 EXPECT_EQ(apm_->kNoError, 907 EXPECT_EQ(apm_->kNoError,
912 apm_->echo_cancellation()->enable_drift_compensation(false)); 908 apm_->echo_cancellation()->enable_drift_compensation(false));
913 EXPECT_FALSE(apm_->echo_cancellation()->is_drift_compensation_enabled()); 909 EXPECT_FALSE(apm_->echo_cancellation()->is_drift_compensation_enabled());
914 910
915 EchoCancellation::SuppressionLevel level[] = { 911 EchoCancellation::SuppressionLevel level[] = {
916 EchoCancellation::kLowSuppression, 912 EchoCancellation::kLowSuppression,
917 EchoCancellation::kModerateSuppression, 913 EchoCancellation::kModerateSuppression,
918 EchoCancellation::kHighSuppression, 914 EchoCancellation::kHighSuppression,
919 }; 915 };
920 for (size_t i = 0; i < sizeof(level)/sizeof(*level); i++) { 916 for (size_t i = 0; i < arraysize(level); i++) {
921 EXPECT_EQ(apm_->kNoError, 917 EXPECT_EQ(apm_->kNoError,
922 apm_->echo_cancellation()->set_suppression_level(level[i])); 918 apm_->echo_cancellation()->set_suppression_level(level[i]));
923 EXPECT_EQ(level[i], 919 EXPECT_EQ(level[i],
924 apm_->echo_cancellation()->suppression_level()); 920 apm_->echo_cancellation()->suppression_level());
925 } 921 }
926 922
927 EchoCancellation::Metrics metrics; 923 EchoCancellation::Metrics metrics;
928 EXPECT_EQ(apm_->kNotEnabledError, 924 EXPECT_EQ(apm_->kNotEnabledError,
929 apm_->echo_cancellation()->GetMetrics(&metrics)); 925 apm_->echo_cancellation()->GetMetrics(&metrics));
930 926
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
987 // buffer is 66 ms in 8 kHz. 983 // buffer is 66 ms in 8 kHz.
988 // 984 //
989 // It is known that for 16 kHz (and 32 kHz) sampling frequency there is an 985 // It is known that for 16 kHz (and 32 kHz) sampling frequency there is an
990 // additional stuffing of 8 ms on the fly, but it seems to have no impact on 986 // additional stuffing of 8 ms on the fly, but it seems to have no impact on
991 // delay estimation. This should be noted though. In case of test failure, 987 // delay estimation. This should be noted though. In case of test failure,
992 // this could be the cause. 988 // this could be the cause.
993 const int kSystemDelayMs = 66; 989 const int kSystemDelayMs = 66;
994 // Test a couple of corner cases and verify that the estimated delay is 990 // Test a couple of corner cases and verify that the estimated delay is
995 // within a valid region (set to +-1.5 blocks). Note that these cases are 991 // within a valid region (set to +-1.5 blocks). Note that these cases are
996 // sampling frequency dependent. 992 // sampling frequency dependent.
997 for (size_t i = 0; i < kProcessSampleRatesSize; i++) { 993 for (size_t i = 0; i < arraysize(kProcessSampleRates); i++) {
998 Init(kProcessSampleRates[i], 994 Init(kProcessSampleRates[i],
999 kProcessSampleRates[i], 995 kProcessSampleRates[i],
1000 kProcessSampleRates[i], 996 kProcessSampleRates[i],
1001 2, 997 2,
1002 2, 998 2,
1003 2, 999 2,
1004 false); 1000 false);
1005 // Sampling frequency dependent variables. 1001 // Sampling frequency dependent variables.
1006 const int num_ms_per_block = 1002 const int num_ms_per_block =
1007 std::max(4, static_cast<int>(640 / frame_->samples_per_channel_)); 1003 std::max(4, static_cast<int>(640 / frame_->samples_per_channel_));
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1059 EXPECT_TRUE(apm_->echo_control_mobile()->is_enabled()); 1055 EXPECT_TRUE(apm_->echo_control_mobile()->is_enabled());
1060 1056
1061 // Toggle routing modes 1057 // Toggle routing modes
1062 EchoControlMobile::RoutingMode mode[] = { 1058 EchoControlMobile::RoutingMode mode[] = {
1063 EchoControlMobile::kQuietEarpieceOrHeadset, 1059 EchoControlMobile::kQuietEarpieceOrHeadset,
1064 EchoControlMobile::kEarpiece, 1060 EchoControlMobile::kEarpiece,
1065 EchoControlMobile::kLoudEarpiece, 1061 EchoControlMobile::kLoudEarpiece,
1066 EchoControlMobile::kSpeakerphone, 1062 EchoControlMobile::kSpeakerphone,
1067 EchoControlMobile::kLoudSpeakerphone, 1063 EchoControlMobile::kLoudSpeakerphone,
1068 }; 1064 };
1069 for (size_t i = 0; i < sizeof(mode)/sizeof(*mode); i++) { 1065 for (size_t i = 0; i < arraysize(mode); i++) {
1070 EXPECT_EQ(apm_->kNoError, 1066 EXPECT_EQ(apm_->kNoError,
1071 apm_->echo_control_mobile()->set_routing_mode(mode[i])); 1067 apm_->echo_control_mobile()->set_routing_mode(mode[i]));
1072 EXPECT_EQ(mode[i], 1068 EXPECT_EQ(mode[i],
1073 apm_->echo_control_mobile()->routing_mode()); 1069 apm_->echo_control_mobile()->routing_mode());
1074 } 1070 }
1075 // Turn comfort noise off/on 1071 // Turn comfort noise off/on
1076 EXPECT_EQ(apm_->kNoError, 1072 EXPECT_EQ(apm_->kNoError,
1077 apm_->echo_control_mobile()->enable_comfort_noise(false)); 1073 apm_->echo_control_mobile()->enable_comfort_noise(false));
1078 EXPECT_FALSE(apm_->echo_control_mobile()->is_comfort_noise_enabled()); 1074 EXPECT_FALSE(apm_->echo_control_mobile()->is_comfort_noise_enabled());
1079 EXPECT_EQ(apm_->kNoError, 1075 EXPECT_EQ(apm_->kNoError,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 // Testing gain modes 1120 // Testing gain modes
1125 EXPECT_EQ(apm_->kNoError, 1121 EXPECT_EQ(apm_->kNoError,
1126 apm_->gain_control()->set_mode( 1122 apm_->gain_control()->set_mode(
1127 apm_->gain_control()->mode())); 1123 apm_->gain_control()->mode()));
1128 1124
1129 GainControl::Mode mode[] = { 1125 GainControl::Mode mode[] = {
1130 GainControl::kAdaptiveAnalog, 1126 GainControl::kAdaptiveAnalog,
1131 GainControl::kAdaptiveDigital, 1127 GainControl::kAdaptiveDigital,
1132 GainControl::kFixedDigital 1128 GainControl::kFixedDigital
1133 }; 1129 };
1134 for (size_t i = 0; i < sizeof(mode)/sizeof(*mode); i++) { 1130 for (size_t i = 0; i < arraysize(mode); i++) {
1135 EXPECT_EQ(apm_->kNoError, 1131 EXPECT_EQ(apm_->kNoError,
1136 apm_->gain_control()->set_mode(mode[i])); 1132 apm_->gain_control()->set_mode(mode[i]));
1137 EXPECT_EQ(mode[i], apm_->gain_control()->mode()); 1133 EXPECT_EQ(mode[i], apm_->gain_control()->mode());
1138 } 1134 }
1139 // Testing invalid target levels 1135 // Testing invalid target levels
1140 EXPECT_EQ(apm_->kBadParameterError, 1136 EXPECT_EQ(apm_->kBadParameterError,
1141 apm_->gain_control()->set_target_level_dbfs(-3)); 1137 apm_->gain_control()->set_target_level_dbfs(-3));
1142 EXPECT_EQ(apm_->kBadParameterError, 1138 EXPECT_EQ(apm_->kBadParameterError,
1143 apm_->gain_control()->set_target_level_dbfs(-40)); 1139 apm_->gain_control()->set_target_level_dbfs(-40));
1144 // Testing valid target levels 1140 // Testing valid target levels
1145 EXPECT_EQ(apm_->kNoError, 1141 EXPECT_EQ(apm_->kNoError,
1146 apm_->gain_control()->set_target_level_dbfs( 1142 apm_->gain_control()->set_target_level_dbfs(
1147 apm_->gain_control()->target_level_dbfs())); 1143 apm_->gain_control()->target_level_dbfs()));
1148 1144
1149 int level_dbfs[] = {0, 6, 31}; 1145 int level_dbfs[] = {0, 6, 31};
1150 for (size_t i = 0; i < sizeof(level_dbfs)/sizeof(*level_dbfs); i++) { 1146 for (size_t i = 0; i < arraysize(level_dbfs); i++) {
1151 EXPECT_EQ(apm_->kNoError, 1147 EXPECT_EQ(apm_->kNoError,
1152 apm_->gain_control()->set_target_level_dbfs(level_dbfs[i])); 1148 apm_->gain_control()->set_target_level_dbfs(level_dbfs[i]));
1153 EXPECT_EQ(level_dbfs[i], apm_->gain_control()->target_level_dbfs()); 1149 EXPECT_EQ(level_dbfs[i], apm_->gain_control()->target_level_dbfs());
1154 } 1150 }
1155 1151
1156 // Testing invalid compression gains 1152 // Testing invalid compression gains
1157 EXPECT_EQ(apm_->kBadParameterError, 1153 EXPECT_EQ(apm_->kBadParameterError,
1158 apm_->gain_control()->set_compression_gain_db(-1)); 1154 apm_->gain_control()->set_compression_gain_db(-1));
1159 EXPECT_EQ(apm_->kBadParameterError, 1155 EXPECT_EQ(apm_->kBadParameterError,
1160 apm_->gain_control()->set_compression_gain_db(100)); 1156 apm_->gain_control()->set_compression_gain_db(100));
1161 1157
1162 // Testing valid compression gains 1158 // Testing valid compression gains
1163 EXPECT_EQ(apm_->kNoError, 1159 EXPECT_EQ(apm_->kNoError,
1164 apm_->gain_control()->set_compression_gain_db( 1160 apm_->gain_control()->set_compression_gain_db(
1165 apm_->gain_control()->compression_gain_db())); 1161 apm_->gain_control()->compression_gain_db()));
1166 1162
1167 int gain_db[] = {0, 10, 90}; 1163 int gain_db[] = {0, 10, 90};
1168 for (size_t i = 0; i < sizeof(gain_db)/sizeof(*gain_db); i++) { 1164 for (size_t i = 0; i < arraysize(gain_db); i++) {
1169 EXPECT_EQ(apm_->kNoError, 1165 EXPECT_EQ(apm_->kNoError,
1170 apm_->gain_control()->set_compression_gain_db(gain_db[i])); 1166 apm_->gain_control()->set_compression_gain_db(gain_db[i]));
1171 EXPECT_EQ(gain_db[i], apm_->gain_control()->compression_gain_db()); 1167 EXPECT_EQ(gain_db[i], apm_->gain_control()->compression_gain_db());
1172 } 1168 }
1173 1169
1174 // Testing limiter off/on 1170 // Testing limiter off/on
1175 EXPECT_EQ(apm_->kNoError, apm_->gain_control()->enable_limiter(false)); 1171 EXPECT_EQ(apm_->kNoError, apm_->gain_control()->enable_limiter(false));
1176 EXPECT_FALSE(apm_->gain_control()->is_limiter_enabled()); 1172 EXPECT_FALSE(apm_->gain_control()->is_limiter_enabled());
1177 EXPECT_EQ(apm_->kNoError, apm_->gain_control()->enable_limiter(true)); 1173 EXPECT_EQ(apm_->kNoError, apm_->gain_control()->enable_limiter(true));
1178 EXPECT_TRUE(apm_->gain_control()->is_limiter_enabled()); 1174 EXPECT_TRUE(apm_->gain_control()->is_limiter_enabled());
(...skipping 10 matching lines...) Expand all
1189 EXPECT_EQ(apm_->kBadParameterError, 1185 EXPECT_EQ(apm_->kBadParameterError,
1190 apm_->gain_control()->set_analog_level_limits(512, 255)); 1186 apm_->gain_control()->set_analog_level_limits(512, 255));
1191 1187
1192 // Testing valid level limits 1188 // Testing valid level limits
1193 EXPECT_EQ(apm_->kNoError, 1189 EXPECT_EQ(apm_->kNoError,
1194 apm_->gain_control()->set_analog_level_limits( 1190 apm_->gain_control()->set_analog_level_limits(
1195 apm_->gain_control()->analog_level_minimum(), 1191 apm_->gain_control()->analog_level_minimum(),
1196 apm_->gain_control()->analog_level_maximum())); 1192 apm_->gain_control()->analog_level_maximum()));
1197 1193
1198 int min_level[] = {0, 255, 1024}; 1194 int min_level[] = {0, 255, 1024};
1199 for (size_t i = 0; i < sizeof(min_level)/sizeof(*min_level); i++) { 1195 for (size_t i = 0; i < arraysize(min_level); i++) {
1200 EXPECT_EQ(apm_->kNoError, 1196 EXPECT_EQ(apm_->kNoError,
1201 apm_->gain_control()->set_analog_level_limits(min_level[i], 1024)); 1197 apm_->gain_control()->set_analog_level_limits(min_level[i], 1024));
1202 EXPECT_EQ(min_level[i], apm_->gain_control()->analog_level_minimum()); 1198 EXPECT_EQ(min_level[i], apm_->gain_control()->analog_level_minimum());
1203 } 1199 }
1204 1200
1205 int max_level[] = {0, 1024, 65535}; 1201 int max_level[] = {0, 1024, 65535};
1206 for (size_t i = 0; i < sizeof(min_level)/sizeof(*min_level); i++) { 1202 for (size_t i = 0; i < arraysize(min_level); i++) {
1207 EXPECT_EQ(apm_->kNoError, 1203 EXPECT_EQ(apm_->kNoError,
1208 apm_->gain_control()->set_analog_level_limits(0, max_level[i])); 1204 apm_->gain_control()->set_analog_level_limits(0, max_level[i]));
1209 EXPECT_EQ(max_level[i], apm_->gain_control()->analog_level_maximum()); 1205 EXPECT_EQ(max_level[i], apm_->gain_control()->analog_level_maximum());
1210 } 1206 }
1211 1207
1212 // TODO(ajm): stream_is_saturated() and stream_analog_level() 1208 // TODO(ajm): stream_is_saturated() and stream_analog_level()
1213 1209
1214 // Turn AGC off 1210 // Turn AGC off
1215 EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false)); 1211 EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false));
1216 EXPECT_FALSE(apm_->gain_control()->is_enabled()); 1212 EXPECT_FALSE(apm_->gain_control()->is_enabled());
(...skipping 18 matching lines...) Expand all
1235 out_analog_level = apm_->gain_control()->stream_analog_level(); 1231 out_analog_level = apm_->gain_control()->stream_analog_level();
1236 } 1232 }
1237 1233
1238 // Ensure the AGC is still able to reach the maximum. 1234 // Ensure the AGC is still able to reach the maximum.
1239 EXPECT_EQ(255, out_analog_level); 1235 EXPECT_EQ(255, out_analog_level);
1240 } 1236 }
1241 1237
1242 // Verifies that despite volume slider quantization, the AGC can continue to 1238 // Verifies that despite volume slider quantization, the AGC can continue to
1243 // increase its volume. 1239 // increase its volume.
1244 TEST_F(ApmTest, QuantizedVolumeDoesNotGetStuck) { 1240 TEST_F(ApmTest, QuantizedVolumeDoesNotGetStuck) {
1245 for (size_t i = 0; i < kSampleRatesSize; ++i) { 1241 for (size_t i = 0; i < arraysize(kSampleRates); ++i) {
1246 RunQuantizedVolumeDoesNotGetStuckTest(kSampleRates[i]); 1242 RunQuantizedVolumeDoesNotGetStuckTest(kSampleRates[i]);
1247 } 1243 }
1248 } 1244 }
1249 1245
1250 void ApmTest::RunManualVolumeChangeIsPossibleTest(int sample_rate) { 1246 void ApmTest::RunManualVolumeChangeIsPossibleTest(int sample_rate) {
1251 Init(sample_rate, sample_rate, sample_rate, 2, 2, 2, false); 1247 Init(sample_rate, sample_rate, sample_rate, 2, 2, 2, false);
1252 EXPECT_EQ(apm_->kNoError, 1248 EXPECT_EQ(apm_->kNoError,
1253 apm_->gain_control()->set_mode(GainControl::kAdaptiveAnalog)); 1249 apm_->gain_control()->set_mode(GainControl::kAdaptiveAnalog));
1254 EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true)); 1250 EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
1255 1251
(...skipping 24 matching lines...) Expand all
1280 EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_)); 1276 EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
1281 out_analog_level = apm_->gain_control()->stream_analog_level(); 1277 out_analog_level = apm_->gain_control()->stream_analog_level();
1282 // Check that AGC respected the manually adjusted volume. 1278 // Check that AGC respected the manually adjusted volume.
1283 EXPECT_LT(out_analog_level, highest_level_reached); 1279 EXPECT_LT(out_analog_level, highest_level_reached);
1284 } 1280 }
1285 // Check that the volume was still raised. 1281 // Check that the volume was still raised.
1286 EXPECT_GT(out_analog_level, 100); 1282 EXPECT_GT(out_analog_level, 100);
1287 } 1283 }
1288 1284
1289 TEST_F(ApmTest, ManualVolumeChangeIsPossible) { 1285 TEST_F(ApmTest, ManualVolumeChangeIsPossible) {
1290 for (size_t i = 0; i < kSampleRatesSize; ++i) { 1286 for (size_t i = 0; i < arraysize(kSampleRates); ++i) {
1291 RunManualVolumeChangeIsPossibleTest(kSampleRates[i]); 1287 RunManualVolumeChangeIsPossibleTest(kSampleRates[i]);
1292 } 1288 }
1293 } 1289 }
1294 1290
1295 #if !defined(WEBRTC_ANDROID) && !defined(WEBRTC_IOS) 1291 #if !defined(WEBRTC_ANDROID) && !defined(WEBRTC_IOS)
1296 TEST_F(ApmTest, AgcOnlyAdaptsWhenTargetSignalIsPresent) { 1292 TEST_F(ApmTest, AgcOnlyAdaptsWhenTargetSignalIsPresent) {
1297 const int kSampleRateHz = 16000; 1293 const int kSampleRateHz = 16000;
1298 const int kSamplesPerChannel = 1294 const size_t kSamplesPerChannel =
1299 AudioProcessing::kChunkSizeMs * kSampleRateHz / 1000; 1295 static_cast<size_t>(AudioProcessing::kChunkSizeMs * kSampleRateHz / 1000);
1300 const int kNumInputChannels = 2; 1296 const int kNumInputChannels = 2;
1301 const int kNumOutputChannels = 1; 1297 const int kNumOutputChannels = 1;
1302 const int kNumChunks = 700; 1298 const size_t kNumChunks = 700;
1303 const float kScaleFactor = 0.25f; 1299 const float kScaleFactor = 0.25f;
1304 Config config; 1300 Config config;
1305 std::vector<webrtc::Point> geometry; 1301 std::vector<webrtc::Point> geometry;
1306 geometry.push_back(webrtc::Point(0.f, 0.f, 0.f)); 1302 geometry.push_back(webrtc::Point(0.f, 0.f, 0.f));
1307 geometry.push_back(webrtc::Point(0.05f, 0.f, 0.f)); 1303 geometry.push_back(webrtc::Point(0.05f, 0.f, 0.f));
1308 config.Set<Beamforming>(new Beamforming(true, geometry)); 1304 config.Set<Beamforming>(new Beamforming(true, geometry));
1309 testing::NiceMock<MockNonlinearBeamformer>* beamformer = 1305 testing::NiceMock<MockNonlinearBeamformer>* beamformer =
1310 new testing::NiceMock<MockNonlinearBeamformer>(geometry); 1306 new testing::NiceMock<MockNonlinearBeamformer>(geometry);
1311 rtc::scoped_ptr<AudioProcessing> apm( 1307 rtc::scoped_ptr<AudioProcessing> apm(
1312 AudioProcessing::Create(config, beamformer)); 1308 AudioProcessing::Create(config, beamformer));
1313 EXPECT_EQ(kNoErr, apm->gain_control()->Enable(true)); 1309 EXPECT_EQ(kNoErr, apm->gain_control()->Enable(true));
1314 ChannelBuffer<float> src_buf(kSamplesPerChannel, kNumInputChannels); 1310 ChannelBuffer<float> src_buf(kSamplesPerChannel, kNumInputChannels);
1315 ChannelBuffer<float> dest_buf(kSamplesPerChannel, kNumOutputChannels); 1311 ChannelBuffer<float> dest_buf(kSamplesPerChannel, kNumOutputChannels);
1316 const int max_length = kSamplesPerChannel * std::max(kNumInputChannels, 1312 const size_t max_length = kSamplesPerChannel * std::max(kNumInputChannels,
1317 kNumOutputChannels); 1313 kNumOutputChannels);
1318 rtc::scoped_ptr<int16_t[]> int_data(new int16_t[max_length]); 1314 rtc::scoped_ptr<int16_t[]> int_data(new int16_t[max_length]);
1319 rtc::scoped_ptr<float[]> float_data(new float[max_length]); 1315 rtc::scoped_ptr<float[]> float_data(new float[max_length]);
1320 std::string filename = ResourceFilePath("far", kSampleRateHz); 1316 std::string filename = ResourceFilePath("far", kSampleRateHz);
1321 FILE* far_file = fopen(filename.c_str(), "rb"); 1317 FILE* far_file = fopen(filename.c_str(), "rb");
1322 ASSERT_TRUE(far_file != NULL) << "Could not open file " << filename << "\n"; 1318 ASSERT_TRUE(far_file != NULL) << "Could not open file " << filename << "\n";
1323 const int kDefaultVolume = apm->gain_control()->stream_analog_level(); 1319 const int kDefaultVolume = apm->gain_control()->stream_analog_level();
1324 const int kDefaultCompressionGain = 1320 const int kDefaultCompressionGain =
1325 apm->gain_control()->compression_gain_db(); 1321 apm->gain_control()->compression_gain_db();
1326 bool is_target = false; 1322 bool is_target = false;
1327 EXPECT_CALL(*beamformer, is_target_present()) 1323 EXPECT_CALL(*beamformer, is_target_present())
1328 .WillRepeatedly(testing::ReturnPointee(&is_target)); 1324 .WillRepeatedly(testing::ReturnPointee(&is_target));
1329 for (int i = 0; i < kNumChunks; ++i) { 1325 for (size_t i = 0; i < kNumChunks; ++i) {
1330 ASSERT_TRUE(ReadChunk(far_file, 1326 ASSERT_TRUE(ReadChunk(far_file,
1331 int_data.get(), 1327 int_data.get(),
1332 float_data.get(), 1328 float_data.get(),
1333 &src_buf)); 1329 &src_buf));
1334 for (int j = 0; j < kNumInputChannels; ++j) { 1330 for (int j = 0; j < kNumInputChannels; ++j) {
1335 for (int k = 0; k < kSamplesPerChannel; ++k) { 1331 for (size_t k = 0; k < kSamplesPerChannel; ++k) {
1336 src_buf.channels()[j][k] *= kScaleFactor; 1332 src_buf.channels()[j][k] *= kScaleFactor;
1337 } 1333 }
1338 } 1334 }
1339 EXPECT_EQ(kNoErr, 1335 EXPECT_EQ(kNoErr,
1340 apm->ProcessStream(src_buf.channels(), 1336 apm->ProcessStream(src_buf.channels(),
1341 src_buf.num_frames(), 1337 src_buf.num_frames(),
1342 kSampleRateHz, 1338 kSampleRateHz,
1343 LayoutFromChannels(src_buf.num_channels()), 1339 LayoutFromChannels(src_buf.num_channels()),
1344 kSampleRateHz, 1340 kSampleRateHz,
1345 LayoutFromChannels(dest_buf.num_channels()), 1341 LayoutFromChannels(dest_buf.num_channels()),
1346 dest_buf.channels())); 1342 dest_buf.channels()));
1347 } 1343 }
1348 EXPECT_EQ(kDefaultVolume, 1344 EXPECT_EQ(kDefaultVolume,
1349 apm->gain_control()->stream_analog_level()); 1345 apm->gain_control()->stream_analog_level());
1350 EXPECT_EQ(kDefaultCompressionGain, 1346 EXPECT_EQ(kDefaultCompressionGain,
1351 apm->gain_control()->compression_gain_db()); 1347 apm->gain_control()->compression_gain_db());
1352 rewind(far_file); 1348 rewind(far_file);
1353 is_target = true; 1349 is_target = true;
1354 for (int i = 0; i < kNumChunks; ++i) { 1350 for (size_t i = 0; i < kNumChunks; ++i) {
1355 ASSERT_TRUE(ReadChunk(far_file, 1351 ASSERT_TRUE(ReadChunk(far_file,
1356 int_data.get(), 1352 int_data.get(),
1357 float_data.get(), 1353 float_data.get(),
1358 &src_buf)); 1354 &src_buf));
1359 for (int j = 0; j < kNumInputChannels; ++j) { 1355 for (int j = 0; j < kNumInputChannels; ++j) {
1360 for (int k = 0; k < kSamplesPerChannel; ++k) { 1356 for (size_t k = 0; k < kSamplesPerChannel; ++k) {
1361 src_buf.channels()[j][k] *= kScaleFactor; 1357 src_buf.channels()[j][k] *= kScaleFactor;
1362 } 1358 }
1363 } 1359 }
1364 EXPECT_EQ(kNoErr, 1360 EXPECT_EQ(kNoErr,
1365 apm->ProcessStream(src_buf.channels(), 1361 apm->ProcessStream(src_buf.channels(),
1366 src_buf.num_frames(), 1362 src_buf.num_frames(),
1367 kSampleRateHz, 1363 kSampleRateHz,
1368 LayoutFromChannels(src_buf.num_channels()), 1364 LayoutFromChannels(src_buf.num_channels()),
1369 kSampleRateHz, 1365 kSampleRateHz,
1370 LayoutFromChannels(dest_buf.num_channels()), 1366 LayoutFromChannels(dest_buf.num_channels()),
1371 dest_buf.channels())); 1367 dest_buf.channels()));
1372 } 1368 }
1373 EXPECT_LT(kDefaultVolume, 1369 EXPECT_LT(kDefaultVolume,
1374 apm->gain_control()->stream_analog_level()); 1370 apm->gain_control()->stream_analog_level());
1375 EXPECT_LT(kDefaultCompressionGain, 1371 EXPECT_LT(kDefaultCompressionGain,
1376 apm->gain_control()->compression_gain_db()); 1372 apm->gain_control()->compression_gain_db());
1377 ASSERT_EQ(0, fclose(far_file)); 1373 ASSERT_EQ(0, fclose(far_file));
1378 } 1374 }
1379 #endif 1375 #endif
1380 1376
1381 TEST_F(ApmTest, NoiseSuppression) { 1377 TEST_F(ApmTest, NoiseSuppression) {
1382 // Test valid suppression levels. 1378 // Test valid suppression levels.
1383 NoiseSuppression::Level level[] = { 1379 NoiseSuppression::Level level[] = {
1384 NoiseSuppression::kLow, 1380 NoiseSuppression::kLow,
1385 NoiseSuppression::kModerate, 1381 NoiseSuppression::kModerate,
1386 NoiseSuppression::kHigh, 1382 NoiseSuppression::kHigh,
1387 NoiseSuppression::kVeryHigh 1383 NoiseSuppression::kVeryHigh
1388 }; 1384 };
1389 for (size_t i = 0; i < sizeof(level)/sizeof(*level); i++) { 1385 for (size_t i = 0; i < arraysize(level); i++) {
1390 EXPECT_EQ(apm_->kNoError, 1386 EXPECT_EQ(apm_->kNoError,
1391 apm_->noise_suppression()->set_level(level[i])); 1387 apm_->noise_suppression()->set_level(level[i]));
1392 EXPECT_EQ(level[i], apm_->noise_suppression()->level()); 1388 EXPECT_EQ(level[i], apm_->noise_suppression()->level());
1393 } 1389 }
1394 1390
1395 // Turn NS on/off 1391 // Turn NS on/off
1396 EXPECT_EQ(apm_->kNoError, apm_->noise_suppression()->Enable(true)); 1392 EXPECT_EQ(apm_->kNoError, apm_->noise_suppression()->Enable(true));
1397 EXPECT_TRUE(apm_->noise_suppression()->is_enabled()); 1393 EXPECT_TRUE(apm_->noise_suppression()->is_enabled());
1398 EXPECT_EQ(apm_->kNoError, apm_->noise_suppression()->Enable(false)); 1394 EXPECT_EQ(apm_->kNoError, apm_->noise_suppression()->Enable(false));
1399 EXPECT_FALSE(apm_->noise_suppression()->is_enabled()); 1395 EXPECT_FALSE(apm_->noise_suppression()->is_enabled());
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1481 apm_->voice_detection()->set_stream_has_voice(false)); 1477 apm_->voice_detection()->set_stream_has_voice(false));
1482 EXPECT_FALSE(apm_->voice_detection()->stream_has_voice()); 1478 EXPECT_FALSE(apm_->voice_detection()->stream_has_voice());
1483 1479
1484 // Test valid likelihoods 1480 // Test valid likelihoods
1485 VoiceDetection::Likelihood likelihood[] = { 1481 VoiceDetection::Likelihood likelihood[] = {
1486 VoiceDetection::kVeryLowLikelihood, 1482 VoiceDetection::kVeryLowLikelihood,
1487 VoiceDetection::kLowLikelihood, 1483 VoiceDetection::kLowLikelihood,
1488 VoiceDetection::kModerateLikelihood, 1484 VoiceDetection::kModerateLikelihood,
1489 VoiceDetection::kHighLikelihood 1485 VoiceDetection::kHighLikelihood
1490 }; 1486 };
1491 for (size_t i = 0; i < sizeof(likelihood)/sizeof(*likelihood); i++) { 1487 for (size_t i = 0; i < arraysize(likelihood); i++) {
1492 EXPECT_EQ(apm_->kNoError, 1488 EXPECT_EQ(apm_->kNoError,
1493 apm_->voice_detection()->set_likelihood(likelihood[i])); 1489 apm_->voice_detection()->set_likelihood(likelihood[i]));
1494 EXPECT_EQ(likelihood[i], apm_->voice_detection()->likelihood()); 1490 EXPECT_EQ(likelihood[i], apm_->voice_detection()->likelihood());
1495 } 1491 }
1496 1492
1497 /* TODO(bjornv): Enable once VAD supports other frame lengths than 10 ms 1493 /* TODO(bjornv): Enable once VAD supports other frame lengths than 10 ms
1498 // Test invalid frame sizes 1494 // Test invalid frame sizes
1499 EXPECT_EQ(apm_->kBadParameterError, 1495 EXPECT_EQ(apm_->kBadParameterError,
1500 apm_->voice_detection()->set_frame_size_ms(12)); 1496 apm_->voice_detection()->set_frame_size_ms(12));
1501 1497
(...skipping 11 matching lines...) Expand all
1513 EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(false)); 1509 EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(false));
1514 EXPECT_FALSE(apm_->voice_detection()->is_enabled()); 1510 EXPECT_FALSE(apm_->voice_detection()->is_enabled());
1515 1511
1516 // Test that AudioFrame activity is maintained when VAD is disabled. 1512 // Test that AudioFrame activity is maintained when VAD is disabled.
1517 EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(false)); 1513 EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(false));
1518 AudioFrame::VADActivity activity[] = { 1514 AudioFrame::VADActivity activity[] = {
1519 AudioFrame::kVadActive, 1515 AudioFrame::kVadActive,
1520 AudioFrame::kVadPassive, 1516 AudioFrame::kVadPassive,
1521 AudioFrame::kVadUnknown 1517 AudioFrame::kVadUnknown
1522 }; 1518 };
1523 for (size_t i = 0; i < sizeof(activity)/sizeof(*activity); i++) { 1519 for (size_t i = 0; i < arraysize(activity); i++) {
1524 frame_->vad_activity_ = activity[i]; 1520 frame_->vad_activity_ = activity[i];
1525 EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_)); 1521 EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
1526 EXPECT_EQ(activity[i], frame_->vad_activity_); 1522 EXPECT_EQ(activity[i], frame_->vad_activity_);
1527 } 1523 }
1528 1524
1529 // Test that AudioFrame activity is set when VAD is enabled. 1525 // Test that AudioFrame activity is set when VAD is enabled.
1530 EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(true)); 1526 EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(true));
1531 frame_->vad_activity_ = AudioFrame::kVadUnknown; 1527 frame_->vad_activity_ = AudioFrame::kVadUnknown;
1532 EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_)); 1528 EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
1533 EXPECT_NE(AudioFrame::kVadUnknown, frame_->vad_activity_); 1529 EXPECT_NE(AudioFrame::kVadUnknown, frame_->vad_activity_);
1534 1530
1535 // TODO(bjornv): Add tests for streamed voice; stream_has_voice() 1531 // TODO(bjornv): Add tests for streamed voice; stream_has_voice()
1536 } 1532 }
1537 1533
1538 TEST_F(ApmTest, AllProcessingDisabledByDefault) { 1534 TEST_F(ApmTest, AllProcessingDisabledByDefault) {
1539 EXPECT_FALSE(apm_->echo_cancellation()->is_enabled()); 1535 EXPECT_FALSE(apm_->echo_cancellation()->is_enabled());
1540 EXPECT_FALSE(apm_->echo_control_mobile()->is_enabled()); 1536 EXPECT_FALSE(apm_->echo_control_mobile()->is_enabled());
1541 EXPECT_FALSE(apm_->gain_control()->is_enabled()); 1537 EXPECT_FALSE(apm_->gain_control()->is_enabled());
1542 EXPECT_FALSE(apm_->high_pass_filter()->is_enabled()); 1538 EXPECT_FALSE(apm_->high_pass_filter()->is_enabled());
1543 EXPECT_FALSE(apm_->level_estimator()->is_enabled()); 1539 EXPECT_FALSE(apm_->level_estimator()->is_enabled());
1544 EXPECT_FALSE(apm_->noise_suppression()->is_enabled()); 1540 EXPECT_FALSE(apm_->noise_suppression()->is_enabled());
1545 EXPECT_FALSE(apm_->voice_detection()->is_enabled()); 1541 EXPECT_FALSE(apm_->voice_detection()->is_enabled());
1546 } 1542 }
1547 1543
1548 TEST_F(ApmTest, NoProcessingWhenAllComponentsDisabled) { 1544 TEST_F(ApmTest, NoProcessingWhenAllComponentsDisabled) {
1549 for (size_t i = 0; i < kSampleRatesSize; i++) { 1545 for (size_t i = 0; i < arraysize(kSampleRates); i++) {
1550 Init(kSampleRates[i], kSampleRates[i], kSampleRates[i], 2, 2, 2, false); 1546 Init(kSampleRates[i], kSampleRates[i], kSampleRates[i], 2, 2, 2, false);
1551 SetFrameTo(frame_, 1000, 2000); 1547 SetFrameTo(frame_, 1000, 2000);
1552 AudioFrame frame_copy; 1548 AudioFrame frame_copy;
1553 frame_copy.CopyFrom(*frame_); 1549 frame_copy.CopyFrom(*frame_);
1554 for (int j = 0; j < 1000; j++) { 1550 for (int j = 0; j < 1000; j++) {
1555 EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_)); 1551 EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
1556 EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy)); 1552 EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy));
1557 EXPECT_EQ(apm_->kNoError, apm_->ProcessReverseStream(frame_)); 1553 EXPECT_EQ(apm_->kNoError, apm_->ProcessReverseStream(frame_));
1558 EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy)); 1554 EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy));
1559 } 1555 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1591 output_stream, &rev_dest_channels)); 1587 output_stream, &rev_dest_channels));
1592 1588
1593 for (size_t i = 0; i < kSamples; ++i) { 1589 for (size_t i = 0; i < kSamples; ++i) {
1594 EXPECT_EQ(src[i], rev_dest[i]); 1590 EXPECT_EQ(src[i], rev_dest[i]);
1595 } 1591 }
1596 } 1592 }
1597 1593
1598 TEST_F(ApmTest, IdenticalInputChannelsResultInIdenticalOutputChannels) { 1594 TEST_F(ApmTest, IdenticalInputChannelsResultInIdenticalOutputChannels) {
1599 EnableAllComponents(); 1595 EnableAllComponents();
1600 1596
1601 for (size_t i = 0; i < kProcessSampleRatesSize; i++) { 1597 for (size_t i = 0; i < arraysize(kProcessSampleRates); i++) {
1602 Init(kProcessSampleRates[i], 1598 Init(kProcessSampleRates[i],
1603 kProcessSampleRates[i], 1599 kProcessSampleRates[i],
1604 kProcessSampleRates[i], 1600 kProcessSampleRates[i],
1605 2, 1601 2,
1606 2, 1602 2,
1607 2, 1603 2,
1608 false); 1604 false);
1609 int analog_level = 127; 1605 int analog_level = 127;
1610 ASSERT_EQ(0, feof(far_file_)); 1606 ASSERT_EQ(0, feof(far_file_));
1611 ASSERT_EQ(0, feof(near_file_)); 1607 ASSERT_EQ(0, feof(near_file_));
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
1930 printf("Running test %d of %d...\n", i + 1, ref_data.test_size()); 1926 printf("Running test %d of %d...\n", i + 1, ref_data.test_size());
1931 1927
1932 audioproc::Test* test = ref_data.mutable_test(i); 1928 audioproc::Test* test = ref_data.mutable_test(i);
1933 // TODO(ajm): Restore downmixing test cases. 1929 // TODO(ajm): Restore downmixing test cases.
1934 if (test->num_input_channels() != test->num_output_channels()) 1930 if (test->num_input_channels() != test->num_output_channels())
1935 continue; 1931 continue;
1936 1932
1937 const int num_render_channels = test->num_reverse_channels(); 1933 const int num_render_channels = test->num_reverse_channels();
1938 const int num_input_channels = test->num_input_channels(); 1934 const int num_input_channels = test->num_input_channels();
1939 const int num_output_channels = test->num_output_channels(); 1935 const int num_output_channels = test->num_output_channels();
1940 const int samples_per_channel = test->sample_rate() * 1936 const size_t samples_per_channel = static_cast<size_t>(
1941 AudioProcessing::kChunkSizeMs / 1000; 1937 test->sample_rate() * AudioProcessing::kChunkSizeMs / 1000);
1942 1938
1943 Init(test->sample_rate(), test->sample_rate(), test->sample_rate(), 1939 Init(test->sample_rate(), test->sample_rate(), test->sample_rate(),
1944 num_input_channels, num_output_channels, num_render_channels, true); 1940 num_input_channels, num_output_channels, num_render_channels, true);
1945 Init(fapm.get()); 1941 Init(fapm.get());
1946 1942
1947 ChannelBuffer<int16_t> output_cb(samples_per_channel, num_input_channels); 1943 ChannelBuffer<int16_t> output_cb(samples_per_channel, num_input_channels);
1948 ChannelBuffer<int16_t> output_int16(samples_per_channel, 1944 ChannelBuffer<int16_t> output_int16(samples_per_channel,
1949 num_input_channels); 1945 num_input_channels);
1950 1946
1951 int analog_level = 127; 1947 int analog_level = 127;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2023 // of enabled components. 2019 // of enabled components.
2024 2020
2025 TEST_F(ApmTest, Process) { 2021 TEST_F(ApmTest, Process) {
2026 GOOGLE_PROTOBUF_VERIFY_VERSION; 2022 GOOGLE_PROTOBUF_VERIFY_VERSION;
2027 audioproc::OutputData ref_data; 2023 audioproc::OutputData ref_data;
2028 2024
2029 if (!write_ref_data) { 2025 if (!write_ref_data) {
2030 OpenFileAndReadMessage(ref_filename_, &ref_data); 2026 OpenFileAndReadMessage(ref_filename_, &ref_data);
2031 } else { 2027 } else {
2032 // Write the desired tests to the protobuf reference file. 2028 // Write the desired tests to the protobuf reference file.
2033 for (size_t i = 0; i < kChannelsSize; i++) { 2029 for (size_t i = 0; i < arraysize(kChannels); i++) {
2034 for (size_t j = 0; j < kChannelsSize; j++) { 2030 for (size_t j = 0; j < arraysize(kChannels); j++) {
2035 for (size_t l = 0; l < kProcessSampleRatesSize; l++) { 2031 for (size_t l = 0; l < arraysize(kProcessSampleRates); l++) {
2036 audioproc::Test* test = ref_data.add_test(); 2032 audioproc::Test* test = ref_data.add_test();
2037 test->set_num_reverse_channels(kChannels[i]); 2033 test->set_num_reverse_channels(kChannels[i]);
2038 test->set_num_input_channels(kChannels[j]); 2034 test->set_num_input_channels(kChannels[j]);
2039 test->set_num_output_channels(kChannels[j]); 2035 test->set_num_output_channels(kChannels[j]);
2040 test->set_sample_rate(kProcessSampleRates[l]); 2036 test->set_sample_rate(kProcessSampleRates[l]);
2041 test->set_use_aec_extended_filter(false); 2037 test->set_use_aec_extended_filter(false);
2042 } 2038 }
2043 } 2039 }
2044 } 2040 }
2045 #if defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE) 2041 #if defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
2252 TEST_F(ApmTest, NoErrorsWithKeyboardChannel) { 2248 TEST_F(ApmTest, NoErrorsWithKeyboardChannel) {
2253 struct ChannelFormat { 2249 struct ChannelFormat {
2254 AudioProcessing::ChannelLayout in_layout; 2250 AudioProcessing::ChannelLayout in_layout;
2255 AudioProcessing::ChannelLayout out_layout; 2251 AudioProcessing::ChannelLayout out_layout;
2256 }; 2252 };
2257 ChannelFormat cf[] = { 2253 ChannelFormat cf[] = {
2258 {AudioProcessing::kMonoAndKeyboard, AudioProcessing::kMono}, 2254 {AudioProcessing::kMonoAndKeyboard, AudioProcessing::kMono},
2259 {AudioProcessing::kStereoAndKeyboard, AudioProcessing::kMono}, 2255 {AudioProcessing::kStereoAndKeyboard, AudioProcessing::kMono},
2260 {AudioProcessing::kStereoAndKeyboard, AudioProcessing::kStereo}, 2256 {AudioProcessing::kStereoAndKeyboard, AudioProcessing::kStereo},
2261 }; 2257 };
2262 size_t channel_format_size = sizeof(cf) / sizeof(*cf);
2263 2258
2264 rtc::scoped_ptr<AudioProcessing> ap(AudioProcessing::Create()); 2259 rtc::scoped_ptr<AudioProcessing> ap(AudioProcessing::Create());
2265 // Enable one component just to ensure some processing takes place. 2260 // Enable one component just to ensure some processing takes place.
2266 ap->noise_suppression()->Enable(true); 2261 ap->noise_suppression()->Enable(true);
2267 for (size_t i = 0; i < channel_format_size; ++i) { 2262 for (size_t i = 0; i < arraysize(cf); ++i) {
2268 const int in_rate = 44100; 2263 const int in_rate = 44100;
2269 const int out_rate = 48000; 2264 const int out_rate = 48000;
2270 ChannelBuffer<float> in_cb(SamplesFromRate(in_rate), 2265 ChannelBuffer<float> in_cb(SamplesFromRate(in_rate),
2271 TotalChannelsFromLayout(cf[i].in_layout)); 2266 TotalChannelsFromLayout(cf[i].in_layout));
2272 ChannelBuffer<float> out_cb(SamplesFromRate(out_rate), 2267 ChannelBuffer<float> out_cb(SamplesFromRate(out_rate),
2273 ChannelsFromLayout(cf[i].out_layout)); 2268 ChannelsFromLayout(cf[i].out_layout));
2274 2269
2275 // Run over a few chunks. 2270 // Run over a few chunks.
2276 for (int j = 0; j < 10; ++j) { 2271 for (int j = 0; j < 10; ++j) {
2277 EXPECT_NOERR(ap->ProcessStream( 2272 EXPECT_NOERR(ap->ProcessStream(
2278 in_cb.channels(), 2273 in_cb.channels(),
2279 in_cb.num_frames(), 2274 in_cb.num_frames(),
2280 in_rate, 2275 in_rate,
2281 cf[i].in_layout, 2276 cf[i].in_layout,
2282 out_rate, 2277 out_rate,
2283 cf[i].out_layout, 2278 cf[i].out_layout,
2284 out_cb.channels())); 2279 out_cb.channels()));
2285 } 2280 }
2286 } 2281 }
2287 } 2282 }
2288 2283
2289 // Compares the reference and test arrays over a region around the expected 2284 // Compares the reference and test arrays over a region around the expected
2290 // delay. Finds the highest SNR in that region and adds the variance and squared 2285 // delay. Finds the highest SNR in that region and adds the variance and squared
2291 // error results to the supplied accumulators. 2286 // error results to the supplied accumulators.
2292 void UpdateBestSNR(const float* ref, 2287 void UpdateBestSNR(const float* ref,
2293 const float* test, 2288 const float* test,
2294 int length, 2289 size_t length,
2295 int expected_delay, 2290 int expected_delay,
2296 double* variance_acc, 2291 double* variance_acc,
2297 double* sq_error_acc) { 2292 double* sq_error_acc) {
2298 double best_snr = std::numeric_limits<double>::min(); 2293 double best_snr = std::numeric_limits<double>::min();
2299 double best_variance = 0; 2294 double best_variance = 0;
2300 double best_sq_error = 0; 2295 double best_sq_error = 0;
2301 // Search over a region of eight samples around the expected delay. 2296 // Search over a region of eight samples around the expected delay.
2302 for (int delay = std::max(expected_delay - 4, 0); delay <= expected_delay + 4; 2297 for (int delay = std::max(expected_delay - 4, 0); delay <= expected_delay + 4;
2303 ++delay) { 2298 ++delay) {
2304 double sq_error = 0; 2299 double sq_error = 0;
2305 double variance = 0; 2300 double variance = 0;
2306 for (int i = 0; i < length - delay; ++i) { 2301 for (size_t i = 0; i < length - delay; ++i) {
2307 double error = test[i + delay] - ref[i]; 2302 double error = test[i + delay] - ref[i];
2308 sq_error += error * error; 2303 sq_error += error * error;
2309 variance += ref[i] * ref[i]; 2304 variance += ref[i] * ref[i];
2310 } 2305 }
2311 2306
2312 if (sq_error == 0) { 2307 if (sq_error == 0) {
2313 *variance_acc += variance; 2308 *variance_acc += variance;
2314 return; 2309 return;
2315 } 2310 }
2316 double snr = variance / sq_error; 2311 double snr = variance / sq_error;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2348 reverse_input_rate_(std::tr1::get<2>(GetParam())), 2343 reverse_input_rate_(std::tr1::get<2>(GetParam())),
2349 reverse_output_rate_(std::tr1::get<3>(GetParam())), 2344 reverse_output_rate_(std::tr1::get<3>(GetParam())),
2350 expected_snr_(std::tr1::get<4>(GetParam())), 2345 expected_snr_(std::tr1::get<4>(GetParam())),
2351 expected_reverse_snr_(std::tr1::get<5>(GetParam())) {} 2346 expected_reverse_snr_(std::tr1::get<5>(GetParam())) {}
2352 2347
2353 virtual ~AudioProcessingTest() {} 2348 virtual ~AudioProcessingTest() {}
2354 2349
2355 static void SetUpTestCase() { 2350 static void SetUpTestCase() {
2356 // Create all needed output reference files. 2351 // Create all needed output reference files.
2357 const int kNativeRates[] = {8000, 16000, 32000, 48000}; 2352 const int kNativeRates[] = {8000, 16000, 32000, 48000};
2358 const size_t kNativeRatesSize =
2359 sizeof(kNativeRates) / sizeof(*kNativeRates);
2360 const int kNumChannels[] = {1, 2}; 2353 const int kNumChannels[] = {1, 2};
2361 const size_t kNumChannelsSize = 2354 for (size_t i = 0; i < arraysize(kNativeRates); ++i) {
2362 sizeof(kNumChannels) / sizeof(*kNumChannels); 2355 for (size_t j = 0; j < arraysize(kNumChannels); ++j) {
2363 for (size_t i = 0; i < kNativeRatesSize; ++i) { 2356 for (size_t k = 0; k < arraysize(kNumChannels); ++k) {
2364 for (size_t j = 0; j < kNumChannelsSize; ++j) {
2365 for (size_t k = 0; k < kNumChannelsSize; ++k) {
2366 // The reference files always have matching input and output channels. 2357 // The reference files always have matching input and output channels.
2367 ProcessFormat(kNativeRates[i], kNativeRates[i], kNativeRates[i], 2358 ProcessFormat(kNativeRates[i], kNativeRates[i], kNativeRates[i],
2368 kNativeRates[i], kNumChannels[j], kNumChannels[j], 2359 kNativeRates[i], kNumChannels[j], kNumChannels[j],
2369 kNumChannels[k], kNumChannels[k], "ref"); 2360 kNumChannels[k], kNumChannels[k], "ref");
2370 } 2361 }
2371 } 2362 }
2372 } 2363 }
2373 } 2364 }
2374 2365
2375 static void TearDownTestCase() { 2366 static void TearDownTestCase() {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
2454 fwd_cb.num_frames(), 2445 fwd_cb.num_frames(),
2455 input_rate, 2446 input_rate,
2456 LayoutFromChannels(num_input_channels), 2447 LayoutFromChannels(num_input_channels),
2457 output_rate, 2448 output_rate,
2458 LayoutFromChannels(num_output_channels), 2449 LayoutFromChannels(num_output_channels),
2459 out_cb.channels())); 2450 out_cb.channels()));
2460 2451
2461 // Dump forward output to file. 2452 // Dump forward output to file.
2462 Interleave(out_cb.channels(), out_cb.num_frames(), out_cb.num_channels(), 2453 Interleave(out_cb.channels(), out_cb.num_frames(), out_cb.num_channels(),
2463 float_data.get()); 2454 float_data.get());
2464 int out_length = out_cb.num_channels() * out_cb.num_frames(); 2455 size_t out_length = out_cb.num_channels() * out_cb.num_frames();
2465 2456
2466 ASSERT_EQ(static_cast<size_t>(out_length), 2457 ASSERT_EQ(out_length,
2467 fwrite(float_data.get(), sizeof(float_data[0]), 2458 fwrite(float_data.get(), sizeof(float_data[0]),
2468 out_length, out_file)); 2459 out_length, out_file));
2469 2460
2470 // Dump reverse output to file. 2461 // Dump reverse output to file.
2471 Interleave(rev_out_cb.channels(), rev_out_cb.num_frames(), 2462 Interleave(rev_out_cb.channels(), rev_out_cb.num_frames(),
2472 rev_out_cb.num_channels(), float_data.get()); 2463 rev_out_cb.num_channels(), float_data.get());
2473 int rev_out_length = rev_out_cb.num_channels() * rev_out_cb.num_frames(); 2464 size_t rev_out_length =
2465 rev_out_cb.num_channels() * rev_out_cb.num_frames();
2474 2466
2475 ASSERT_EQ(static_cast<size_t>(rev_out_length), 2467 ASSERT_EQ(rev_out_length,
2476 fwrite(float_data.get(), sizeof(float_data[0]), rev_out_length, 2468 fwrite(float_data.get(), sizeof(float_data[0]), rev_out_length,
2477 rev_out_file)); 2469 rev_out_file));
2478 2470
2479 analog_level = ap->gain_control()->stream_analog_level(); 2471 analog_level = ap->gain_control()->stream_analog_level();
2480 } 2472 }
2481 fclose(far_file); 2473 fclose(far_file);
2482 fclose(near_file); 2474 fclose(near_file);
2483 fclose(out_file); 2475 fclose(out_file);
2484 fclose(rev_out_file); 2476 fclose(rev_out_file);
2485 } 2477 }
(...skipping 15 matching lines...) Expand all
2501 int num_reverse_output; 2493 int num_reverse_output;
2502 }; 2494 };
2503 ChannelFormat cf[] = { 2495 ChannelFormat cf[] = {
2504 {1, 1, 1, 1}, 2496 {1, 1, 1, 1},
2505 {1, 1, 2, 1}, 2497 {1, 1, 2, 1},
2506 {2, 1, 1, 1}, 2498 {2, 1, 1, 1},
2507 {2, 1, 2, 1}, 2499 {2, 1, 2, 1},
2508 {2, 2, 1, 1}, 2500 {2, 2, 1, 1},
2509 {2, 2, 2, 2}, 2501 {2, 2, 2, 2},
2510 }; 2502 };
2511 size_t channel_format_size = sizeof(cf) / sizeof(*cf);
2512 2503
2513 for (size_t i = 0; i < channel_format_size; ++i) { 2504 for (size_t i = 0; i < arraysize(cf); ++i) {
2514 ProcessFormat(input_rate_, output_rate_, reverse_input_rate_, 2505 ProcessFormat(input_rate_, output_rate_, reverse_input_rate_,
2515 reverse_output_rate_, cf[i].num_input, cf[i].num_output, 2506 reverse_output_rate_, cf[i].num_input, cf[i].num_output,
2516 cf[i].num_reverse_input, cf[i].num_reverse_output, "out"); 2507 cf[i].num_reverse_input, cf[i].num_reverse_output, "out");
2517 2508
2518 // Verify output for both directions. 2509 // Verify output for both directions.
2519 std::vector<StreamDirection> stream_directions; 2510 std::vector<StreamDirection> stream_directions;
2520 stream_directions.push_back(kForward); 2511 stream_directions.push_back(kForward);
2521 stream_directions.push_back(kReverse); 2512 stream_directions.push_back(kReverse);
2522 for (StreamDirection file_direction : stream_directions) { 2513 for (StreamDirection file_direction : stream_directions) {
2523 const int in_rate = file_direction ? reverse_input_rate_ : input_rate_; 2514 const int in_rate = file_direction ? reverse_input_rate_ : input_rate_;
(...skipping 29 matching lines...) Expand all
2553 // The reference files always have matching input and output channels. 2544 // The reference files always have matching input and output channels.
2554 FILE* ref_file = fopen( 2545 FILE* ref_file = fopen(
2555 OutputFilePath("ref", ref_rate, ref_rate, ref_rate, ref_rate, 2546 OutputFilePath("ref", ref_rate, ref_rate, ref_rate, ref_rate,
2556 cf[i].num_output, cf[i].num_output, 2547 cf[i].num_output, cf[i].num_output,
2557 cf[i].num_reverse_output, cf[i].num_reverse_output, 2548 cf[i].num_reverse_output, cf[i].num_reverse_output,
2558 file_direction).c_str(), 2549 file_direction).c_str(),
2559 "rb"); 2550 "rb");
2560 ASSERT_TRUE(out_file != NULL); 2551 ASSERT_TRUE(out_file != NULL);
2561 ASSERT_TRUE(ref_file != NULL); 2552 ASSERT_TRUE(ref_file != NULL);
2562 2553
2563 const int ref_length = SamplesFromRate(ref_rate) * out_num; 2554 const size_t ref_length = SamplesFromRate(ref_rate) * out_num;
2564 const int out_length = SamplesFromRate(out_rate) * out_num; 2555 const size_t out_length = SamplesFromRate(out_rate) * out_num;
2565 // Data from the reference file. 2556 // Data from the reference file.
2566 rtc::scoped_ptr<float[]> ref_data(new float[ref_length]); 2557 rtc::scoped_ptr<float[]> ref_data(new float[ref_length]);
2567 // Data from the output file. 2558 // Data from the output file.
2568 rtc::scoped_ptr<float[]> out_data(new float[out_length]); 2559 rtc::scoped_ptr<float[]> out_data(new float[out_length]);
2569 // Data from the resampled output, in case the reference and output rates 2560 // Data from the resampled output, in case the reference and output rates
2570 // don't match. 2561 // don't match.
2571 rtc::scoped_ptr<float[]> cmp_data(new float[ref_length]); 2562 rtc::scoped_ptr<float[]> cmp_data(new float[ref_length]);
2572 2563
2573 PushResampler<float> resampler; 2564 PushResampler<float> resampler;
2574 resampler.InitializeIfNeeded(out_rate, ref_rate, out_num); 2565 resampler.InitializeIfNeeded(out_rate, ref_rate, out_num);
(...skipping 19 matching lines...) Expand all
2594 floor(expected_delay_sec * ref_rate + 0.5f) * out_num; 2585 floor(expected_delay_sec * ref_rate + 0.5f) * out_num;
2595 2586
2596 double variance = 0; 2587 double variance = 0;
2597 double sq_error = 0; 2588 double sq_error = 0;
2598 while (fread(out_data.get(), sizeof(out_data[0]), out_length, out_file) && 2589 while (fread(out_data.get(), sizeof(out_data[0]), out_length, out_file) &&
2599 fread(ref_data.get(), sizeof(ref_data[0]), ref_length, ref_file)) { 2590 fread(ref_data.get(), sizeof(ref_data[0]), ref_length, ref_file)) {
2600 float* out_ptr = out_data.get(); 2591 float* out_ptr = out_data.get();
2601 if (out_rate != ref_rate) { 2592 if (out_rate != ref_rate) {
2602 // Resample the output back to its internal processing rate if 2593 // Resample the output back to its internal processing rate if
2603 // necssary. 2594 // necssary.
2604 ASSERT_EQ(ref_length, resampler.Resample(out_ptr, out_length, 2595 ASSERT_EQ(ref_length,
2605 cmp_data.get(), ref_length)); 2596 static_cast<size_t>(resampler.Resample(
2597 out_ptr, out_length, cmp_data.get(), ref_length)));
2606 out_ptr = cmp_data.get(); 2598 out_ptr = cmp_data.get();
2607 } 2599 }
2608 2600
2609 // Update the |sq_error| and |variance| accumulators with the highest 2601 // Update the |sq_error| and |variance| accumulators with the highest
2610 // SNR of reference vs output. 2602 // SNR of reference vs output.
2611 UpdateBestSNR(ref_data.get(), out_ptr, ref_length, expected_delay, 2603 UpdateBestSNR(ref_data.get(), out_ptr, ref_length, expected_delay,
2612 &variance, &sq_error); 2604 &variance, &sq_error);
2613 } 2605 }
2614 2606
2615 std::cout << "(" << input_rate_ << ", " << output_rate_ << ", " 2607 std::cout << "(" << input_rate_ << ", " << output_rate_ << ", "
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
2742 std::tr1::make_tuple(16000, 32000, 48000, 32000, 25, 35), 2734 std::tr1::make_tuple(16000, 32000, 48000, 32000, 25, 35),
2743 std::tr1::make_tuple(16000, 32000, 32000, 32000, 25, 0), 2735 std::tr1::make_tuple(16000, 32000, 32000, 32000, 25, 0),
2744 std::tr1::make_tuple(16000, 32000, 16000, 32000, 25, 20), 2736 std::tr1::make_tuple(16000, 32000, 16000, 32000, 25, 20),
2745 std::tr1::make_tuple(16000, 16000, 48000, 16000, 35, 20), 2737 std::tr1::make_tuple(16000, 16000, 48000, 16000, 35, 20),
2746 std::tr1::make_tuple(16000, 16000, 32000, 16000, 40, 20), 2738 std::tr1::make_tuple(16000, 16000, 32000, 16000, 40, 20),
2747 std::tr1::make_tuple(16000, 16000, 16000, 16000, 0, 0))); 2739 std::tr1::make_tuple(16000, 16000, 16000, 16000, 0, 0)));
2748 #endif 2740 #endif
2749 2741
2750 } // namespace 2742 } // namespace
2751 } // namespace webrtc 2743 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_processing/noise_suppression_impl.cc ('k') | webrtc/modules/audio_processing/test/test_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698