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