1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "audio/utility/audio_frame_operations.h"
12
13 #include "rtc_base/checks.h"
14 #include "test/gtest.h"
15
16 namespace webrtc {
17 namespace {
18
19 class AudioFrameOperationsTest : public ::testing::Test {
20 protected:
AudioFrameOperationsTest()21 AudioFrameOperationsTest() {
22 // Set typical values.
23 frame_.samples_per_channel_ = 320;
24 frame_.num_channels_ = 2;
25 }
26
27 AudioFrame frame_;
28 };
29
30 class AudioFrameOperationsDeathTest : public AudioFrameOperationsTest {};
31
SetFrameData(int16_t ch1,int16_t ch2,int16_t ch3,int16_t ch4,AudioFrame * frame)32 void SetFrameData(int16_t ch1,
33 int16_t ch2,
34 int16_t ch3,
35 int16_t ch4,
36 AudioFrame* frame) {
37 int16_t* frame_data = frame->mutable_data();
38 for (size_t i = 0; i < frame->samples_per_channel_ * 4; i += 4) {
39 frame_data[i] = ch1;
40 frame_data[i + 1] = ch2;
41 frame_data[i + 2] = ch3;
42 frame_data[i + 3] = ch4;
43 }
44 }
45
SetFrameData(int16_t left,int16_t right,AudioFrame * frame)46 void SetFrameData(int16_t left, int16_t right, AudioFrame* frame) {
47 int16_t* frame_data = frame->mutable_data();
48 for (size_t i = 0; i < frame->samples_per_channel_ * 2; i += 2) {
49 frame_data[i] = left;
50 frame_data[i + 1] = right;
51 }
52 }
53
SetFrameData(int16_t data,AudioFrame * frame)54 void SetFrameData(int16_t data, AudioFrame* frame) {
55 int16_t* frame_data = frame->mutable_data();
56 for (size_t i = 0; i < frame->samples_per_channel_ * frame->num_channels_;
57 i++) {
58 frame_data[i] = data;
59 }
60 }
61
VerifyFramesAreEqual(const AudioFrame & frame1,const AudioFrame & frame2)62 void VerifyFramesAreEqual(const AudioFrame& frame1, const AudioFrame& frame2) {
63 EXPECT_EQ(frame1.num_channels_, frame2.num_channels_);
64 EXPECT_EQ(frame1.samples_per_channel_, frame2.samples_per_channel_);
65 const int16_t* frame1_data = frame1.data();
66 const int16_t* frame2_data = frame2.data();
67 for (size_t i = 0; i < frame1.samples_per_channel_ * frame1.num_channels_;
68 i++) {
69 EXPECT_EQ(frame1_data[i], frame2_data[i]);
70 }
71 EXPECT_EQ(frame1.muted(), frame2.muted());
72 }
73
InitFrame(AudioFrame * frame,size_t channels,size_t samples_per_channel,int16_t left_data,int16_t right_data)74 void InitFrame(AudioFrame* frame,
75 size_t channels,
76 size_t samples_per_channel,
77 int16_t left_data,
78 int16_t right_data) {
79 RTC_DCHECK(frame);
80 RTC_DCHECK_GE(2, channels);
81 RTC_DCHECK_GE(AudioFrame::kMaxDataSizeSamples,
82 samples_per_channel * channels);
83 frame->samples_per_channel_ = samples_per_channel;
84 frame->num_channels_ = channels;
85 if (channels == 2) {
86 SetFrameData(left_data, right_data, frame);
87 } else if (channels == 1) {
88 SetFrameData(left_data, frame);
89 }
90 }
91
GetChannelData(const AudioFrame & frame,size_t channel,size_t index)92 int16_t GetChannelData(const AudioFrame& frame, size_t channel, size_t index) {
93 RTC_DCHECK_LT(channel, frame.num_channels_);
94 RTC_DCHECK_LT(index, frame.samples_per_channel_);
95 return frame.data()[index * frame.num_channels_ + channel];
96 }
97
VerifyFrameDataBounds(const AudioFrame & frame,size_t channel,int16_t max,int16_t min)98 void VerifyFrameDataBounds(const AudioFrame& frame,
99 size_t channel,
100 int16_t max,
101 int16_t min) {
102 for (size_t i = 0; i < frame.samples_per_channel_; ++i) {
103 int16_t s = GetChannelData(frame, channel, i);
104 EXPECT_LE(min, s);
105 EXPECT_GE(max, s);
106 }
107 }
108
109 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
TEST_F(AudioFrameOperationsDeathTest,MonoToStereoFailsWithBadParameters)110 TEST_F(AudioFrameOperationsDeathTest, MonoToStereoFailsWithBadParameters) {
111 EXPECT_DEATH(AudioFrameOperations::UpmixChannels(2, &frame_), "");
112 frame_.samples_per_channel_ = AudioFrame::kMaxDataSizeSamples;
113 frame_.num_channels_ = 1;
114 EXPECT_DEATH(AudioFrameOperations::UpmixChannels(2, &frame_), "");
115 }
116 #endif
117
TEST_F(AudioFrameOperationsTest,MonoToStereoSucceeds)118 TEST_F(AudioFrameOperationsTest, MonoToStereoSucceeds) {
119 frame_.num_channels_ = 1;
120 SetFrameData(1, &frame_);
121
122 AudioFrameOperations::UpmixChannels(2, &frame_);
123 EXPECT_EQ(2u, frame_.num_channels_);
124
125 AudioFrame stereo_frame;
126 stereo_frame.samples_per_channel_ = 320;
127 stereo_frame.num_channels_ = 2;
128 SetFrameData(1, 1, &stereo_frame);
129 VerifyFramesAreEqual(stereo_frame, frame_);
130 }
131
TEST_F(AudioFrameOperationsTest,MonoToStereoMuted)132 TEST_F(AudioFrameOperationsTest, MonoToStereoMuted) {
133 frame_.num_channels_ = 1;
134 ASSERT_TRUE(frame_.muted());
135 AudioFrameOperations::UpmixChannels(2, &frame_);
136 EXPECT_EQ(2u, frame_.num_channels_);
137 EXPECT_TRUE(frame_.muted());
138 }
139
140 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
TEST_F(AudioFrameOperationsDeathTest,StereoToMonoFailsWithBadParameters)141 TEST_F(AudioFrameOperationsDeathTest, StereoToMonoFailsWithBadParameters) {
142 frame_.num_channels_ = 1;
143 EXPECT_DEATH(AudioFrameOperations::DownmixChannels(1, &frame_), "");
144 }
145 #endif
146
TEST_F(AudioFrameOperationsTest,StereoToMonoSucceeds)147 TEST_F(AudioFrameOperationsTest, StereoToMonoSucceeds) {
148 SetFrameData(4, 2, &frame_);
149 AudioFrameOperations::DownmixChannels(1, &frame_);
150 EXPECT_EQ(1u, frame_.num_channels_);
151
152 AudioFrame mono_frame;
153 mono_frame.samples_per_channel_ = 320;
154 mono_frame.num_channels_ = 1;
155 SetFrameData(3, &mono_frame);
156 VerifyFramesAreEqual(mono_frame, frame_);
157 }
158
TEST_F(AudioFrameOperationsTest,StereoToMonoMuted)159 TEST_F(AudioFrameOperationsTest, StereoToMonoMuted) {
160 ASSERT_TRUE(frame_.muted());
161 AudioFrameOperations::DownmixChannels(1, &frame_);
162 EXPECT_EQ(1u, frame_.num_channels_);
163 EXPECT_TRUE(frame_.muted());
164 }
165
TEST_F(AudioFrameOperationsTest,StereoToMonoBufferSucceeds)166 TEST_F(AudioFrameOperationsTest, StereoToMonoBufferSucceeds) {
167 AudioFrame target_frame;
168 SetFrameData(4, 2, &frame_);
169
170 target_frame.num_channels_ = 1;
171 target_frame.samples_per_channel_ = frame_.samples_per_channel_;
172
173 AudioFrameOperations::DownmixChannels(frame_.data(), 2,
174 frame_.samples_per_channel_, 1,
175 target_frame.mutable_data());
176
177 AudioFrame mono_frame;
178 mono_frame.samples_per_channel_ = 320;
179 mono_frame.num_channels_ = 1;
180 SetFrameData(3, &mono_frame);
181 VerifyFramesAreEqual(mono_frame, target_frame);
182 }
183
TEST_F(AudioFrameOperationsTest,StereoToMonoDoesNotWrapAround)184 TEST_F(AudioFrameOperationsTest, StereoToMonoDoesNotWrapAround) {
185 SetFrameData(-32768, -32768, &frame_);
186 AudioFrameOperations::DownmixChannels(1, &frame_);
187 EXPECT_EQ(1u, frame_.num_channels_);
188 AudioFrame mono_frame;
189 mono_frame.samples_per_channel_ = 320;
190 mono_frame.num_channels_ = 1;
191 SetFrameData(-32768, &mono_frame);
192 VerifyFramesAreEqual(mono_frame, frame_);
193 }
194
TEST_F(AudioFrameOperationsTest,QuadToMonoSucceeds)195 TEST_F(AudioFrameOperationsTest, QuadToMonoSucceeds) {
196 frame_.num_channels_ = 4;
197 SetFrameData(4, 2, 6, 8, &frame_);
198
199 AudioFrameOperations::DownmixChannels(1, &frame_);
200 EXPECT_EQ(1u, frame_.num_channels_);
201
202 AudioFrame mono_frame;
203 mono_frame.samples_per_channel_ = 320;
204 mono_frame.num_channels_ = 1;
205 SetFrameData(5, &mono_frame);
206 VerifyFramesAreEqual(mono_frame, frame_);
207 }
208
TEST_F(AudioFrameOperationsTest,QuadToMonoMuted)209 TEST_F(AudioFrameOperationsTest, QuadToMonoMuted) {
210 frame_.num_channels_ = 4;
211 ASSERT_TRUE(frame_.muted());
212 AudioFrameOperations::DownmixChannels(1, &frame_);
213 EXPECT_EQ(1u, frame_.num_channels_);
214 EXPECT_TRUE(frame_.muted());
215 }
216
TEST_F(AudioFrameOperationsTest,QuadToMonoBufferSucceeds)217 TEST_F(AudioFrameOperationsTest, QuadToMonoBufferSucceeds) {
218 AudioFrame target_frame;
219 frame_.num_channels_ = 4;
220 SetFrameData(4, 2, 6, 8, &frame_);
221
222 target_frame.num_channels_ = 1;
223 target_frame.samples_per_channel_ = frame_.samples_per_channel_;
224
225 AudioFrameOperations::DownmixChannels(frame_.data(), 4,
226 frame_.samples_per_channel_, 1,
227 target_frame.mutable_data());
228 AudioFrame mono_frame;
229 mono_frame.samples_per_channel_ = 320;
230 mono_frame.num_channels_ = 1;
231 SetFrameData(5, &mono_frame);
232 VerifyFramesAreEqual(mono_frame, target_frame);
233 }
234
TEST_F(AudioFrameOperationsTest,QuadToMonoDoesNotWrapAround)235 TEST_F(AudioFrameOperationsTest, QuadToMonoDoesNotWrapAround) {
236 frame_.num_channels_ = 4;
237 SetFrameData(-32768, -32768, -32768, -32768, &frame_);
238 AudioFrameOperations::DownmixChannels(1, &frame_);
239 EXPECT_EQ(1u, frame_.num_channels_);
240
241 AudioFrame mono_frame;
242 mono_frame.samples_per_channel_ = 320;
243 mono_frame.num_channels_ = 1;
244 SetFrameData(-32768, &mono_frame);
245 VerifyFramesAreEqual(mono_frame, frame_);
246 }
247
TEST_F(AudioFrameOperationsTest,QuadToStereoFailsWithBadParameters)248 TEST_F(AudioFrameOperationsTest, QuadToStereoFailsWithBadParameters) {
249 frame_.num_channels_ = 1;
250 EXPECT_EQ(-1, AudioFrameOperations::QuadToStereo(&frame_));
251 frame_.num_channels_ = 2;
252 EXPECT_EQ(-1, AudioFrameOperations::QuadToStereo(&frame_));
253 }
254
TEST_F(AudioFrameOperationsTest,QuadToStereoSucceeds)255 TEST_F(AudioFrameOperationsTest, QuadToStereoSucceeds) {
256 frame_.num_channels_ = 4;
257 SetFrameData(4, 2, 6, 8, &frame_);
258 EXPECT_EQ(0, AudioFrameOperations::QuadToStereo(&frame_));
259
260 AudioFrame stereo_frame;
261 stereo_frame.samples_per_channel_ = 320;
262 stereo_frame.num_channels_ = 2;
263 SetFrameData(3, 7, &stereo_frame);
264 VerifyFramesAreEqual(stereo_frame, frame_);
265 }
266
TEST_F(AudioFrameOperationsTest,QuadToStereoMuted)267 TEST_F(AudioFrameOperationsTest, QuadToStereoMuted) {
268 frame_.num_channels_ = 4;
269 ASSERT_TRUE(frame_.muted());
270 EXPECT_EQ(0, AudioFrameOperations::QuadToStereo(&frame_));
271 EXPECT_TRUE(frame_.muted());
272 }
273
TEST_F(AudioFrameOperationsTest,QuadToStereoBufferSucceeds)274 TEST_F(AudioFrameOperationsTest, QuadToStereoBufferSucceeds) {
275 AudioFrame target_frame;
276 frame_.num_channels_ = 4;
277 SetFrameData(4, 2, 6, 8, &frame_);
278
279 target_frame.num_channels_ = 2;
280 target_frame.samples_per_channel_ = frame_.samples_per_channel_;
281
282 AudioFrameOperations::QuadToStereo(frame_.data(), frame_.samples_per_channel_,
283 target_frame.mutable_data());
284 AudioFrame stereo_frame;
285 stereo_frame.samples_per_channel_ = 320;
286 stereo_frame.num_channels_ = 2;
287 SetFrameData(3, 7, &stereo_frame);
288 VerifyFramesAreEqual(stereo_frame, target_frame);
289 }
290
TEST_F(AudioFrameOperationsTest,QuadToStereoDoesNotWrapAround)291 TEST_F(AudioFrameOperationsTest, QuadToStereoDoesNotWrapAround) {
292 frame_.num_channels_ = 4;
293 SetFrameData(-32768, -32768, -32768, -32768, &frame_);
294 EXPECT_EQ(0, AudioFrameOperations::QuadToStereo(&frame_));
295
296 AudioFrame stereo_frame;
297 stereo_frame.samples_per_channel_ = 320;
298 stereo_frame.num_channels_ = 2;
299 SetFrameData(-32768, -32768, &stereo_frame);
300 VerifyFramesAreEqual(stereo_frame, frame_);
301 }
302
TEST_F(AudioFrameOperationsTest,SwapStereoChannelsSucceedsOnStereo)303 TEST_F(AudioFrameOperationsTest, SwapStereoChannelsSucceedsOnStereo) {
304 SetFrameData(0, 1, &frame_);
305
306 AudioFrame swapped_frame;
307 swapped_frame.samples_per_channel_ = 320;
308 swapped_frame.num_channels_ = 2;
309 SetFrameData(1, 0, &swapped_frame);
310
311 AudioFrameOperations::SwapStereoChannels(&frame_);
312 VerifyFramesAreEqual(swapped_frame, frame_);
313 }
314
TEST_F(AudioFrameOperationsTest,SwapStereoChannelsMuted)315 TEST_F(AudioFrameOperationsTest, SwapStereoChannelsMuted) {
316 ASSERT_TRUE(frame_.muted());
317 AudioFrameOperations::SwapStereoChannels(&frame_);
318 EXPECT_TRUE(frame_.muted());
319 }
320
TEST_F(AudioFrameOperationsTest,SwapStereoChannelsFailsOnMono)321 TEST_F(AudioFrameOperationsTest, SwapStereoChannelsFailsOnMono) {
322 frame_.num_channels_ = 1;
323 // Set data to "stereo", despite it being a mono frame.
324 SetFrameData(0, 1, &frame_);
325
326 AudioFrame orig_frame;
327 orig_frame.CopyFrom(frame_);
328 AudioFrameOperations::SwapStereoChannels(&frame_);
329 // Verify that no swap occurred.
330 VerifyFramesAreEqual(orig_frame, frame_);
331 }
332
TEST_F(AudioFrameOperationsTest,MuteDisabled)333 TEST_F(AudioFrameOperationsTest, MuteDisabled) {
334 SetFrameData(1000, -1000, &frame_);
335 AudioFrameOperations::Mute(&frame_, false, false);
336
337 AudioFrame muted_frame;
338 muted_frame.samples_per_channel_ = 320;
339 muted_frame.num_channels_ = 2;
340 SetFrameData(1000, -1000, &muted_frame);
341 VerifyFramesAreEqual(muted_frame, frame_);
342 }
343
TEST_F(AudioFrameOperationsTest,MuteEnabled)344 TEST_F(AudioFrameOperationsTest, MuteEnabled) {
345 SetFrameData(1000, -1000, &frame_);
346 AudioFrameOperations::Mute(&frame_, true, true);
347
348 AudioFrame muted_frame;
349 muted_frame.samples_per_channel_ = frame_.samples_per_channel_;
350 muted_frame.num_channels_ = frame_.num_channels_;
351 ASSERT_TRUE(muted_frame.muted());
352 VerifyFramesAreEqual(muted_frame, frame_);
353 }
354
355 // Verify that *beginning* to mute works for short and long (>128) frames, mono
356 // and stereo. Beginning mute should yield a ramp down to zero.
TEST_F(AudioFrameOperationsTest,MuteBeginMonoLong)357 TEST_F(AudioFrameOperationsTest, MuteBeginMonoLong) {
358 InitFrame(&frame_, 1, 228, 1000, -1000);
359 AudioFrameOperations::Mute(&frame_, false, true);
360 VerifyFrameDataBounds(frame_, 0, 1000, 0);
361 EXPECT_EQ(1000, GetChannelData(frame_, 0, 99));
362 EXPECT_EQ(992, GetChannelData(frame_, 0, 100));
363 EXPECT_EQ(7, GetChannelData(frame_, 0, 226));
364 EXPECT_EQ(0, GetChannelData(frame_, 0, 227));
365 }
366
TEST_F(AudioFrameOperationsTest,MuteBeginMonoShort)367 TEST_F(AudioFrameOperationsTest, MuteBeginMonoShort) {
368 InitFrame(&frame_, 1, 93, 1000, -1000);
369 AudioFrameOperations::Mute(&frame_, false, true);
370 VerifyFrameDataBounds(frame_, 0, 1000, 0);
371 EXPECT_EQ(989, GetChannelData(frame_, 0, 0));
372 EXPECT_EQ(978, GetChannelData(frame_, 0, 1));
373 EXPECT_EQ(10, GetChannelData(frame_, 0, 91));
374 EXPECT_EQ(0, GetChannelData(frame_, 0, 92));
375 }
376
TEST_F(AudioFrameOperationsTest,MuteBeginStereoLong)377 TEST_F(AudioFrameOperationsTest, MuteBeginStereoLong) {
378 InitFrame(&frame_, 2, 228, 1000, -1000);
379 AudioFrameOperations::Mute(&frame_, false, true);
380 VerifyFrameDataBounds(frame_, 0, 1000, 0);
381 VerifyFrameDataBounds(frame_, 1, 0, -1000);
382 EXPECT_EQ(1000, GetChannelData(frame_, 0, 99));
383 EXPECT_EQ(-1000, GetChannelData(frame_, 1, 99));
384 EXPECT_EQ(992, GetChannelData(frame_, 0, 100));
385 EXPECT_EQ(-992, GetChannelData(frame_, 1, 100));
386 EXPECT_EQ(7, GetChannelData(frame_, 0, 226));
387 EXPECT_EQ(-7, GetChannelData(frame_, 1, 226));
388 EXPECT_EQ(0, GetChannelData(frame_, 0, 227));
389 EXPECT_EQ(0, GetChannelData(frame_, 1, 227));
390 }
391
TEST_F(AudioFrameOperationsTest,MuteBeginStereoShort)392 TEST_F(AudioFrameOperationsTest, MuteBeginStereoShort) {
393 InitFrame(&frame_, 2, 93, 1000, -1000);
394 AudioFrameOperations::Mute(&frame_, false, true);
395 VerifyFrameDataBounds(frame_, 0, 1000, 0);
396 VerifyFrameDataBounds(frame_, 1, 0, -1000);
397 EXPECT_EQ(989, GetChannelData(frame_, 0, 0));
398 EXPECT_EQ(-989, GetChannelData(frame_, 1, 0));
399 EXPECT_EQ(978, GetChannelData(frame_, 0, 1));
400 EXPECT_EQ(-978, GetChannelData(frame_, 1, 1));
401 EXPECT_EQ(10, GetChannelData(frame_, 0, 91));
402 EXPECT_EQ(-10, GetChannelData(frame_, 1, 91));
403 EXPECT_EQ(0, GetChannelData(frame_, 0, 92));
404 EXPECT_EQ(0, GetChannelData(frame_, 1, 92));
405 }
406
407 // Verify that *ending* to mute works for short and long (>128) frames, mono
408 // and stereo. Ending mute should yield a ramp up from zero.
TEST_F(AudioFrameOperationsTest,MuteEndMonoLong)409 TEST_F(AudioFrameOperationsTest, MuteEndMonoLong) {
410 InitFrame(&frame_, 1, 228, 1000, -1000);
411 AudioFrameOperations::Mute(&frame_, true, false);
412 VerifyFrameDataBounds(frame_, 0, 1000, 0);
413 EXPECT_EQ(7, GetChannelData(frame_, 0, 0));
414 EXPECT_EQ(15, GetChannelData(frame_, 0, 1));
415 EXPECT_EQ(1000, GetChannelData(frame_, 0, 127));
416 EXPECT_EQ(1000, GetChannelData(frame_, 0, 128));
417 }
418
TEST_F(AudioFrameOperationsTest,MuteEndMonoShort)419 TEST_F(AudioFrameOperationsTest, MuteEndMonoShort) {
420 InitFrame(&frame_, 1, 93, 1000, -1000);
421 AudioFrameOperations::Mute(&frame_, true, false);
422 VerifyFrameDataBounds(frame_, 0, 1000, 0);
423 EXPECT_EQ(10, GetChannelData(frame_, 0, 0));
424 EXPECT_EQ(21, GetChannelData(frame_, 0, 1));
425 EXPECT_EQ(989, GetChannelData(frame_, 0, 91));
426 EXPECT_EQ(999, GetChannelData(frame_, 0, 92));
427 }
428
TEST_F(AudioFrameOperationsTest,MuteEndStereoLong)429 TEST_F(AudioFrameOperationsTest, MuteEndStereoLong) {
430 InitFrame(&frame_, 2, 228, 1000, -1000);
431 AudioFrameOperations::Mute(&frame_, true, false);
432 VerifyFrameDataBounds(frame_, 0, 1000, 0);
433 VerifyFrameDataBounds(frame_, 1, 0, -1000);
434 EXPECT_EQ(7, GetChannelData(frame_, 0, 0));
435 EXPECT_EQ(-7, GetChannelData(frame_, 1, 0));
436 EXPECT_EQ(15, GetChannelData(frame_, 0, 1));
437 EXPECT_EQ(-15, GetChannelData(frame_, 1, 1));
438 EXPECT_EQ(1000, GetChannelData(frame_, 0, 127));
439 EXPECT_EQ(-1000, GetChannelData(frame_, 1, 127));
440 EXPECT_EQ(1000, GetChannelData(frame_, 0, 128));
441 EXPECT_EQ(-1000, GetChannelData(frame_, 1, 128));
442 }
443
TEST_F(AudioFrameOperationsTest,MuteEndStereoShort)444 TEST_F(AudioFrameOperationsTest, MuteEndStereoShort) {
445 InitFrame(&frame_, 2, 93, 1000, -1000);
446 AudioFrameOperations::Mute(&frame_, true, false);
447 VerifyFrameDataBounds(frame_, 0, 1000, 0);
448 VerifyFrameDataBounds(frame_, 1, 0, -1000);
449 EXPECT_EQ(10, GetChannelData(frame_, 0, 0));
450 EXPECT_EQ(-10, GetChannelData(frame_, 1, 0));
451 EXPECT_EQ(21, GetChannelData(frame_, 0, 1));
452 EXPECT_EQ(-21, GetChannelData(frame_, 1, 1));
453 EXPECT_EQ(989, GetChannelData(frame_, 0, 91));
454 EXPECT_EQ(-989, GetChannelData(frame_, 1, 91));
455 EXPECT_EQ(999, GetChannelData(frame_, 0, 92));
456 EXPECT_EQ(-999, GetChannelData(frame_, 1, 92));
457 }
458
TEST_F(AudioFrameOperationsTest,MuteBeginAlreadyMuted)459 TEST_F(AudioFrameOperationsTest, MuteBeginAlreadyMuted) {
460 ASSERT_TRUE(frame_.muted());
461 AudioFrameOperations::Mute(&frame_, false, true);
462 EXPECT_TRUE(frame_.muted());
463 }
464
TEST_F(AudioFrameOperationsTest,MuteEndAlreadyMuted)465 TEST_F(AudioFrameOperationsTest, MuteEndAlreadyMuted) {
466 ASSERT_TRUE(frame_.muted());
467 AudioFrameOperations::Mute(&frame_, true, false);
468 EXPECT_TRUE(frame_.muted());
469 }
470
TEST_F(AudioFrameOperationsTest,ApplyHalfGainSucceeds)471 TEST_F(AudioFrameOperationsTest, ApplyHalfGainSucceeds) {
472 SetFrameData(2, &frame_);
473
474 AudioFrame half_gain_frame;
475 half_gain_frame.num_channels_ = frame_.num_channels_;
476 half_gain_frame.samples_per_channel_ = frame_.samples_per_channel_;
477 SetFrameData(1, &half_gain_frame);
478
479 AudioFrameOperations::ApplyHalfGain(&frame_);
480 VerifyFramesAreEqual(half_gain_frame, frame_);
481 }
482
TEST_F(AudioFrameOperationsTest,ApplyHalfGainMuted)483 TEST_F(AudioFrameOperationsTest, ApplyHalfGainMuted) {
484 ASSERT_TRUE(frame_.muted());
485 AudioFrameOperations::ApplyHalfGain(&frame_);
486 EXPECT_TRUE(frame_.muted());
487 }
488
489 // TODO(andrew): should not allow negative scales.
TEST_F(AudioFrameOperationsTest,DISABLED_ScaleFailsWithBadParameters)490 TEST_F(AudioFrameOperationsTest, DISABLED_ScaleFailsWithBadParameters) {
491 frame_.num_channels_ = 1;
492 EXPECT_EQ(-1, AudioFrameOperations::Scale(1.0, 1.0, &frame_));
493
494 frame_.num_channels_ = 3;
495 EXPECT_EQ(-1, AudioFrameOperations::Scale(1.0, 1.0, &frame_));
496
497 frame_.num_channels_ = 2;
498 EXPECT_EQ(-1, AudioFrameOperations::Scale(-1.0, 1.0, &frame_));
499 EXPECT_EQ(-1, AudioFrameOperations::Scale(1.0, -1.0, &frame_));
500 }
501
502 // TODO(andrew): fix the wraparound bug. We should always saturate.
TEST_F(AudioFrameOperationsTest,DISABLED_ScaleDoesNotWrapAround)503 TEST_F(AudioFrameOperationsTest, DISABLED_ScaleDoesNotWrapAround) {
504 SetFrameData(4000, -4000, &frame_);
505 EXPECT_EQ(0, AudioFrameOperations::Scale(10.0, 10.0, &frame_));
506
507 AudioFrame clipped_frame;
508 clipped_frame.samples_per_channel_ = 320;
509 clipped_frame.num_channels_ = 2;
510 SetFrameData(32767, -32768, &clipped_frame);
511 VerifyFramesAreEqual(clipped_frame, frame_);
512 }
513
TEST_F(AudioFrameOperationsTest,ScaleSucceeds)514 TEST_F(AudioFrameOperationsTest, ScaleSucceeds) {
515 SetFrameData(1, -1, &frame_);
516 EXPECT_EQ(0, AudioFrameOperations::Scale(2.0, 3.0, &frame_));
517
518 AudioFrame scaled_frame;
519 scaled_frame.samples_per_channel_ = 320;
520 scaled_frame.num_channels_ = 2;
521 SetFrameData(2, -3, &scaled_frame);
522 VerifyFramesAreEqual(scaled_frame, frame_);
523 }
524
TEST_F(AudioFrameOperationsTest,ScaleMuted)525 TEST_F(AudioFrameOperationsTest, ScaleMuted) {
526 ASSERT_TRUE(frame_.muted());
527 EXPECT_EQ(0, AudioFrameOperations::Scale(2.0, 3.0, &frame_));
528 EXPECT_TRUE(frame_.muted());
529 }
530
531 // TODO(andrew): should fail with a negative scale.
TEST_F(AudioFrameOperationsTest,DISABLED_ScaleWithSatFailsWithBadParameters)532 TEST_F(AudioFrameOperationsTest, DISABLED_ScaleWithSatFailsWithBadParameters) {
533 EXPECT_EQ(-1, AudioFrameOperations::ScaleWithSat(-1.0, &frame_));
534 }
535
TEST_F(AudioFrameOperationsTest,ScaleWithSatDoesNotWrapAround)536 TEST_F(AudioFrameOperationsTest, ScaleWithSatDoesNotWrapAround) {
537 frame_.num_channels_ = 1;
538 SetFrameData(4000, &frame_);
539 EXPECT_EQ(0, AudioFrameOperations::ScaleWithSat(10.0, &frame_));
540
541 AudioFrame clipped_frame;
542 clipped_frame.samples_per_channel_ = 320;
543 clipped_frame.num_channels_ = 1;
544 SetFrameData(32767, &clipped_frame);
545 VerifyFramesAreEqual(clipped_frame, frame_);
546
547 SetFrameData(-4000, &frame_);
548 EXPECT_EQ(0, AudioFrameOperations::ScaleWithSat(10.0, &frame_));
549 SetFrameData(-32768, &clipped_frame);
550 VerifyFramesAreEqual(clipped_frame, frame_);
551 }
552
TEST_F(AudioFrameOperationsTest,ScaleWithSatSucceeds)553 TEST_F(AudioFrameOperationsTest, ScaleWithSatSucceeds) {
554 frame_.num_channels_ = 1;
555 SetFrameData(1, &frame_);
556 EXPECT_EQ(0, AudioFrameOperations::ScaleWithSat(2.0, &frame_));
557
558 AudioFrame scaled_frame;
559 scaled_frame.samples_per_channel_ = 320;
560 scaled_frame.num_channels_ = 1;
561 SetFrameData(2, &scaled_frame);
562 VerifyFramesAreEqual(scaled_frame, frame_);
563 }
564
TEST_F(AudioFrameOperationsTest,ScaleWithSatMuted)565 TEST_F(AudioFrameOperationsTest, ScaleWithSatMuted) {
566 ASSERT_TRUE(frame_.muted());
567 EXPECT_EQ(0, AudioFrameOperations::ScaleWithSat(2.0, &frame_));
568 EXPECT_TRUE(frame_.muted());
569 }
570
TEST_F(AudioFrameOperationsTest,AddingXToEmptyGivesX)571 TEST_F(AudioFrameOperationsTest, AddingXToEmptyGivesX) {
572 // When samples_per_channel_ is 0, the frame counts as empty and zero.
573 AudioFrame frame_to_add_to;
574 frame_to_add_to.mutable_data(); // Unmute the frame.
575 ASSERT_FALSE(frame_to_add_to.muted());
576 frame_to_add_to.samples_per_channel_ = 0;
577 frame_to_add_to.num_channels_ = frame_.num_channels_;
578
579 SetFrameData(1000, &frame_);
580 AudioFrameOperations::Add(frame_, &frame_to_add_to);
581 VerifyFramesAreEqual(frame_, frame_to_add_to);
582 }
583
TEST_F(AudioFrameOperationsTest,AddingXToMutedGivesX)584 TEST_F(AudioFrameOperationsTest, AddingXToMutedGivesX) {
585 AudioFrame frame_to_add_to;
586 ASSERT_TRUE(frame_to_add_to.muted());
587 frame_to_add_to.samples_per_channel_ = frame_.samples_per_channel_;
588 frame_to_add_to.num_channels_ = frame_.num_channels_;
589
590 SetFrameData(1000, &frame_);
591 AudioFrameOperations::Add(frame_, &frame_to_add_to);
592 VerifyFramesAreEqual(frame_, frame_to_add_to);
593 }
594
TEST_F(AudioFrameOperationsTest,AddingMutedToXGivesX)595 TEST_F(AudioFrameOperationsTest, AddingMutedToXGivesX) {
596 AudioFrame frame_to_add_to;
597 frame_to_add_to.samples_per_channel_ = frame_.samples_per_channel_;
598 frame_to_add_to.num_channels_ = frame_.num_channels_;
599 SetFrameData(1000, &frame_to_add_to);
600
601 AudioFrame frame_copy;
602 frame_copy.CopyFrom(frame_to_add_to);
603
604 ASSERT_TRUE(frame_.muted());
605 AudioFrameOperations::Add(frame_, &frame_to_add_to);
606 VerifyFramesAreEqual(frame_copy, frame_to_add_to);
607 }
608
TEST_F(AudioFrameOperationsTest,AddingTwoFramesProducesTheirSum)609 TEST_F(AudioFrameOperationsTest, AddingTwoFramesProducesTheirSum) {
610 AudioFrame frame_to_add_to;
611 frame_to_add_to.samples_per_channel_ = frame_.samples_per_channel_;
612 frame_to_add_to.num_channels_ = frame_.num_channels_;
613 SetFrameData(1000, &frame_to_add_to);
614 SetFrameData(2000, &frame_);
615
616 AudioFrameOperations::Add(frame_, &frame_to_add_to);
617 SetFrameData(frame_.data()[0] + 1000, &frame_);
618 VerifyFramesAreEqual(frame_, frame_to_add_to);
619 }
620
621 } // namespace
622 } // namespace webrtc
623