
/************************************************* 
 * Copyright (C), Xiongmai Information Technologies Co., Ltd. 2018-2019. All rights reserved. 
 * 文件名: maque_audio.h
 * 作者@编号: XM R&D @02479
 * 版本: V1.00
 * 创建日期: 2019.02.18
 * 功能描述: 定义Xm MaQue 音频相关数据结构；声明对外接口。
 *		提供了录音、音频回放，编解码及输出格式设置，麦克风和扬声器音量设置或获取等。	
 *	录音流程：
 *		通过LibXmMaQue_AudioEnc_create()设置音频采集模块的输出格式，然后创建音频编码器，
 *		接收音频PCM数据开始编码。编码产生的音频帧通过该API注册的回调函数返回给调用者。
 *		音频编码器创建后，可以通过LibXmMaQue_AudioEnc_setFormat()改变编码参数。最后，
 * 		通过LibXmMaQue_AudioEnc_destroy()销毁。
 *	回放流程：
 *		通过LibXmMaQue_AudioDec_create()设置音频输出模块的参数，然后创建音频解码器，等待
 *	上层通过LibXmMaQue_AudioDec_decode()传入码流解码。音频解码器创建后，可以通过
 *	LibXmMaQue_AudioDec_setFormat()改变解码参数。最后，通过LibXmMaQue_AudioDec_destroy()
 *	销毁解码器。
 *
 * 修改历史:  
 ** 1.日期: 2019.02.18
 ** 修改者: XM R&D @02479
 ** 修改内容: 首次创建 。
 ** 2.日期: 2019.02.18
 ** 修改者: XM R&D @02479
 ** 修改内容: 完成了基础版。
 *************************************************/
 

#ifndef MAQUE_AUDIO_H
#define MAQUE_AUDIO_H


#include "maque_struct.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef enum
{
    MAQUE_AUDIO_SAMPLE_RATE_8000   = 8000,    /* 8K samplerate*/
    MAQUE_AUDIO_SAMPLE_RATE_12000  = 12000,   /* 12K samplerate*/
    MAQUE_AUDIO_SAMPLE_RATE_11025  = 11025,   /* 11.025K samplerate*/
    MAQUE_AUDIO_SAMPLE_RATE_16000  = 16000,   /* 16K samplerate*/
    MAQUE_AUDIO_SAMPLE_RATE_22050  = 22050,   /* 22.050K samplerate*/
    MAQUE_AUDIO_SAMPLE_RATE_24000  = 24000,   /* 24K samplerate*/
    MAQUE_AUDIO_SAMPLE_RATE_32000  = 32000,   /* 32K samplerate*/
    MAQUE_AUDIO_SAMPLE_RATE_44100  = 44100,   /* 44.1K samplerate*/
    MAQUE_AUDIO_SAMPLE_RATE_48000  = 48000,   /* 48K samplerate*/
    MAQUE_AUDIO_SAMPLE_RATE_64000  = 64000,   /* 64K samplerate*/
    MAQUE_AUDIO_SAMPLE_RATE_96000  = 96000,   /* 96K samplerate*/
    MAQUE_AUDIO_SAMPLE_RATE_BUTT,
} MaQueAudioSampleRate_e;

typedef enum
{
    MAQUE_AUDIO_SAMPLE_BITS_8   = 0,   /* 8bit width */
    MAQUE_AUDIO_SAMPLE_BITS_16  = 1,   /* 16bit width*/
    MAQUE_AUDIO_SAMPLE_BITS_24  = 2,   /* 24bit width*/
    MAQUE_AUDIO_SAMPLE_BITS_BUTT,
} MaQueAudioSampleBits_e;


