Home | History | Annotate | Download | only in vad
      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 
     17 extern "C" {
     18 #include "webrtc/common_audio/vad/vad_core.h"
     19 }
     20 
     21 namespace {
     22 
     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(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 
     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 
     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 (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