1 /*
2 * Copyright (c) 2014 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/common_audio/vad/include/vad.h"
12
13 #include "webrtc/base/checks.h"
14
15 namespace webrtc {
16
17 namespace {
18
19 class VadImpl final : public Vad {
20 public:
VadImpl(Aggressiveness aggressiveness)21 explicit VadImpl(Aggressiveness aggressiveness)
22 : handle_(nullptr), aggressiveness_(aggressiveness) {
23 Reset();
24 }
25
~VadImpl()26 ~VadImpl() override { WebRtcVad_Free(handle_); }
27
VoiceActivity(const int16_t * audio,size_t num_samples,int sample_rate_hz)28 Activity VoiceActivity(const int16_t* audio,
29 size_t num_samples,
30 int sample_rate_hz) override {
31 int ret = WebRtcVad_Process(handle_, sample_rate_hz, audio, num_samples);
32 switch (ret) {
33 case 0:
34 return kPassive;
35 case 1:
36 return kActive;
37 default:
38 RTC_DCHECK(false) << "WebRtcVad_Process returned an error.";
39 return kError;
40 }
41 }
42
Reset()43 void Reset() override {
44 if (handle_)
45 WebRtcVad_Free(handle_);
46 handle_ = WebRtcVad_Create();
47 RTC_CHECK(handle_);
48 RTC_CHECK_EQ(WebRtcVad_Init(handle_), 0);
49 RTC_CHECK_EQ(WebRtcVad_set_mode(handle_, aggressiveness_), 0);
50 }
51
52 private:
53 VadInst* handle_;
54 Aggressiveness aggressiveness_;
55 };
56
57 } // namespace
58
CreateVad(Vad::Aggressiveness aggressiveness)59 rtc::scoped_ptr<Vad> CreateVad(Vad::Aggressiveness aggressiveness) {
60 return rtc::scoped_ptr<Vad>(new VadImpl(aggressiveness));
61 }
62
63 } // namespace webrtc
64