/// 音频编码类型
typedef enum
{
	MAQUE_AUDIO_ENCODE_NONE = 0,
	MAQUE_AUDIO_ENCODE_G729_8KBIT,
	MAQUE_AUDIO_ENCODE_G726_16KBIT,
	MAQUE_AUDIO_ENCODE_G726_24KBIT,
	MAQUE_AUDIO_ENCODE_G726_32KBIT,
	MAQUE_AUDIO_ENCODE_G726_40KBIT, 
	MAQUE_AUDIO_ENCODE_PCM_8TO16BIT,
	MAQUE_AUDIO_ENCODE_PCM_ALAW,
	MAQUE_AUDIO_ENCODE_PCM_ULAW,
	MAQUE_AUDIO_ENCODE_ADPCM8K16BIT,
	MAQUE_AUDIO_ENCODE_ADPCM16K16BIT,
	MAQUE_AUDIO_ENCODE_G711_ALAW,
	MAQUE_AUDIO_ENCODE_MPEG2_LAYER1,
	MAQUE_AUDIO_ENCODE_AMR8K16BIT,
	MAQUE_AUDIO_ENCODE_G711_ULAW,
	MAQUE_AUDIO_ENCODE_IMA_ADPCM_8K16BIT,
	MAQUE_AUDIO_ENCODE_AAC_16BIT,
	MAQUE_AUDIO_ENCODE_TYPES_NR
} MaQueAudioEncodeType_e;

typedef struct 
{
	MaQueAudioEncodeType_e eEncType;   	  ///< 编码方式
	MaQueAudioSampleRate_e eSampleRate;   ///< 采样率
	MaQueAudioSampleBits_e eSampleBits;   ///< 采样的位深
	XM_S32 bitrateKb;	   				  ///< 码流大小，kbps为单位，比如192kbps，128kbps
}MaQueAudioEncodeFormat_s;

typedef MaQueAudioEncodeFormat_s MaQueAudioDecodeFormat_s;

#if  0
typedef struct {
	XM_S32 param1;
	XM_S32 param2;
	XM_S32 param3;
} MaQueAudioTrackSensitivity_s;

typedef struct{
	XM_U32 module; // 0: codec  1:dsp
	XM_U32 reg;   // 寄存器地址
	XM_U32 value; //寄存器的值
} MaQueWriteRT567XReg_s;
#endif

typedef struct
{
	XM_U32 nChnTotalNum;
	XM_U32 nChnFreeNum;
	XM_U32 nChnBusyNum;
} MaQueAoChnState_s;

typedef struct
{
	XM_S32 bVqeEnable;	/* Vqe 总开关*/
	XM_S32 bAecEnable;	/* 回声消除*/
	XM_S32 bAnrEnable;	/* 降噪*/
	XM_S32 bAgcEnable;	/* 自动增益*/
	XM_S32 aReserved[8];
} MaQueVqeCfg_s;

/* 音频码流帧信息。*/
typedef struct 
{
	XM_U8 *pData;     /* 指向保存音频编码码流数据的指针。*/
	XM_U32 nDataLen;  /* pData中音频码流数据长度，单位为：字节。*/
	MaQueTimeStamp_s stTimeStamp;  /* 音频编码码流获取时系统时间。*/
	XM_U64 pts;	     /* 音频编码码流获取时相对1970年1月1日的时间，单位为：us。*/
	XM_U8 aHeader[8];	/* 保留，供厂家内部调试用。*/
	XM_U8 aReserved[8];	  /* 保留，用作以后扩展。*/
} MaQueAudioFrameInfo_s;

typedef XM_S32(*MaQueAudioGetStreamCallbackFuncPtr) (XM_VOID *pUserArg, MaQueAudioFrameInfo_s *pstFrameInfo);


 /*
【功能描述】
	使能和设置麦克音量。
【参数】
	 参数名称		描述									
	enable [in]	 麦克使能标识。1：使能；0：关闭。				
	volume [in]	 麦克音量。
					bit[31:16]: 保留；
					bit[15:8]: 数字增益[0，0x7F] 对应30dB到-97dB；
					bit[7:0]: 模拟增益[0,50] 对应0到50dB。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Audio_setMicVolume(XM_S32 enable, XM_S32 volume);

/*
【功能描述】
	获取麦克音量。
【参数】
	 参数名称			描述	
	pEnable	[out]	保存麦克使能标识。1：使能；0：关闭。
	pVolume	[out]	保存麦克音量。
						bit[31:16]: 保留；
						bit[15:8]: 数字增益[0，0x7F] 对应6dB到-97dB；
						bit[7:0]: 模拟增益[0,50] 对应0到50dB。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Audio_getMicVolume(XM_S32 *pEnable, XM_S32 *pVolume);

/*
【功能描述】
	使能和设置扬声器音量。
【参数】
	 参数名称		描述	
	enable [in]	 使能扬声器。
	volume [in]  扬声器音量：
					bit[31:16]: 保留；
					bit[7:0]: 增益[0，0x7F] 对应6dB到-121dB。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Audio_setSpeakerVolume(XM_S32 enable,XM_S32 volume);

/*
【功能描述】
	获取扬声器音量。
【参数】
	  参数名称		 	描述	
	pEnable	[out] 	保存扬声器使能标识。1：使能；0：关闭。
	pVolume	[out]	保存扬声器音量。
						bit[31:16]: 保留；
						bit[7:0]: 数字增益[0，0x7F] 对应6dB到-121dB。	输出
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码
*/
XM_S32 LibXmMaQue_Audio_getSpeakerVolume(XM_S32 *pEnable, XM_S32 *pVolume);

