/******************************************************************************************/
#ifndef __HAL_INTERFACE_AUDIO_H__
#define __HAL_INTERFACE_AUDIO_H__

#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include "hal.h"


/**
 * 音频回调参数结构定义
 */
typedef enum
{
    HAL_AUDIO_PCM = 0, // PCM
    HAL_AUDIO_AAC_LC,  // AAC LC
    HAL_AUDIO_AAC_ELD, // AAC ELD
    HAL_AUDIO_G711,    // G711
    HAL_AUDIO_AI,      // for AI
    HAL_AUDIO_MAX	   =9
} HAL_AUDIO_FORMAT;

typedef struct
{
    int8_t              chn;  		//音频流通道
    HAL_AUDIO_FORMAT    format;		//音频格式
    HAL_FRAME_TYPE      type;  		//帧类型 音频帧或视频帧
    uint32_t            ts; 		//时间戳
    uint32_t            seq;  		//帧序号
    uint32_t			local_time; //本地时间
    uint32_t            size;       //数据大小
    int8_t              data[0];      //音频数据
} audio_frame;


/**
 * 音频采样率定义.
 */
typedef enum
{
    HAL_AUDIO_SAMPLE_RATE_8000  = 8000,     /**< 8KHz采样率 */
    HAL_AUDIO_SAMPLE_RATE_16000 = 16000,    /**< 16KHz采样率 */
    HAL_AUDIO_SAMPLE_RATE_24000 = 24000,    /**< 24KHz采样率 */
    HAL_AUDIO_SAMPLE_RATE_32000 = 32000,    /**< 32KHz采样率 */
    HAL_AUDIO_SAMPLE_RATE_44100 = 44100,    /**< 44.1KHz采样率 */
    HAL_AUDIO_SAMPLE_RATE_48000 = 48000,    /**< 48KHz采样率 */
    HAL_AUDIO_SAMPLE_RATE_96000 = 96000,    /**< 96KHz采样率 */
} HAL_AUDIO_SAMPLERATE;

/**
 * 音频采样精度定义.
 */
typedef enum
{
    HAL_AUDIO_BIT_WIDTH_16 = 16,        /**< 16bit采样精度 */
} HAL_AUDIO_BITWIDTH;


/**
 * 音频声道模式定义.
 */
typedef enum
{
    HAL_AUDIO_SOUND_MODE_MONO   = 1,    /**< 单声道 */
    HAL_AUDIO_SOUND_MODE_STEREO = 2,    /**< 双声道 */
} HAL_AUDIO_SOUND_MODE;

/**
 * HAL_Audio音频格式常量定义, 适用HAL_Audio
 */
typedef enum
{
    HAL_AUDIO_INTERCOM = 0, // 对讲
	HAL_AUDIO_USER, 		// 用户
	HAL_AUDIO_ALARM,    	// 报警
    HAL_AUDIO_SYSTEM,  		// 系统  
    HAL_AUDIO_TYPEMAX
} HAL_AUDIO_TYPE;

/**
 * 音频输入输出设备属性.
 */
typedef struct
{
    HAL_AUDIO_SAMPLERATE samplerate;      /**< 音频采样率 */
    HAL_AUDIO_BITWIDTH 	 bitwidth;          /**< 音频采样精度 */
    HAL_AUDIO_SOUND_MODE soundmode;        /**< 音频声道模式 */
    int frame_num;                         /**< 缓存帧的数目, 取值范围:[2, MAX_AUDIO_FRAME_NUM] */
    int num_per_frame;                      /**< 每帧的采样点个数 */
    int chnCnt;                         /**< 支持的通道数目 */
} audio_attr_st;


typedef uint32_t(*hal_audio_frame_callback)(audio_frame * frame);
typedef uint32_t(*hal_audio_status_callback)(uint32_t status);

