/***************************************************************************
 *
 * Copyright 2015-2019 BES.
 * All rights reserved. All unpublished rights reserved.
 *
 * No part of this work may be used or reproduced in any form or by any
 * means, or stored in a database or retrieval system, without prior written
 * permission of BES.
 *
 * Use of this work is governed by a license granted by BES.
 * This work contains confidential and proprietary information of
 * BES. which is protected by copyright, trade secret,
 * trademark and other intellectual property rights.
 *
 ****************************************************************************/
#ifndef __DUAL_MIC_DENOISE_H__
#define __DUAL_MIC_DENOISE_H__

#ifdef __cplusplus
extern "C" {
#endif

#define DUAL_MIC_DENOISE_GET_CALIBRATION_COEF_LEN        (0)
#define DUAL_MIC_DENOISE_GET_CALIBRATION_COEF            (1)
#define DUAL_MIC_DENOISE_SET_CALIBRATION_COEF            (2)

typedef struct {
    int   bypass;
    float alpha_h;
    float alpha_slow;
    float alpha_fast;
    float thegma;
    float thre_corr;
    float thre_filter_diff;
    float cal_left_gain;
    float cal_right_gain;
    int   delay_mono_sample;
    int   wnr_enable;
} DUAL_MIC_DENOISE_CFG_T;

/**
 * @brief      Initialization
 *
 * @param      alloc_ext  The allocate extent RAM
 * @param      cfg        The configuration set parameter
 */
void dual_mic_denoise_init(int32_t sample_rate, int32_t frame_size, const DUAL_MIC_DENOISE_CFG_T *cfg, void* (* alloc_ext)(int));

/**
 * @brief      Run
 *
 * @param      in    input sample buffer
 *                   sample rate: 16k;
 *                   sample bit: 16; 
 *                   channel num: 2; 
 *                   LRLRLR......: Left: main mic, Right: assist mic
 * @param      out   output sample buffer
 *                   sample rate: 16k;
 *                   sample bit: 16; 
 *                   channel num: 1;
 * @param[in]  len   The length is sample number
 */
void dual_mic_denoise_run(short *in, short len, short *out);

/**
 * @brief     Calibrate left and right gain
 *
 * @param      in    Same as dual_mic_denoise_run definition
 * @param[in]  len   Same as dual_mic_denoise_run definition
 * @param[out] cfg   Return calibrate configure parameter
 */
void dual_mic_denoise_Cal_Gain(short *in, short len, DUAL_MIC_DENOISE_CFG_T *cfg);

/**
 * @brief      Oppose initialization 
 */
void dual_mic_denoise_deinit(void);

int dual_mic_denoise_ctl(int ctl, void *ptr);

#ifdef __cplusplus
}
#endif

#endif