| /* |
| * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #include <stdlib.h> |
| |
| #include "common_audio/vad/vad_unittest.h" |
| #include "test/gtest.h" |
| |
| extern "C" { |
| #include "common_audio/vad/vad_core.h" |
| } |
| |
| namespace webrtc { |
| namespace test { |
| |
| TEST_F(VadTest, InitCore) { |
| // Test WebRtcVad_InitCore(). |
| VadInstT* self = reinterpret_cast<VadInstT*>(malloc(sizeof(VadInstT))); |
| |
| // null pointer test. |
| EXPECT_EQ(-1, WebRtcVad_InitCore(nullptr)); |
| |
| // Verify return = 0 for non-null pointer. |
| EXPECT_EQ(0, WebRtcVad_InitCore(self)); |
| // Verify init_flag is set. |
| EXPECT_EQ(42, self->init_flag); |
| |
| free(self); |
| } |
| |
| TEST_F(VadTest, set_mode_core) { |
| VadInstT* self = reinterpret_cast<VadInstT*>(malloc(sizeof(VadInstT))); |
| |
| // TODO(bjornv): Add null pointer check if we take care of it in |
| // vad_core.c |
| |
| ASSERT_EQ(0, WebRtcVad_InitCore(self)); |
| // Test WebRtcVad_set_mode_core(). |
| // Invalid modes should return -1. |
| EXPECT_EQ(-1, WebRtcVad_set_mode_core(self, -1)); |
| EXPECT_EQ(-1, WebRtcVad_set_mode_core(self, 1000)); |
| // Valid modes should return 0. |
| for (size_t j = 0; j < kModesSize; ++j) { |
| EXPECT_EQ(0, WebRtcVad_set_mode_core(self, kModes[j])); |
| } |
| |
| free(self); |
| } |
| |
| // TODO(bugs.webrtc.org/345674542): Fix/enable. |
| #if defined(__has_feature) && __has_feature(undefined_behavior_sanitizer) |
| TEST_F(VadTest, DISABLED_CalcVad) { |
| #else |
| TEST_F(VadTest, CalcVad) { |
| #endif |
| VadInstT* self = reinterpret_cast<VadInstT*>(malloc(sizeof(VadInstT))); |
| int16_t speech[kMaxFrameLength]; |
| |
| // TODO(bjornv): Add null pointer check if we take care of it in |
| // vad_core.c |
| |
| // Test WebRtcVad_CalcVadXXkhz() |
| // Verify that all zeros in gives VAD = 0 out. |
| memset(speech, 0, sizeof(speech)); |
| ASSERT_EQ(0, WebRtcVad_InitCore(self)); |
| for (size_t j = 0; j < kFrameLengthsSize; ++j) { |
| if (ValidRatesAndFrameLengths(8000, kFrameLengths[j])) { |
| EXPECT_EQ(0, WebRtcVad_CalcVad8khz(self, speech, kFrameLengths[j])); |
| } |
| if (ValidRatesAndFrameLengths(16000, kFrameLengths[j])) { |
| EXPECT_EQ(0, WebRtcVad_CalcVad16khz(self, speech, kFrameLengths[j])); |
| } |
| if (ValidRatesAndFrameLengths(32000, kFrameLengths[j])) { |
| EXPECT_EQ(0, WebRtcVad_CalcVad32khz(self, speech, kFrameLengths[j])); |
| } |
| if (ValidRatesAndFrameLengths(48000, kFrameLengths[j])) { |
| EXPECT_EQ(0, WebRtcVad_CalcVad48khz(self, speech, kFrameLengths[j])); |
| } |
| } |
| |
| // Construct a speech signal that will trigger the VAD in all modes. It is |
| // known that (i * i) will wrap around, but that doesn't matter in this case. |
| for (size_t i = 0; i < kMaxFrameLength; ++i) { |
| speech[i] = static_cast<int16_t>(i * i); |
| } |
| for (size_t j = 0; j < kFrameLengthsSize; ++j) { |
| if (ValidRatesAndFrameLengths(8000, kFrameLengths[j])) { |
| EXPECT_EQ(1, WebRtcVad_CalcVad8khz(self, speech, kFrameLengths[j])); |
| } |
| if (ValidRatesAndFrameLengths(16000, kFrameLengths[j])) { |
| EXPECT_EQ(1, WebRtcVad_CalcVad16khz(self, speech, kFrameLengths[j])); |
| } |
| if (ValidRatesAndFrameLengths(32000, kFrameLengths[j])) { |
| EXPECT_EQ(1, WebRtcVad_CalcVad32khz(self, speech, kFrameLengths[j])); |
| } |
| if (ValidRatesAndFrameLengths(48000, kFrameLengths[j])) { |
| EXPECT_EQ(1, WebRtcVad_CalcVad48khz(self, speech, kFrameLengths[j])); |
| } |
| } |
| |
| free(self); |
| } |
| } // namespace test |
| } // namespace webrtc |