/*
 *  Copyright (c) 2014 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 "webrtc/common_audio/vad/include/vad.h"

#include "webrtc/base/checks.h"

namespace webrtc {

namespace {

class VadImpl final : public Vad {
 public:
  explicit VadImpl(Aggressiveness aggressiveness)
      : handle_(nullptr), aggressiveness_(aggressiveness) {
    Reset();
  }

  ~VadImpl() override { WebRtcVad_Free(handle_); }

  Activity VoiceActivity(const int16_t* audio,
                         size_t num_samples,
                         int sample_rate_hz) override {
    int ret = WebRtcVad_Process(handle_, sample_rate_hz, audio, num_samples);
    switch (ret) {
      case 0:
        return kPassive;
      case 1:
        return kActive;
      default:
        RTC_DCHECK(false) << "WebRtcVad_Process returned an error.";
        return kError;
    }
  }

  void Reset() override {
    if (handle_)
      WebRtcVad_Free(handle_);
    handle_ = WebRtcVad_Create();
    RTC_CHECK(handle_);
    RTC_CHECK_EQ(WebRtcVad_Init(handle_), 0);
    RTC_CHECK_EQ(WebRtcVad_set_mode(handle_, aggressiveness_), 0);
  }

 private:
  VadInst* handle_;
  Aggressiveness aggressiveness_;
};

}  // namespace

rtc::scoped_ptr<Vad> CreateVad(Vad::Aggressiveness aggressiveness) {
  return rtc::scoped_ptr<Vad>(new VadImpl(aggressiveness));
}

}  // namespace webrtc
