• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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