standalone_vad_unittest.cc revision 518c683f3e413523a458a94b533274bd7f29992d
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 "webrtc/modules/audio_processing/vad/standalone_vad.h"
12
13#include <string.h>
14
15#include "testing/gtest/include/gtest/gtest.h"
16#include "webrtc/base/scoped_ptr.h"
17#include "webrtc/modules/interface/module_common_types.h"
18#include "webrtc/test/testsupport/fileutils.h"
19#include "webrtc/test/testsupport/gtest_disable.h"
20
21namespace webrtc {
22
23TEST(StandaloneVadTest, Api) {
24  rtc::scoped_ptr<StandaloneVad> vad(StandaloneVad::Create());
25  int16_t data[kLength10Ms] = {0};
26
27  // Valid frame length (for 32 kHz rate), but not what the VAD is expecting.
28  EXPECT_EQ(-1, vad->AddAudio(data, 320));
29
30  const int kMaxNumFrames = 3;
31  double p[kMaxNumFrames];
32  for (int n = 0; n < kMaxNumFrames; n++)
33    EXPECT_EQ(0, vad->AddAudio(data, kLength10Ms));
34
35  // Pretend |p| is shorter that it should be.
36  EXPECT_EQ(-1, vad->GetActivity(p, kMaxNumFrames - 1));
37
38  EXPECT_EQ(0, vad->GetActivity(p, kMaxNumFrames));
39
40  // Ask for activity when buffer is empty.
41  EXPECT_EQ(-1, vad->GetActivity(p, kMaxNumFrames));
42
43  // Should reset and result in one buffer.
44  for (int n = 0; n < kMaxNumFrames + 1; n++)
45    EXPECT_EQ(0, vad->AddAudio(data, kLength10Ms));
46  EXPECT_EQ(0, vad->GetActivity(p, 1));
47
48  // Wrong modes
49  EXPECT_EQ(-1, vad->set_mode(-1));
50  EXPECT_EQ(-1, vad->set_mode(4));
51
52  // Valid mode.
53  const int kMode = 2;
54  EXPECT_EQ(0, vad->set_mode(kMode));
55  EXPECT_EQ(kMode, vad->mode());
56}
57
58TEST(StandaloneVadTest, DISABLED_ON_IOS(ActivityDetection)) {
59  rtc::scoped_ptr<StandaloneVad> vad(StandaloneVad::Create());
60  const size_t kDataLength = kLength10Ms;
61  int16_t data[kDataLength] = {0};
62
63  FILE* pcm_file =
64      fopen(test::ResourcePath("audio_processing/agc/agc_audio", "pcm").c_str(),
65            "rb");
66  ASSERT_TRUE(pcm_file != NULL);
67
68  FILE* reference_file = fopen(
69      test::ResourcePath("audio_processing/agc/agc_vad", "dat").c_str(), "rb");
70  ASSERT_TRUE(reference_file != NULL);
71
72  // Reference activities are prepared with 0 aggressiveness.
73  ASSERT_EQ(0, vad->set_mode(0));
74
75  // Stand-alone VAD can operate on 1, 2 or 3 frames of length 10 ms. The
76  // reference file is created for 30 ms frame.
77  const int kNumVadFramesToProcess = 3;
78  int num_frames = 0;
79  while (fread(data, sizeof(int16_t), kDataLength, pcm_file) == kDataLength) {
80    vad->AddAudio(data, kDataLength);
81    num_frames++;
82    if (num_frames == kNumVadFramesToProcess) {
83      num_frames = 0;
84      int referece_activity;
85      double p[kNumVadFramesToProcess];
86      EXPECT_EQ(1u, fread(&referece_activity, sizeof(referece_activity), 1,
87                          reference_file));
88      int activity = vad->GetActivity(p, kNumVadFramesToProcess);
89      EXPECT_EQ(referece_activity, activity);
90      if (activity != 0) {
91        // When active, probabilities are set to 0.5.
92        for (int n = 0; n < kNumVadFramesToProcess; n++)
93          EXPECT_EQ(0.5, p[n]);
94      } else {
95        // When inactive, probabilities are set to 0.01.
96        for (int n = 0; n < kNumVadFramesToProcess; n++)
97          EXPECT_EQ(0.01, p[n]);
98      }
99    }
100  }
101  fclose(reference_file);
102  fclose(pcm_file);
103}
104}  // namespace webrtc
105