/*
【功能描述】
	创建音频编码器。
【参数】
	  参数名称			描述
	channel		[in]	音频编码器通道号，从0开始。目前暂时只支持0。
	pstFormat	[in]	创建音频编码器的参数。
	pCallbackFuncPtr [in]	调用者传入的获取音频编码码流的回调函数。
	pCallbackArg [in]	调用者传入的私有数据，将会传给回调函数的第一个参数，可在回调函数中使用。
【返回值】
	XM_SUCCESS	成功。
	其它	失败，请参考错误码。
【注意】
	目前pstFormat中,
	eEncType只支持：
		MAQUE_AUDIO_ENCODE_G711_ALAW和MAQUE_AUDIO_ENCODE_G711_ULAW。
    eSampleRate：只支持MAQUE_AUDIO_SAMPLE_RATE_8000。
*/
XM_S32 LibXmMaQue_AudioEnc_create(XM_S32 channel, MaQueAudioEncodeFormat_s *pstFormat, 
			MaQueAudioGetStreamCallbackFuncPtr pCallbackFuncPtr, XM_VOID *pCallbackArg);

/*
【功能描述】
	设置音频编码器参数。创建编码器后，在编码过程中，可以随时改变编码参数。
【参数】
	  参数名称			描述	
	channel	[in]	音频编码器通道号，从0开始。目前暂时只支持0。
	pstFormat [in]	设置音频编码器的参数。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
【注意】
	LibXmMaQue_AudioEnc_create()调用成功后，再调用本API才有效。
*/
XM_S32 LibXmMaQue_AudioEnc_setFormat(XM_S32 channel, MaQueAudioEncodeFormat_s *pstFormat);

/*
【功能描述】
	销毁音频编码器，释放其分配的所有资源。
【参数】
	  参数名称			描述
	channel	[in]	音频编码器通道号，从0开始。目前暂时只支持0。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
【注意】
	在LibXmMaQue_AudioEnc_create()调用成功后，再调用才有效。
*/
XM_S32 LibXmMaQue_AudioEnc_destroy(XM_S32 channel);

/*
【功能描述】
	创建音频解码器。

【参数】
	  参数名称			描述
	channel	[in]	音频解码器通道号，从0开始。目前暂时只支持0。
	pstFormat [in]	创建音频解码器的参数。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
【注意】
	目前pstFormat中eEncType只支持：
		MAQUE_AUDIO_ENCODE_G711_ALAW和MAQUE_AUDIO_ENCODE_G711_ULAW。
*/
XM_S32 LibXmMaQue_AudioDec_create(XM_S32 channel, MaQueAudioDecodeFormat_s *pstFormat);

/*
【功能描述】
	设置音频解码器参数。解码器创建成功后，在解码过程中，可以随时改变解码参数。

【参数】
	  参数名称		描述
	channel	[in]	音频解码器通道号，从0开始。目前暂时只支持0。
	pstFormat [in]	设置音频编码器的参数。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
【注意】
	在LibXmMaQue_AudioDec_create()调用成功后，再调用才有效。在解码过程中，
	随时改变解码参数，是允许的，但频繁修改参数会影响编码效率。
*/
XM_S32 LibXmMaQue_AudioDec_setFormat(XM_S32 channel, MaQueAudioDecodeFormat_s *pstFormat);