////////////////////////////////////////////////////////////
//
// HAL内部接口定义
//
////////////////////////////////////////////////////////////
/**
 * 函数：hal_audio_init
 * 声明：int32_t hal_audio_init(HAL_AUDIO_FORMAT format)
 * 功能：input and output init
 * 入参：无
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_init();

/**
 * 函数：hal_audio_deinit
 * 声明：int32_t hal_audio_deinit()
 * 功能：音频HAL去初始化, 释放资源
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_deinit();

/**
 * 函数：hal_audio_reg_cb
 * 声明：int32_t hal_audio_openstream(hal_audio_frame_callback cb, HAL_AUDIO_FORMAT format)
 * 功能：注册获取音频数据回调, 在hal_audio_init后调用
 * 入参：hal_audio_frame_callback cb, 获取音频数据回调函数
         HAL_AUDIO_FORMAT format,         音频数据格式
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_openstream(hal_audio_frame_callback cb, HAL_AUDIO_FORMAT format);

/**
 * 函数：hal_audio_dereg_cb
 * 声明：int32_t hal_audio_closestream(hal_audio_frame_callback cb, HAL_AUDIO_FORMAT format)
 * 功能：注销获取音频数据回调, 在hal_audio_init后调用
 * 入参：hal_audio_frame_callback cb, 获取音频数据回调函数
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_closestream(hal_audio_frame_callback cb);

/**
 * 函数：hal_audio_speaker_enable
 * 声明：int32_t hal_audio_speaker_enable(uint32_t enable)
 * 功能：打开/关闭Speaker PA
 * 入参：int32_t enable,                        0: Disable, 1: enable
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_speaker_enable(uint32_t enable);



// Speak volume and Gain
/**
 * 函数：hal_audio_setoutput_volume
 * 声明：int32_t hal_audio_setoutput_volume(uint32_t volume)
 * 功能：设置Speak音量, 在hal_audio_init后调用
 * 入参：int32_t volume,                     Speak音量值(数字增益),-30 - 120
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_setoutput_volume(uint32_t volume); // -30 - 120

/**
 * 函数：hal_audio_getoutput_volume
 * 声明：int32_t hal_audio_getoutput_volume(uint32_t * volume)
 * 功能：获取当前Speak音量值, 在hal_audio_init后调用
 * 出参：int32_t * volume,                     输出Speak当前音量值(数字增益), -30 - 120
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_getoutput_volume(uint32_t * volume);

/**
 * 函数：hal_audio_setoutput_gain
 * 声明：int32_t hal_audio_setoutput_gain(uint32_t Gain)
 * 功能：设置Speak增益, 在hal_audio_init后调用
 * 入参：uint32_t Gain,                         Speak增益(模拟增益), 0 - 31
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_setoutput_gain(uint32_t Gain);

/**
 * 函数：hal_audio_getoutput_gain
 * 声明：int32_t hal_audio_getoutput_gain(uint32_t * gain)
 * 功能：设置Speak增益, 在hal_audio_init后调用
 * 入参：uint32_t Gain,                         Speak增益(模拟增益), 0 - 31
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_getoutput_gain(uint32_t * gain);

/**
 * 函数：hal_audio_setoutput_volume_gain
 * 声明：int32_t hal_audio_setoutput_volume_gain(uint32_t percent)
 * 功能：设置Speak音量和增益, 在hal_audio_init后调用
 * 入参：uint32_t percent,                      Speak音量和增益百分比, 0 - 100
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_setoutput_volume_gain(uint32_t percent);

/**
 * 函数：hal_audio_getoutput_volume_gain
 * 声明：int32_t hal_audio_getoutput_volume_gain(uint32_t * percent)
 * 功能：设置Speak音量和增益, 在hal_audio_init后调用
 * 入参：uint32_t percent,                      Speak音量和增益百分比, 0 - 100
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_getoutput_volume_gain(uint32_t * percent);


// MIC volume and Gain
/**
 * 函数：hal_audio_setinput_volume_gain
 * 声明：int32_t hal_audio_setinput_volume_gain(uint32_t volume)
 * 功能：设置MIC增益, 在hal_audio_init后调用
 * 入参：int32_t volume,                       MIC增益,   -30 - 120
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_setinput_volume_gain(uint32_t volume);

// Set MIC Vol
/**
 * 函数：hal_audio_setinput_volume
 * 声明：int32_t hal_audio_setinput_volume(uint32_t volume)
 * 功能：设置MIC vol, 在hal_audio_init后调用
 * 入参：int32_t volume,                    MIC vol,   -30 - 120
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_setinput_volume(uint32_t volume);

// Get MIC Vol
/**
 * 函数：hal_audio_getinput_volume
 * 声明：int32_t hal_audio_getinput_volume(uint32_t *p_volume)
 * 功能：读取MIC vol, 在hal_audio_init后调用
 * 入参：int32_t *p_volume,                  MIC vol,   -30 - 120
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_getinput_volume(uint32_t *p_volume);

// Set MIC Gain
/**
 * 函数：hal_audio_setinput_gain
 * 声明：int32_t hal_audio_setinput_gain(uint32_t Gain)
 * 功能：设置MIC增益, 在hal_audio_init后调用
 * 入参：int32_t Gain,                      MIC增益,   -30 - 120
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_setinput_gain(uint32_t Gain);

// Get MIC Gain
/**
 * 函数：hal_audio_getinput_gain
 * 声明：int32_t hal_audio_getinput_gain(uint32_t *p_gain)
 * 功能：读取MIC增益, 在hal_audio_init后调用
 * 入参：int32_t *p_gain,                    MIC增益,   -30 - 120
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_getinput_gain(uint32_t *p_gain);

/**
 * 函数：hal_audio_getinput_volume_gain
 * 声明：int32_t hal_audio_getinput_volume_gain(uint32_t * p_volume, uint32_t * p_gain)
 * 功能：设置MIC增益, 在hal_audio_init后调用
 * 出参：int32_t * p_volume,                     MIC音量,    0 - 100
 *       uint32_t * p_gain,                    MIC增益,   -30 - 120
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_getinput_volume_gain(uint32_t * p_volume, uint32_t * p_gain);

// Speak MIC mute
/**
 * 函数：hal_audio_setoutput_mute
 * 声明：int32_t hal_audio_setoutput_mute(uint32_t mute)
 * 功能：设置Speak静音, 在hal_audio_init后调用
 * 入参：uint32_t mute,                         Speak静音开关,     0: 静音, 1: 不静音
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_setoutput_mute(uint32_t mute); // 0:enable mute, 1:disable mute

/**
 * 函数：hal_audio_getoutput_mute
 * 声明：int32_t hal_audio_getoutput_mute(uint32_t *p_mute)
 * 功能：获取Speak静音开关, 在hal_audio_init后调用
 * 出参：uint32_t *p_mute,                      Speak静音开关,	 0: 静音, 1: 不静音
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_getoutput_mute(uint32_t *p_mute); // 0:enable mute, 1:disable mute

/**
 * 函数：hal_audio_setinput_mute
 * 声明：hal_audio_setinput_mute(uint32_t mute)
 * 功能：设置MIC静音, 在hal_audio_init后调用
 * 入参：uint32_t mute,                        MIC静音开关,     0: 静音, 1: 不静音
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_setinput_mute(uint32_t mute);  // 0:enable mute, 1:disable mute

/**
 * 函数：hal_audio_getinput_mute
 * 声明：int32_t hal_audio_getinput_mute(uint32_t *p_mute)
 * 功能：获取MIC静音开关, 在hal_audio_init后调用
 * 出参：uint32_t *p_mute,                     MIC静音开关,    0: 静音, 1: 不静音
 * 返回：函数执行指示
 *       0  成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_getinput_mute(uint32_t *p_mute);  // 0:enable mute, 1:disable mute

/**
 * 函数：hal_audio_AEC_enable
 * 声明：int32_t hal_audio_AEC_enable(uint32_t enable)
 * 功能：回声消除功能开关, 在hal_audio_init后调用
 * 入参：uint32_t enable,                 1: 使能, 0: 禁用           
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_AEC_enable(uint32_t enable);  // 1:enable, 0:disable

/**
 * 函数：hal_audio_AEC_Query
 * 声明：int32_t hal_audio_AEC_Query(uint32_t * p_enable)
 * 功能：回声消除功能开关, 在hal_audio_init后调用                 
 * 出参：uint32_t * p_enable,                 1: 使能, 0: 禁用
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_AEC_get(uint32_t * p_enable);  // 1:enable, 0:disable

/**
 * 函数：hal_audio_NS_enable
 * 声明：int32_t hal_audio_NS_enable(uint32_t enable, uint32_t Level)
 * 功能：噪声抑制功能开关, 在hal_audio_init后调用
 * 入参：uint32_t enable,          0: 禁用, 1: 使能
 *       uint32_t Level,         噪声抑制等级,取值0~3,使能时有效
 *                           0: NS_LOW,       <低等级级别噪声抑制>
 *                           1: NS_MODERATE,  <中等级级别噪声抑制>
 *                           2: NS_HIGH,      <高等级级别噪声抑制>
 *                           3: NS_VERYHIGH   <最高等级级别噪声抑制>
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_NS_enable(uint32_t enable, uint32_t Level);  // 1:enable, 0:disable

/**
 * 函数：hal_audio_AGC_enable
 * 声明：int32_t hal_audio_AGC_enable(uint32_t enable, uint32_t Level)
 * 功能：音频增益功能开关, 在hal_audio_init后调用
 * 入参：uint32_t enable,          0: 禁用, 1: 使能
 *       uint32_t Level,         噪声抑制等级,取值0~3,使能时有效
 *                           0: NS_LOW,       <低等级级别噪声抑制>
 *                           1: NS_MODERATE,  <中等级级别噪声抑制>
 *                           2: NS_HIGH,      <高等级级别噪声抑制>
 *                           3: NS_VERYHIGH   <最高等级级别噪声抑制>
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_AGC_enable(uint32_t enable, uint32_t Level);  // 1:enable, 0:disable


/**
 * 函数：hal_audio_input_enable
 * 声明：int32_t hal_audio_input_enable(uint32_t enable)
 * 功能：音频输入通道(MIC)开关, 在hal_audio_init后调用
 * 入参：int32_t enable,           0: 禁用, 1: 使能
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_input_enable(uint32_t enable);  // 1:enable, 0:disable


////////////////////////////////////////////////////////////
//
// HAL Audio输出外部接口
//
////////////////////////////////////////////////////////////
/* HAL Audio接口定义 */


