/*
 * Copyright 2016 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "cobalt/speech/endpointer_delegate.h"

#include "base/time.h"

namespace cobalt {
namespace speech {

namespace {
const int kEndPointerEstimationTimeInMillisecond = 300;
// If used in noisy conditions, the endpointer should be started and run in the
// EnvironmentEstimation mode, for at least 200ms, before switching to
// UserInputMode.
COMPILE_ASSERT(kEndPointerEstimationTimeInMillisecond >= 200,
               in_environment_estimation_mode_for_at_least_200ms);
}  // namespace

EndPointerDelegate::EndPointerDelegate(int sample_rate)
    : endpointer_(sample_rate),
      num_samples_recorded_(0),
      is_first_time_sound_started_(false) {}

EndPointerDelegate::~EndPointerDelegate() {}

void EndPointerDelegate::Start() {
  num_samples_recorded_ = 0;
  is_first_time_sound_started_ = false;

  endpointer_.StartSession();
  endpointer_.SetEnvironmentEstimationMode();
}

void EndPointerDelegate::Stop() { endpointer_.EndSession(); }

bool EndPointerDelegate::IsFirstTimeSoundStarted(
    const ShellAudioBus& audio_bus) {
  if (is_first_time_sound_started_) {
    return false;
  }

  num_samples_recorded_ += static_cast<int>(audio_bus.frames());
  if (endpointer_.IsEstimatingEnvironment() &&
      num_samples_recorded_ * 1000 / endpointer_.sample_rate() >
          kEndPointerEstimationTimeInMillisecond) {
    // Switch to user input mode.
    endpointer_.SetUserInputMode();
  }

  endpointer_.ProcessAudio(audio_bus, NULL);
  int64_t ep_time;
  EpStatus status = endpointer_.Status(&ep_time);
  if (status == EP_POSSIBLE_ONSET) {
    is_first_time_sound_started_ = true;
  }

  return is_first_time_sound_started_;
}

}  // namespace speech
}  // namespace cobalt
