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 <stdlib.h>
12
13 #include "common_audio/vad/vad_unittest.h"
14 #include "test/gtest.h"
15
16 extern "C" {
17 #include "common_audio/vad/vad_core.h"
18 }
19
20 namespace webrtc {
21 namespace test {
22
TEST_F(VadTest,InitCore)23 TEST_F(VadTest, InitCore) {
24 // Test WebRtcVad_InitCore().
25 VadInstT* self = reinterpret_cast<VadInstT*>(malloc(sizeof(VadInstT)));
26
27 // null pointer test.
28 EXPECT_EQ(-1, WebRtcVad_InitCore(nullptr));
29
30 // Verify return = 0 for non-null pointer.
31 EXPECT_EQ(0, WebRtcVad_InitCore(self));
32 // Verify init_flag is set.
33 EXPECT_EQ(42, self->init_flag);
34
35 free(self);
36 }
37
TEST_F(VadTest,set_mode_core)38 TEST_F(VadTest, set_mode_core) {
39 VadInstT* self = reinterpret_cast<VadInstT*>(malloc(sizeof(VadInstT)));
40
41 // TODO(bjornv): Add null pointer check if we take care of it in
42 // vad_core.c
43
44 ASSERT_EQ(0, WebRtcVad_InitCore(self));
45 // Test WebRtcVad_set_mode_core().
46 // Invalid modes should return -1.
47 EXPECT_EQ(-1, WebRtcVad_set_mode_core(self, -1));
48 EXPECT_EQ(-1, WebRtcVad_set_mode_core(self, 1000));
49 // Valid modes should return 0.
50 for (size_t j = 0; j < kModesSize; ++j) {
51 EXPECT_EQ(0, WebRtcVad_set_mode_core(self, kModes[j]));
52 }
53
54 free(self);
55 }
56
TEST_F(VadTest,CalcVad)57 TEST_F(VadTest, CalcVad) {
58 VadInstT* self = reinterpret_cast<VadInstT*>(malloc(sizeof(VadInstT)));
59 int16_t speech[kMaxFrameLength];
60
61 // TODO(bjornv): Add null pointer check if we take care of it in
62 // vad_core.c
63
64 // Test WebRtcVad_CalcVadXXkhz()
65 // Verify that all zeros in gives VAD = 0 out.
66 memset(speech, 0, sizeof(speech));
67 ASSERT_EQ(0, WebRtcVad_InitCore(self));
68 for (size_t j = 0; j < kFrameLengthsSize; ++j) {
69 if (ValidRatesAndFrameLengths(8000, kFrameLengths[j])) {
70 EXPECT_EQ(0, WebRtcVad_CalcVad8khz(self, speech, kFrameLengths[j]));
71 }
72 if (ValidRatesAndFrameLengths(16000, kFrameLengths[j])) {
73 EXPECT_EQ(0, WebRtcVad_CalcVad16khz(self, speech, kFrameLengths[j]));
74 }
75 if (ValidRatesAndFrameLengths(32000, kFrameLengths[j])) {
76 EXPECT_EQ(0, WebRtcVad_CalcVad32khz(self, speech, kFrameLengths[j]));
77 }
78 if (ValidRatesAndFrameLengths(48000, kFrameLengths[j])) {
79 EXPECT_EQ(0, WebRtcVad_CalcVad48khz(self, speech, kFrameLengths[j]));
80 }
81 }
82
83 // Construct a speech signal that will trigger the VAD in all modes. It is
84 // known that (i * i) will wrap around, but that doesn't matter in this case.
85 for (size_t i = 0; i < kMaxFrameLength; ++i) {
86 speech[i] = static_cast<int16_t>(i * i);
87 }
88 for (size_t j = 0; j < kFrameLengthsSize; ++j) {
89 if (ValidRatesAndFrameLengths(8000, kFrameLengths[j])) {
90 EXPECT_EQ(1, WebRtcVad_CalcVad8khz(self, speech, kFrameLengths[j]));
91 }
92 if (ValidRatesAndFrameLengths(16000, kFrameLengths[j])) {
93 EXPECT_EQ(1, WebRtcVad_CalcVad16khz(self, speech, kFrameLengths[j]));
94 }
95 if (ValidRatesAndFrameLengths(32000, kFrameLengths[j])) {
96 EXPECT_EQ(1, WebRtcVad_CalcVad32khz(self, speech, kFrameLengths[j]));
97 }
98 if (ValidRatesAndFrameLengths(48000, kFrameLengths[j])) {
99 EXPECT_EQ(1, WebRtcVad_CalcVad48khz(self, speech, kFrameLengths[j]));
100 }
101 }
102
103 free(self);
104 }
105 } // namespace test
106 } // namespace webrtc
107