/*
 *  Copyright (c) 2017 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/modules/audio_processing/aec3/output_selector.h"

#include <algorithm>
#include <numeric>

#include "webrtc/rtc_base/checks.h"

namespace webrtc {
namespace {

// Performs the transition between the signals in a smooth manner.
void SmoothFrameTransition(bool from_y_to_e,
                           rtc::ArrayView<const float> e,
                           rtc::ArrayView<float> y) {
  RTC_DCHECK_LT(0u, e.size());
  RTC_DCHECK_EQ(y.size(), e.size());

  const float change_factor = (from_y_to_e ? 1.f : -1.f) / e.size();
  float averaging = from_y_to_e ? 0.f : 1.f;
  for (size_t k = 0; k < e.size(); ++k) {
    y[k] += averaging * (e[k] - y[k]);
    averaging += change_factor;
  }
  RTC_DCHECK_EQ(from_y_to_e ? 1.f : 0.f, averaging);
}

}  // namespace

OutputSelector::OutputSelector() = default;

OutputSelector::~OutputSelector() = default;

void OutputSelector::FormLinearOutput(
    bool use_subtractor_output,
    rtc::ArrayView<const float> subtractor_output,
    rtc::ArrayView<float> capture) {
  RTC_DCHECK_EQ(subtractor_output.size(), capture.size());
  rtc::ArrayView<const float>& e_main = subtractor_output;
  rtc::ArrayView<float> y = capture;

  if (use_subtractor_output != use_subtractor_output_) {
    use_subtractor_output_ = use_subtractor_output;
    SmoothFrameTransition(use_subtractor_output_, e_main, y);
  } else if (use_subtractor_output_) {
    std::copy(e_main.begin(), e_main.end(), y.begin());
  }
}

}  // namespace webrtc
