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
15namespace webrtc {
16
17namespace {
18
19class VadImpl final : public Vad {
20 public:
21  explicit VadImpl(Aggressiveness aggressiveness)
22      : handle_(nullptr), aggressiveness_(aggressiveness) {
23    Reset();
24  }
25
26  ~VadImpl() override { WebRtcVad_Free(handle_); }
27
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
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
59rtc::scoped_ptr<Vad> CreateVad(Vad::Aggressiveness aggressiveness) {
60  return rtc::scoped_ptr<Vad>(new VadImpl(aggressiveness));
61}
62
63}  // namespace webrtc
64