/*
【功能描述】
	给音频解码器送入需要解码的音频码流数据。

【参数】
	  参数名称			描述
	channel	[in]	音频解码器通道号，从0开始。目前暂时只支持0。
	pBuffer	[in]	存有需要解码的音频码流数据。
	nLen	[in]	pBuffer中存放的音频码流数据长度。单位为：字节。强烈建议长度按帧对齐，
					这样可减少中间复制过程，提交效率。一般g711a或g711u每帧80个采样，位深
					2字节，即160字节，故最好按160整数倍传入。
【返回值】
	XM_SUCCESS		成功。
	XM_AGAIN		底层buffer已满，建议延时几毫秒后，重新传入。
	其它			失败，请参考错误码。
【注意】
	在LibXmMaQue_AudioDec_create()调用成功后，再调用才有效。
*/
XM_S32 LibXmMaQue_AudioDec_decode(XM_S32 channel, XM_U8 *pBuffer, XM_S32 nLen);

/*
【功能描述】
	获取音频解码器缓存队列总的仍没有解码的数据长度。主要用于结束音频解码时，判断解码器是否真正解
	码完成。要判断音频输出通道是否播放完成，可用下面将要介绍的"LibXmMaQue_AudioOut_getChnStat()"。
【参数】
	  参数名称			描述
	channel	[in]	音频解码器通道号，从0开始。目前暂时只支持0。
【返回值】
	>= 0		音频解码器缓存队列总的仍没有解码的数据长度。
	其它		失败，请参考错误码。
【注意】
	在LibXmMaQue_AudioDec_create()调用成功后，再调用才有效。
*/
XM_S32 LibXmMaQue_AudioDec_getBufferedLen(XM_S32 channel);

/*
【功能描述】
	销毁音频解码器，释放其分配的所有资源。
【参数】
	  参数名称			描述
	channel	[in]	音频解码器通道号，从0开始。目前暂时只支持0。
【返回值】
	XM_SUCCESS	成功。
	其它	失败，请参考错误码。
【注意】
	在LibXmMaQue_AudioDec_create()调用成功后，再调用才有效。
*/
XM_S32 LibXmMaQue_AudioDec_destroy(XM_S32 channel);

/*
【功能描述】
	获取音频输出通道的状态信息。可查询音频输出通道占用缓冲块数是否为0，判断是否当前解码输出完成。
【参数】
	  参数名称			描述
	channel	[in]	音频解码器通道号，从0开始。目前暂时只支持0。
	pstStatus [out]	音频输出通道的状态信息。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
【注意】
	在LibXmMaQue_AudioDec_create()调用成功后，再调用才有效。
*/
XM_S32 LibXmMaQue_AudioOut_getChnStat(XM_S32 channel, MaQueAoChnState_s *pstStatus);

/*
【功能描述】
	发送PCM数据到音频输出通道播放。
【参数】
	  参数名称			描述
	channel	[in]	音频解码器通道号，从0开始。目前暂时只支持0。
	pData [in]		PCM音频数据。	输入
	size [in]		pData所指的有效数据长度。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
【注意】
	在LibXmMaQue_AudioDec_create()调用成功后，再调用才有效。
*/
XM_S32 LibXmMaQue_AudioOut_sendPcmData(XM_S32 channel, XM_U8 *pData, XM_S32 size);

/*
【功能描述】
	设置音频输入VQE属性开关。
【参数】
	  参数名称			描述
	channel	[in]	音频解码器通道号，从0开始。目前暂时只支持0。
	pstMaQueVqeCfg [in] VQE 开关配置，参考: MaQueVqeCfg_s
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
【注意】
	LibXmMaQue_AudioEnc_create()调用成功后，再调用本API才有效。
*/
XM_S32 LibXmMaQue_Audio_setAiVqeAttr(XM_S32 channel, MaQueVqeCfg_s *pstMaQueVqeCfg);

/*
【功能描述】
	获取音频输入VQE属性开关。
【参数】
	  参数名称			描述
	channel	[in]	音频解码器通道号，从0开始。目前暂时只支持0。
	pstMaQueVqeCfg [out] VQE 开关配置，参考: MaQueVqeCfg_s
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
【注意】
	LibXmMaQue_AudioEnc_create()调用成功后，再调用本API才有效。
*/
XM_S32 LibXmMaQue_Audio_getAiVqeAttr(XM_S32 channel, MaQueVqeCfg_s *pstMaQueVqeCfg);

#ifdef __cplusplus
}
#endif

#endif //MAQUE_AUDIO_H

