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 "testing/gtest/include/gtest/gtest.h"
14#include "webrtc/common_audio/vad/vad_unittest.h"
15#include "webrtc/typedefs.h"
16
17extern "C" {
18#include "webrtc/common_audio/vad/vad_core.h"
19}
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
106