329 lines
12 KiB
C
329 lines
12 KiB
C
|
#ifndef _EQ_API_H_
|
|||
|
#define _EQ_API_H_
|
|||
|
|
|||
|
#include "typedef.h"
|
|||
|
#include "asm/hw_eq.h"
|
|||
|
#include "media/audio_stream.h"
|
|||
|
#include "system/timer.h"
|
|||
|
#include "system/init.h"
|
|||
|
|
|||
|
#define EQ_CHANNEL_MAX 2
|
|||
|
|
|||
|
#define EQ_SR_IDX_MAX 9
|
|||
|
|
|||
|
#define AUDIO_EQ_HIGH 2
|
|||
|
#define AUDIO_EQ_BASS 3
|
|||
|
|
|||
|
/*eq type*/
|
|||
|
typedef enum {
|
|||
|
EQ_MODE_NORMAL = 0,
|
|||
|
EQ_MODE_ROCK,
|
|||
|
EQ_MODE_POP,
|
|||
|
EQ_MODE_CLASSIC,
|
|||
|
EQ_MODE_JAZZ,
|
|||
|
EQ_MODE_COUNTRY,
|
|||
|
EQ_MODE_CUSTOM,//自定义
|
|||
|
EQ_MODE_MAX,
|
|||
|
} EQ_MODE;
|
|||
|
|
|||
|
/*eq type*/
|
|||
|
typedef enum {
|
|||
|
EQ_TYPE_FILE = 0x01,
|
|||
|
EQ_TYPE_ONLINE,
|
|||
|
EQ_TYPE_MODE_TAB,
|
|||
|
} EQ_TYPE;
|
|||
|
|
|||
|
#define audio_eq_filter_info eq_coeff_info
|
|||
|
|
|||
|
typedef int (*audio_eq_filter_cb)(void *eq, int sr, struct audio_eq_filter_info *info);
|
|||
|
|
|||
|
struct audio_eq_param {
|
|||
|
u8 no_wait : 1; //是否使能异步eq, 1:使能 0:不使能
|
|||
|
u8 max_nsection : 6;//最大的eq段数,根据使用填写,要小于等于EQ_SECTION_MAX
|
|||
|
u8 nsection : 6; //实际需要的eq段数,需小于等于max_nsection
|
|||
|
u8 out_32bit : 1; //是否支持32bit eq输出,仅在 no_wait 写1时,out_32bit 才能写1
|
|||
|
u8 channels : 2; //通道数
|
|||
|
u8 fade: 1; //系数更新是否需要淡入
|
|||
|
float fade_step; //淡入步进(0.1f~1.0f)
|
|||
|
audio_eq_filter_cb cb;//获取eq系数的回调函数
|
|||
|
u32 eq_name; //eq名字,在线调试时,用于区分不同eq更新系数 播歌一般写song_eq_mode
|
|||
|
u32 sr; //采样率,更根据当前数据实际采样率填写
|
|||
|
|
|||
|
float global_gain;
|
|||
|
struct eq_seg_info *seg;//
|
|||
|
float global_gain_r;
|
|||
|
struct eq_seg_info *seg_r;//
|
|||
|
|
|||
|
|
|||
|
void *priv; //私有指针
|
|||
|
int (*output)(void *priv, void *data, u32 len);//异步eq输出回调,节点方式使用时,output 配NULL
|
|||
|
void (*irq_callback)(void *priv);//总段回调函数,数据流激活
|
|||
|
};
|
|||
|
struct audio_eq_fade {
|
|||
|
u8 nsection;
|
|||
|
u16 timer;
|
|||
|
float cur_global_gain;
|
|||
|
float use_global_gain;
|
|||
|
struct eq_seg_info *cur_seg;
|
|||
|
struct eq_seg_info *use_seg;
|
|||
|
} ;
|
|||
|
|
|||
|
struct high_bass {
|
|||
|
int freq; //频率写0, 内部会用默认125hz 和12khz
|
|||
|
int gain; //增益范围 -12~12
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
#ifdef CONFIG_EQ_SUPPORT_ASYNC
|
|||
|
struct audio_eq_async {
|
|||
|
u16 ptr;
|
|||
|
u16 len;
|
|||
|
u16 buf_len;
|
|||
|
u8 clear;
|
|||
|
u8 out_stu;
|
|||
|
char *buf;
|
|||
|
};
|
|||
|
#endif
|
|||
|
|
|||
|
struct audio_eq {
|
|||
|
void *eq_ch; //硬件eq句柄
|
|||
|
u8 updata; //系数是否需要更新
|
|||
|
u8 start; //eq start标识
|
|||
|
u8 max_nsection; //eq最大段数
|
|||
|
u8 cur_nsection; //当前eq段数
|
|||
|
u8 check_hw_running; //检测到硬件正在运行时不等待其完成1:设置检查 0:不检查
|
|||
|
u8 async_en;
|
|||
|
u8 out_32bit;
|
|||
|
u8 ch_num;
|
|||
|
u32 sr; //采样率
|
|||
|
u32 eq_name; //eq标识
|
|||
|
u32 mask[2];
|
|||
|
float global_gain;
|
|||
|
float global_gain_r;
|
|||
|
s16 *eq_out_buf;//同步方式,32bit输出,当out为NULL时,内部申请eq_out_buf
|
|||
|
int out_buf_size;
|
|||
|
int eq_out_points;
|
|||
|
int eq_out_total;
|
|||
|
struct audio_stream_entry entry; // 音频流入口
|
|||
|
|
|||
|
#ifdef CONFIG_EQ_SUPPORT_ASYNC
|
|||
|
void *run_buf;
|
|||
|
void *run_out_buf;
|
|||
|
int run_len;
|
|||
|
struct audio_eq_async async; //异步eq 输出管理
|
|||
|
#endif
|
|||
|
u32 mute_cnt_l; //左声道eq mem清除计数
|
|||
|
u32 mute_cnt_r; //右声道eq mem清除计数
|
|||
|
u32 mute_cnt_max; //记录最大点数,超过该点数,清eq mem
|
|||
|
|
|||
|
audio_eq_filter_cb cb; //系数回调
|
|||
|
void *output_priv; //私有指针
|
|||
|
int (*output)(void *priv, void *data, u32 len); //输出回调
|
|||
|
|
|||
|
struct eq_seg_info *eq_seg_tab; //运算前系数表,特殊应用时,可使用
|
|||
|
struct eq_seg_info *seg; //运算前系数表,由audio_eq_param初始化时指定
|
|||
|
struct eq_seg_info *seg_r; //运算前系数表,由audio_eq_param初始化时指定
|
|||
|
int *eq_coeff_tab; //运算后系数表
|
|||
|
struct list_head hentry; //
|
|||
|
const char *event_owner; //记录data_handler所处的任务
|
|||
|
struct audio_eq_fade *fade;
|
|||
|
struct audio_eq_fade *fade_r;
|
|||
|
float fade_step;
|
|||
|
};
|
|||
|
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief eq模块初始化
|
|||
|
@param
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
void audio_eq_init(void);
|
|||
|
void audio_eq_init_new(int eq_section_num);
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief eq 打开
|
|||
|
@param *param: eq参数句柄,参数详见结构体struct audio_eq_param
|
|||
|
@return eq句柄
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
int audio_eq_open(struct audio_eq *eq, struct audio_eq_param *param);
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief 异步eq设置输出回调
|
|||
|
@param eq:句柄
|
|||
|
@param *output:回调函数
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
void audio_eq_set_output_handle(struct audio_eq *eq, int (*output)(void *priv, void *data, u32 len), void *output_priv);
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief 同步eq设置输出buf
|
|||
|
@param eq:句柄
|
|||
|
@param *output:回调函数
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
void audio_eq_set_output_buf(struct audio_eq *eq, s16 *buf, u32 len);
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief eq设置采样率
|
|||
|
@param eq:句柄
|
|||
|
@param sr:采样率
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
void audio_eq_set_samplerate(struct audio_eq *eq, int sr);
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief eq设置输入输出通道数
|
|||
|
@param eq:句柄
|
|||
|
@param channel:通道数
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
void audio_eq_set_channel(struct audio_eq *eq, u8 channel);
|
|||
|
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief 设置检查eq是否正在运行
|
|||
|
@param eq:句柄
|
|||
|
@param check_hw_running: 1:设置检查 0:不检查
|
|||
|
@return
|
|||
|
@note 检测到硬件正在运行时不等待其完成,直接返回, 仅异步EQ有效
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
int audio_eq_set_check_running(struct audio_eq *eq, u8 check_hw_running);
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief 设置eq信息
|
|||
|
@param eq:句柄
|
|||
|
@param channels:设置输入输出通道数
|
|||
|
@param out_32bit:使能eq输出32bit数据,1:输出32bit数据, 0:输出16bit是数据
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
int audio_eq_set_info(struct audio_eq *eq, u8 channels, u8 out_32bit);
|
|||
|
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief 设置eq信息
|
|||
|
@param eq:句柄
|
|||
|
@param channels:设置入输出通道数
|
|||
|
@param in_mode:使能eq输入32bit数据,2:float, 1:输入32bit数据, 0:输入16bit是数据
|
|||
|
@param out_mode:使能eq输出32bit数据,2:float, 1:输出32bit数据, 0:输出16bit是数据
|
|||
|
@param run_mode:运行模式,0:normal, 1:mono, 2:stero
|
|||
|
@param data_in_mode:输入数据存放方式 0:块模式 1:序列模式
|
|||
|
@param data_out_mode:输入数据存放方式 0:块模式 1:序列模式
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
int audio_eq_set_info_new(struct audio_eq *eq, u8 channels, u8 in_mode, u8 out_mode, u8 run_mode, u8 data_in_mode, u8 data_out_mode);
|
|||
|
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief eq启动
|
|||
|
@param eq:句柄
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
int audio_eq_start(struct audio_eq *eq);
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief eq的数据处理
|
|||
|
@param eq:句柄
|
|||
|
@param *data:输入数据地址
|
|||
|
@param len:输入数据长度
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
int audio_eq_run(struct audio_eq *eq, s16 *data, u32 len);
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief eq关闭
|
|||
|
@param eq:句柄
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
int audio_eq_close(struct audio_eq *eq);
|
|||
|
|
|||
|
|
|||
|
#ifdef CONFIG_EQ_SUPPORT_ASYNC
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief 清除异步eq剩余的数据
|
|||
|
@param eq:句柄
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
void audio_eq_async_data_clear(struct audio_eq *eq);
|
|||
|
#endif
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief 获取异步eq剩余的数据
|
|||
|
@param eq:句柄
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
int audio_eq_data_len(struct audio_eq *eq);
|
|||
|
|
|||
|
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief audio_eq_open重新封装,简化使用,该接口不接入audio_stream流处理
|
|||
|
@param *parm: eq参数句柄,参数详见结构体struct audio_eq_param
|
|||
|
@return eq句柄
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
struct audio_eq *audio_dec_eq_open(struct audio_eq_param *parm);
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief audio_eq_close重新封装,简化使用,该接口不接入audio_stream流处理
|
|||
|
@param eq句柄
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
void audio_dec_eq_close(struct audio_eq *eq);
|
|||
|
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief audio_eq_run重新封装,简化使用,该接口不接入audio_stream流处理
|
|||
|
@param eq句柄
|
|||
|
@return
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
int audio_dec_eq_run(struct audio_eq *eq, s16 *data, s16 *out, u16 len);
|
|||
|
|
|||
|
/*
|
|||
|
*设置声道总增益
|
|||
|
* */
|
|||
|
void cur_eq_set_global_gain(u32 eq_name, float g_Gain);
|
|||
|
/*
|
|||
|
*设置某一段eq相关系数
|
|||
|
*seg:eq系数
|
|||
|
*nsection:eq的段数
|
|||
|
*design:是否覆盖输入系数表 1:不覆盖 0:覆盖
|
|||
|
* */
|
|||
|
void cur_eq_set_update(u32 eq_name, struct eq_seg_info *seg, u32 nsection, u32 design);
|
|||
|
/*
|
|||
|
*设置右声道总增益
|
|||
|
* */
|
|||
|
void cur_eq_right_ch_set_global_gain(u32 eq_name, float g_Gain);
|
|||
|
/*
|
|||
|
*设置右声道某一段eq相关系数
|
|||
|
*seg:eq系数
|
|||
|
*nsection:eq的段数
|
|||
|
*design:是否覆盖输入系数表 1:不覆盖 0:覆盖
|
|||
|
* */
|
|||
|
void cur_eq_right_ch_set_update(u32 eq_name, struct eq_seg_info *seg, u32 nsection, u32 design);
|
|||
|
/*
|
|||
|
*eq系数回调
|
|||
|
* */
|
|||
|
int eq_get_filter_info(void *_eq, int sr, struct audio_eq_filter_info *info);
|
|||
|
/*
|
|||
|
*通过eq_name获取当前运行的eq的指针
|
|||
|
* */
|
|||
|
struct audio_eq *get_cur_eq_hdl_by_name(u32 eq_name);
|
|||
|
#endif
|
|||
|
|