/**
 * hal_audio_isbusy
 * 声明：int32_t hal_audio_isbusy(uint32_t *p_isbusy)
 * 功能：判断当前音频播放Dev正在播放与否
 * 出参：int32_t *p_isbusy， 0停止播放状态，1播放中状态
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_isbusy(uint32_t *p_isbusy);

/**
 * hal_audio_setInout_samplerate
 * 声明：int32_t hal_audio_setInout_samplerate(HAL_AUDIO_SAMPLERATE samplerate)
 * 功能：设置输入MIC的采样率
 * 入参：HAL_AUDIO_SAMPLERATE samplerate,           
 * 出参：无
 * 返回：函数执行指示
 *       0   成功
 *       非0 失败, 错误码
 */
uint32_t hal_audio_set_input_samplerate(HAL_AUDIO_SAMPLERATE samplerate);



/**
 * 函数：hal_audio_play_aac
 * 声明：int32_t hal_audio_play_aac(int8_t *data, uint32_t size)
 * 功能：播放AAC-LC文件, 在hal_audio_init后调用
 * 入参：int8_t * data,				AAC-LC buffer
		 uint32_t size,				buffer 长度
 * 出参：无
 * 返回：函数执行指示
 *		 0	 成功
 *		 非0 失败, 错误码
 */
uint32_t hal_audio_play_aac(int8_t *data, uint32_t size);


/**
 * 函数: hal_audio_get_frame
 * 声明：int32_t hal_audio_get_frame(int8_t *data, uint32_t size)
 * 功能：取一帧录音
 * 入参：无
 * 出参：*frame
 * 返回：函数执行指示
 *		 0	 成功
 *		 非0 失败, 错误码
 */
uint32_t hal_audio_get_frame(audio_frame *frame);


#endif /* __HAL_INTERFACE_AUDIO_H__ */

