blob: 77db3d8ed23fdc450fe0a18010d496330c5644e7 [file] [log] [blame]
andrew@webrtc.orga7b57da2012-10-22 18:19:23 +00001/*
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
pbos@webrtc.orgabf0cd82013-05-27 09:49:58 +000013#include "testing/gtest/include/gtest/gtest.h"
14#include "webrtc/common_audio/vad/vad_unittest.h"
15#include "webrtc/typedefs.h"
andrew@webrtc.orga7b57da2012-10-22 18:19:23 +000016
17extern "C" {
pbos@webrtc.orgabf0cd82013-05-27 09:49:58 +000018#include "webrtc/common_audio/vad/vad_core.h"
andrew@webrtc.orga7b57da2012-10-22 18:19:23 +000019}
20
21namespace {
22
23TEST_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(NULL));
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
38TEST_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
57TEST_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 (int16_t i = 0; i < kMaxFrameLength; ++i) {
86 speech[i] = (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