/*
 *  Copyright (c) 2016 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.
 */

#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_CORE_OPTIMIZED_METHODS_H_
#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_CORE_OPTIMIZED_METHODS_H_

#include <memory>

#include "webrtc/modules/audio_processing/aec/aec_core.h"
#include "webrtc/typedefs.h"

namespace webrtc {

typedef void (*WebRtcAecFilterFar)(
    int num_partitions,
    int x_fft_buf_block_pos,
    float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
    float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
    float y_fft[2][PART_LEN1]);
extern WebRtcAecFilterFar WebRtcAec_FilterFar;
typedef void (*WebRtcAecScaleErrorSignal)(float mu,
                                          float error_threshold,
                                          float x_pow[PART_LEN1],
                                          float ef[2][PART_LEN1]);
extern WebRtcAecScaleErrorSignal WebRtcAec_ScaleErrorSignal;
typedef void (*WebRtcAecFilterAdaptation)(
    int num_partitions,
    int x_fft_buf_block_pos,
    float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
    float e_fft[2][PART_LEN1],
    float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1]);
extern WebRtcAecFilterAdaptation WebRtcAec_FilterAdaptation;

typedef void (*WebRtcAecOverdrive)(float overdrive_scaling,
                                   const float hNlFb,
                                   float hNl[PART_LEN1]);
extern WebRtcAecOverdrive WebRtcAec_Overdrive;

typedef void (*WebRtcAecSuppress)(const float hNl[PART_LEN1],
                                  float efw[2][PART_LEN1]);
extern WebRtcAecSuppress WebRtcAec_Suppress;

typedef void (*WebRtcAecComputeCoherence)(const CoherenceState* coherence_state,
                                          float* cohde,
                                          float* cohxd);
extern WebRtcAecComputeCoherence WebRtcAec_ComputeCoherence;

typedef void (*WebRtcAecUpdateCoherenceSpectra)(int mult,
                                                bool extended_filter_enabled,
                                                float efw[2][PART_LEN1],
                                                float dfw[2][PART_LEN1],
                                                float xfw[2][PART_LEN1],
                                                CoherenceState* coherence_state,
                                                short* filter_divergence_state,
                                                int* extreme_filter_divergence);
extern WebRtcAecUpdateCoherenceSpectra WebRtcAec_UpdateCoherenceSpectra;

typedef int (*WebRtcAecPartitionDelay)(
    int num_partitions,
    float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1]);
extern WebRtcAecPartitionDelay WebRtcAec_PartitionDelay;

typedef void (*WebRtcAecStoreAsComplex)(const float* data,
                                        float data_complex[2][PART_LEN1]);
extern WebRtcAecStoreAsComplex WebRtcAec_StoreAsComplex;

typedef void (*WebRtcAecWindowData)(float* x_windowed, const float* x);
extern WebRtcAecWindowData WebRtcAec_WindowData;

}  // namespace webrtc

#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_CORE_OPTIMIZED_METHODS_H_
