This commit is contained in:
huxi
2025-12-03 11:12:34 +08:00
parent c23ae4f24c
commit bc195654bf
8163 changed files with 3799544 additions and 92 deletions
+16
View File
@@ -0,0 +1,16 @@
#ifndef _PLC_H_
#define _PLC_H_
#include "generic/typedef.h"
struct esco_plc_parm {
int sr;
int nch;
};
u32 PLC_query(struct esco_plc_parm *parm, void *dataTypeobj);
s8 PLC_init(void *pbuf, struct esco_plc_parm *parm, void *dataTypeobj);
void PLC_exit(void);
void PLC_run(s16 *inbuf, s16 *outbuf, u16 point, u8 repair_flag);
#endif
+29
View File
@@ -0,0 +1,29 @@
#ifndef __RESAMPLE_API_H__
#define __RESAMPLE_API_H__
// #include "br18_dsp_Ecommon.h"
#include "effects/AudioEffect_DataType.h"
typedef struct _RS_IO_CONTEXT_ {
void *priv;
int(*output)(void *priv, void *data, int len);
} RS_IO_CONTEXT;
typedef struct _RS_PARA_STRUCT_ {
unsigned int new_insample;
unsigned int new_outsample;
int nch;
af_DataType dataTypeobj;
} RS_PARA_STRUCT;
typedef struct _RS_STUCT_API_ {
unsigned int(*need_buf)();
void (*open)(unsigned int *ptr, RS_PARA_STRUCT *rs_para);
void (*set_sr)(unsigned int *ptr, int newsrI);
int(*run)(unsigned int *ptr, short *inbuf, int len, short *obuf); //len是n个点,返回n个点
} RS_STUCT_API;
RS_STUCT_API *get_rsfast_context();//lib_resample_fast_cal.a里面的如果设置const int RS_FAST_MODE_QUALITY = 8; 它的效果就跟lib_resample_cal完全一样的了
#define get_rs16_context get_rsfast_context
#endif
@@ -0,0 +1,17 @@
#ifndef _AISPEECH_NR_H_
#define _AISPEECH_NR_H_
#ifdef __cplusplus
extern "C" {
#endif
int Aispeech_NR_getmemsize(short sample_rate);
int Aispeech_NR_init(char *pcMemPool, unsigned int memPoolLen, short sample_rate);
int Aispeech_NR_run(short *mic0, short *mic1, short *mic2, short *ref, short *out, short points);
int Aispeech_NR_deinit(void);
#ifdef __cplusplus
};
#endif
#endif
+235
View File
@@ -0,0 +1,235 @@
#ifndef _ANC_BTSPP_H_
#define _ANC_BTSPP_H_
#include "generic/typedef.h"
#include "asm/anc.h"
//前期训练 建议先做喇叭测试,再做MIC测试。这样内部可以通过喇叭判断MIC好不好
//-------------------ANC SPP 协议 -------------------//
//父命令
#define ANC_COMMAND_RESPO 0x00 //命令回复
#define ANC_TRAIN_NOMA_MODE 0x01 //普通训练模式
#define ANC_TRAIN_FAST_MODE 0x02 //快速训练模式
//训练工具子命令1
#define ANC_CHANGE_COMMAND 0x00 //父命令模式切换
#define ANC_MUTE_TARIN 0x01 //静音训练
#define ANC_NOISE_TARIN 0x02 //噪声训练
#define ANC_TARIN_AGAIN 0x03 //继续训练
#define ANC_MODE_OFF 0x04 //ANC关
#define ANC_MODE_ON 0x05 //ANC降噪模式
#define ANC_TRAIN_EXIT 0x06 //ANC训练结束
#define ANC_PASS_MODE_ON 0x07 //ANC通透模式
#define ANC_TRAIN_STEP_1 0x08 //ANC训练步进1
#define ANC_TRAIN_STEP_2 0x09 //ANC训练步进2
#define ANC_TRAIN_STEP_SET 0x15 //设置ANC训练步进
#define ANC_SZ_LOW_THR_SET 0x16 //设置SZ MIC下限能量阈值
#define ANC_FZ_LOW_THR_SET 0x17 //设置FZ MIC下限能量阈值
#define ANC_SZ_ADAP_THR_SET 0x18 //设置SZ 自适应收敛阈值
#define ANC_FZ_ADAP_THR_SET 0x19 //设置FZ 自适应收敛阈值
#define ANC_AUTO_TS_EN_SET 0x1a //设置步进自适应微调使能
#define ANC_NONADAP_TIME_SET 0x1b //设置非自适应收敛时间
#define ANC_SZ_ADAP_TIME_SET 0x1c //设置SZ自适应收敛时间
#define ANC_FZ_ADAP_TIME_SET 0x1d //设置FZ自适应收敛时间
#define ANC_WZ_TRAIN_TIME_SET 0x1e //设置WZ训练时间
//以下为开发者测试指令
#define ANC_DEVELOPER_MODE 0x20 //开发者模式
#define ANC_TEST_NADAP 0x21 //关闭ANC自适应收敛
#define ANC_TEST_ADAP 0x22 //开启ANC自适应收敛
#define ANC_TEST_WZ_BREAK 0x23 //退出噪声训练
#define ANC_CHANGE_MODE 0x24 //模式设置指令
#define ANC_TRAIN_STEP_CONNUTE 0x30 //继续找步进
#define ANC_MUTE_TRAIN_GET_DATA 0x31 //获取静音训练的SPK MIC数据
#define ANC_TRANS_MUTE_TARIN 0x32 //通透模式训练
#define ANC_MIC_DMA_EXPORT_EN 0x50 //设置输出ANC 的MIC数据
#define ANC_REF_MIC_GAIN_SET 0x11 //设置参考MIC的增益
#define ANC_ERR_MIC_GAIN_SET 0x12 //设置误差MIC的增益
#define ANC_DAC_GAIN_SET 0x13 //设置DAC的模拟增益
#define ANC_FFGAIN_SET 0x14 //设置ANC的数字增益
#define ANC_FBGAIN_SET 0x1f //设置ANC的FBGAIN增益
#define ANC_SAMPLE_RATE_SET 0x40 //设置ANC采样率
#define ANC_ORDER_SET 0x41 //设置ANC阶数
#define ANC_TRANS_HPF_SET 0x42 //设置通透高通滤波器
#define ANC_TRANS_LPF_SET 0x43 //设置通透低通滤波器
#define ANC_TRANS_GAIN_SET 0x44 //设置通透增益
#define ANC_TRANS_SAMPLE_RATE_SET 0x45 //设置通透采样率
#define ANC_TRANS_ORDER_SET 0x46 //设置通透阶数
#define ANC_CMP_EN_SET 0x51 //设置CMP使能
#define ANC_DRC_EN_SET 0x52 //设置DRC使能
#define ANC_AHS_EN_SET 0x53 //设置AHS使能
#define ANC_DCC_SEL_SET 0x54 //设置DCC档位
#define ANC_GAIN_SIGN_SET 0x55 //设置ANC各类增益的符号
#define ANC_NOISE_LVL_SET 0x56 //设置训练噪声等级
#define ANC_CMP_GAIN_SET 0x57 //设置ANC左声道CMP增益
#define ANC_RFF_GAIN_SET 0x58 //设置ANC右声道FF增益
#define ANC_RFB_GAIN_SET 0x59 //设置ANC右声道FB增益
#define ANC_RTRANS_GAIN_SET 0x5A //设置ANC右声道通透增益
#define ANC_RCMP_GAIN_SET 0x5B //设置ANC右声道CMP增益
#define ANC_DRCFF_ZERO_DET_SET 0x5C //设置DRCFF过零检测使能
#define ANC_DRCFF_DAT_MODE_SET 0x5D //设置DRCFF_DAT模式
#define ANC_DRCFF_LPF_SEL_SET 0x5E //设置DRCFF_LPF档位
#define ANC_DRCFB_ZERO_DET_SET 0x5F //设置DRCFB过零检测使能
#define ANC_DRCFB_DAT_MODE_SET 0x60 //设置DRCFB_DAT模式
#define ANC_DRCFB_LPF_SEL_SET 0x61 //设置DRCFB_LPF档位
#define ANC_DRCFF_LTHR_SET 0x62 //设置DRCFF_LOW阈值
#define ANC_DRCFF_HTHR_SET 0x63 //设置DRCFF_HIGH阈值
#define ANC_DRCFF_LGAIN_SET 0x64 //设置DRCFF_LOW增益
#define ANC_DRCFF_HGAIN_SET 0x65 //设置DRCFF_HIGH增益
#define ANC_DRCFF_NORGAIN_SET 0x66 //设置DRCFF_NOR增益
#define ANC_DRCFB_LTHR_SET 0x67 //设置DRCFB_LOW阈值
#define ANC_DRCFB_HTHR_SET 0x68 //设置DRCFB_HIGH阈值
#define ANC_DRCFB_LGAIN_SET 0x69 //设置DRCFB_LOW增益
#define ANC_DRCFB_HGAIN_SET 0x6A //设置DRCFB_HIGH增益
#define ANC_DRCFB_NORGAIN_SET 0x6B //设置DRCFB_NOR增益
#define ANC_DRCTRANS_LTHR_SET 0x6C //设置DRCTRANS_LOW阈值
#define ANC_DRCTRANS_HTHR_SET 0x6D //设置DRCTRANS_HIGH阈值
#define ANC_DRCTRANS_LGAIN_SET 0x6E //设置DRCTRANS_LOW增益
#define ANC_DRCTRANS_HGAIN_SET 0x6F //设置DRCTRANS_HIGH增益
#define ANC_DRCTRANS_NORGAIN_SET 0x70 //设置DRCTRANS_NOR增益
#define ANC_AHS_DLY_SET 0x71 //设置啸叫抑制_DLY
#define ANC_AHS_TAP_SET 0x72 //设置啸叫抑制_TAP
#define ANC_AHS_WN_SHIFT_SET 0x73 //设置啸叫抑制_WN_SHIFT
#define ANC_AHS_WN_SUB_SET 0x74 //设置啸叫抑制_WN_SUB
#define ANC_AHS_SHIFT_SET 0x75 //设置啸叫抑制_SHIFT
#define ANC_AHS_U_SET 0x76 //设置啸叫抑制步进
#define ANC_AHS_GAIN_SET 0x77 //设置啸叫抑制增益
#define ANC_FADE_STEP_SET 0x78 //设置淡入淡出步进
#define ANC_AUDIO_DRC_THR_SET 0x79 //设置AUDIO DRC阈值
#define ANC_AHS_NLMS_SEL_SET 0x7A //设置啸叫抑制NLMS
#define ANC_R_FFMIC_GAIN_SET 0x7B //设置ANCR_FFMIC增益
#define ANC_R_FBMIC_GAIN_SET 0x7C //设置ANCR_FBMIC增益
#define ANC_FB_1ST_DCC_SET 0x7D //设置FB1阶DCC
#define ANC_FF_2ND_DCC_SET 0x7E //设置FF2阶DCC
#define ANC_FB_2ND_DCC_SET 0x7F //设置FB2阶DCC
#define ANC_DRC_FF_2DCC_SET 0x80 //设置DRCFF动态DCC目标档位
#define ANC_DRC_FB_2DCC_SET 0x81 //设置DRCFB动态DCC目标档位
#define ANC_DRC_DCC_DET_TIME_SET 0x82 //设置DRC动态DCC检测时间
#define ANC_DRC_DCC_RES_TIME_SET 0x83 //设置DRC动态DCC恢复时间
//0x84-0x8A 36啸叫抑制参数使用
#define ANC_ADAPTIVE_REF_FB_FRE 0x8B //设置自适应FB参考 Fre
#define ANC_ADAPTIVE_REF_FB_G 0x8C //设置自适应FB参考 G
#define ANC_ADAPTIVE_REF_FB_Q 0x8D //设置自适应FB参考 Q
#define ANC_ADAPTIVE_REF_EN 0x8E //金机曲线使能控制
#define ANC_DRC_TOP_FF_STR_SET 0x97 //DRC TOP FF结构体设置 --BR50
#define ANC_DRC_TOP_FB_STR_SET 0x98 //DRC TOP FB结构体设置 --BR50
#define ANC_DRC_TOP_TRANS_STR_SET 0x99 //DRC TOP TRANS结构体设置 --BR50
#define ANC_DRC_CORE_FF_STR_SET 0x9A //DRC CORE FF结构体设置 --BR50
#define ANC_DRC_CORE_FB_STR_SET 0x9B //DRC CORE FB结构体设置 --BR50
#define ANC_DRC_CORE_TRANS_STR_SET 0x9C //DRC CORE TRANS结构体设置 --BR50
#define ANC_DRC_DAC_MUX_STR_SET 0x9D //DRC DAC MUX结构体设置 --BR50
#define ANC_ADAPTIVE_DCC_MODE 0x9E //DRC DCC 模式设置 --BR50
#define ANC_ADAPTIVE_DCC_STR_FF 0x9F //DRC 自适应DCC FF结构体设置 --BR50
#define ANC_ADAPTIVE_DCC_STR_FB 0xA0 //DRC 自适应DCC FB结构体设置 --BR50
//----------------耳机反馈子命令1---------------------//
#define ANC_EXEC_SUCC 0x01 //执行成功
#define ANC_EXEC_FAIL 0x02 //执行失败
#define ANC_TRIM_MIC_WORK_FAIL 0x80|BIT(0) //MIC1工作不正常
#define ANC_MIC_WORK_FAIL 0x80|BIT(1) //MIC0工作不正常
#define ANC_TRIM_MIC_SNR_FAIL 0x80|BIT(2) //MIC1信噪比差
#define ANC_MIC_SNR_FAIL 0x80|BIT(3) //MIC0信噪比差
#define ANC_TRIM_MIC_NOISE_FAIL 0x80|BIT(4) //MIC1底噪高
#define ANC_MIC_NOISE_FAIL 0x80|BIT(5) //MIC0底噪高
//多种错误信息组合为|的形式,如MIC0/MIC1工作都不正常,则返回0x80|BIT(0)|BIT(1)
//---------------------spk_mic_dat param--------------//
#define ANC_R_SPK_L_SPK 0x01 //高16bit R spk数据, 低16bit L spk 数据
#define ANC_R_SPK_R_ERRMIC 0x02
#define ANC_R_SPK_R_REFMIC 0x03
#define ANC_L_SPK_L_ERRMIC 0x04
#define ANC_L_SPK_L_REFMIC 0x05
#define ANC_R_ERRMIC_R_REFMIC 0x06
#define ANC_L_ERRMIC_L_REFMIC 0x07
//注意FF/FB/Hybrid/只能选择一种
#define ANC_MUTE_EN BIT(0) //通透静音训练使能
#define ANC_NOISE_EN BIT(1) //通透噪声训练使能
#define ANC_SPP_PACK_NUM 10 //数据包长度
#define ANC_SPP_MAGIC 0x55AA
enum {
ANC_SZ_MUTE_STATUS = 0, //SZ非自适应(DAC静音)状态
ANC_SZ_NADAP_STATUS, //SZ非自适应状态
ANC_SZ_ADAP_STATUS, //SZ自适应状态
ANC_FZ_MUTE_STATUS, //FZ非自适应(DAC静音)状态
ANC_FZ_NADAP_STATUS, //FZ非自适应状态
ANC_FZ_ADAP_STATUS, //FZ自适应状态
ANC_WZ_NADAP_STATUS, //WZ非自适应状态
ANC_WZ_ADAP_STATUS, //WZ自适应状态
ANC_WZ_END_STATUS, //WZ训练结束
};
enum {
ANC_TRAIN_SZ = 0,
ANC_TRAIN_FZ,
ANC_TRAIN_WZ,
};
typedef struct {
u16 magic;
u16 crc;
u16 len;
u8 dat[4];
} anc_spp_data_t;
typedef struct {
anc_train_para_t *para;
audio_anc_t *param;
u8 developer_mode; //开发者模式
u8 noise_exit; //退出噪声训练
u8 pow_dat[10];
u8 status;
u8 train_step_num;
int *anc_gain;
int *anc_fbgain;
anc_spp_data_t rx_buf;
anc_spp_data_t tx_buf;
} anc_spp_t;
typedef struct {
u8 mode;
u8 ff_en;
u8 fb_en;
u16 fb0_gain;
u16 fb1_gain;
} anc_train_reg_t;
void anc_debug_init(audio_anc_t *param);
void anc_debug_uninit(void);
int anc_spp_event_deal(u8 *dat);
void anc_train_api_set(u8 cmd, u32 data, anc_train_para_t *para);
int anc_spp_rx_packet(u8 *dat, u8 len);
int anc_spp_tx_packet(u8 mode, u8 command, u16 command_dat);
u8 anc_powdat_analysis(u32 pow);
void anc_coeff_max_get(s32 *coeff, s32 *dat, u16 len, u8 type);
void anc_btspp_display_pow(anc_ack_msg_t *anc_ack);
void anc_btspp_status_set(u8 status);
#endif/*_ANC_BTSPP_H_*/
+35
View File
@@ -0,0 +1,35 @@
#ifndef _ANC_DEBUG_H_
#define _ANC_DEBUG_H_
#include "generic/typedef.h"
#include "generic/circular_buf.h"
#include "system/includes.h"
#define ANC_CBUF_SIZE 8000
typedef struct {
/* struct audio_adc_output_hdl adc_output; */
/* struct adc_mic_ch mic_ch; */
/* s16 adc_buf[ADC_DM_BUFS_SIZE]; //align 4Bytes */
/* s16 mic_tmp_data[ADC_DM_IRQ_POINTS]; */
u8 rx_num;
u8 print_num; //打印状态
u8 tx_enable; //打印总开关
u8 tx_host; //打印模式
u32 tx_timeout; //超时打印时间,单位秒
int rx_vaule;
char temp_strbuf[40];
char temp_intbuf[12];
u8 tx_buf[ANC_CBUF_SIZE];
cbuffer_t tx_cb;
int (*uart_write)(u8 *buf, u8 len);
} anc_debug_t;
extern anc_debug_t *anc_dbg;
void anc_uart_init(int (*uart_write_hdl)(u8 *buf, u8 len));
int anc_intlog(u32 int_para, u8 log_more);
int anc_strlog(char *str, u8 log_more);
void anc_uart_ctl();
int anc_uart_process(u8 *dat, int len);
#endif/*_ANC_DEBUG_H_*/
+28
View File
@@ -0,0 +1,28 @@
/*****************************************************************
>file name : include_lib/media/jl_kws.h
>create time : Thu 16 Dec 2021 10:48:56 AM CST
*****************************************************************/
#ifndef _JL_AUDIO_KWS_H_
#define _JL_AUDIO_KWS_H_
#include "typedef.h"
#define JL_KWS_WAKE_WORD 0
#define JL_KWS_COMMAND_KEYWORD 1
#define JL_KWS_CALL_KEYWORD 2
struct kws_multi_keyword_model {
int (*mem_dump)(int model, int *model_size, int *private_size, int *share_size);
void *(*init)(int model, char *private_buffer, int private_size, char *share_buffer, int share_size, int model_size, float *confidence, int online);
int (*reset)(void *m);
int (*process)(void *m, int model, char *pcm, int size);
int (*free)(void *m);
};
void *audio_kws_open(u8 mode, const char *file_name);
int audio_kws_detect_handler(void *kws, void *data, int len);
void audio_kws_close(void *kws);
#endif
+98
View File
@@ -0,0 +1,98 @@
/*****************************************************************
>file name : kws_event.h
>author : lichao
>create time : Fri 05 Nov 2021 10:11:40 AM CST
*****************************************************************/
#ifndef _AUDIO_KWS_EVENT_
#define _AUDIO_KWS_EVENT_
enum audio_kws_event {
KWS_EVENT_NULL = 0,
/*Hey xxx系列关键词*/
KWS_EVENT_HEY_KEYWORD,
/*杰理唤醒词*/
KWS_EVENT_XIAOJIE,
/*百度 -- 小度小度等系列命令词消息*/
KWS_EVENT_XIAODU, /*小度小度*/
/*音乐关键词*/
KWS_EVENT_PLAY_MUSIC, /*播放音乐*/
KWS_EVENT_STOP_MUSIC, /*停止播放*/
KWS_EVENT_PAUSE_MUSIC, /*暂停播放*/
KWS_EVENT_VOLUME_UP, /*增大音量*/
KWS_EVENT_VOLUME_DOWN, /*减小音量*/
KWS_EVENT_PREV_SONG, /*上一首*/
KWS_EVENT_NEXT_SONG, /*下一首*/
/*通话关键词*/
KWS_EVENT_CALL_ACTIVE, /*接听电话*/
KWS_EVENT_CALL_HANGUP, /*挂断电话*/
/*ANC系列关键词词*/
KWS_EVENT_ANC_ON, /*打开降噪*/
KWS_EVENT_ANC_OFF, /*关闭降噪*/
KWS_EVENT_TRANSARENT_ON,/*打开通透*/
/*音量补充关键词*/
KWS_EVENT_VOLUME_MUTE, /*静音模式*/
KWS_EVENT_VOLUME_UNMUTE, /*取消静音*/
KWS_EVENT_VOLUME_MAX, /*最大音量*/
/*亮度调整关键词*/
KWS_EVENT_BRIGHTNESS_ALWAYS,/*屏幕常亮*/
KWS_EVENT_BRIGHTNESS_UP, /*增大亮度*/
KWS_EVENT_BRIGHTNESS_DOWN, /*减小亮度*/
KWS_EVENT_BRIGHTNESS_AUTO, /*自动调整亮度*/
/*健康测量关键词*/
KWS_EVENT_DETECTION_HEART, /*测量心率*/
KWS_EVENT_DETECTION_OXYGEN, /*测量血氧*/
/*蓝牙应用关键词*/
KWS_EVENT_OPEN_EDR, /*打开蓝牙*/
KWS_EVENT_FIND_PHONE, /*找手机*/
KWS_EVENT_START_PHOTOS, /*开始拍照*/
/*表盘应用关键词*/
KWS_EVENT_SWITCH_DIAL, /*更换表盘*/
KWS_EVENT_SWITCH_STYLE, /*更换界面风格*/
/*记录查看关键词*/
KWS_EVENT_SEE_SPORT_RECORD, /*查看锻炼记录*/
KWS_EVENT_SEE_ACTION_RECORD,/*查看活动记录*/
KWS_EVENT_SEE_SLEEP_RECORD, /*查看睡眠数据*/
KWS_EVENT_SEE_CALL_REDORD, /*查看通话记录*/
KWS_EVENT_SEE_TRAIN_RECORD, /*查看训练记录*/
KWS_EVENT_SEE_HEAT, /*查看压力指标*/
/*打开功能页面关键词*/
KWS_EVENT_OPEN_SPORT, /*打开运动*/
KWS_EVENT_OPEN_TRAIN, /*打开锻炼*/
KWS_EVENT_OPEN_CALCULAGRAPH,/*打开计时器*/
KWS_EVENT_OPEN_CALL_DIAL, /*打开电话*/
KWS_EVENT_OPEN_PHONEBOOK, /*打开联系人*/
KWS_EVENT_OPEN_ALARM, /*打开闹钟*/
KWS_EVENT_OPEN_STOPWATCH, /*打开秒表*/
KWS_EVENT_OPEN_WEATHER, /*打开天气*/
KWS_EVENT_OPEN_MESS, /*打开消息*/
KWS_EVENT_OPEN_SET, /*打开设置*/
KWS_EVENT_OPEN_APP_LIST, /*打开应用列表*/
KWS_EVENT_OPEN_BREATH_TRAIN,/*打开呼吸训练*/
KWS_EVENT_OPEN_BARO, /*打开海拔气压计*/
KWS_EVENT_OPEN_COMPASS, /*打开指南针*/
KWS_EVENT_OPEN_CARD_BAG, /*打开卡包*/
KWS_EVENT_OPEN_ALIPAY, /*打开支付宝*/
KWS_EVENT_OPEN_FLASHLIGHT, /*打开手电筒*/
KWS_EVENT_OPEN_CALENDAR, /*打开日历*/
KWS_EVENT_OPEN_CALCULATOR, /*打开计算器*/
/*TODO*/
KWS_EVENT_MAX,
};
#endif
+56
View File
@@ -0,0 +1,56 @@
#ifndef AUDIO_BASE_H
#define AUDIO_BASE_H
#include "generic/typedef.h"
#include "audio_def.h"
#define AUDIO_INPUT_FILE 0x01
#define AUDIO_INPUT_FRAME 0x02
enum audio_channel {
AUDIO_CH_L = (1 << 4) | 1, //左声道(单声道)
AUDIO_CH_R = (1 << 4) | 2, //右声道(单声道)
AUDIO_CH_DIFF = (1 << 4) | 3, //差分(单声道)
AUDIO_CH_MIX = (1 << 4) | 4, //左右声道混合(单声道)
AUDIO_CH_LR = (2 << 4) | 5, //立体声
AUDIO_CH_DUAL_L = (2 << 4) | 6, //双声道都为左
AUDIO_CH_DUAL_R = (2 << 4) | 7, //双声道都为右
AUDIO_CH_DUAL_LR = (2 << 4) | 8, //双声道为左右混合
AUDIO_CH_QUAD = (4 << 4) | 9, //四声道(LRLR
AUDIO_CH_MAX = 0xff,
};
#define AUDIO_CH_NUM(ch) ((ch) >> 4)
/*! \brief 音频处理结构 */
struct audio_fmt {
u8 channel; /*!< */
u16 frame_len; /*!< 幁长度 (bytes)*/
u16 sample_rate; /*!< 采样率 e.g. 48kHz/44.1kHz/32kHz*/
u32 coding_type;
u32 bit_rate; /*!< 比特率 (bps)*/
u32 total_time;
u32 quality;
u32 complexity;
void *priv;
};
#endif
+229
View File
@@ -0,0 +1,229 @@
/*****************************************************************
>file name : audio_cfifo.h
>author : lichao
>create time : Tue 10 Nov 2020 02:22:37 PM CST
*****************************************************************/
#ifndef _AUDIO_CFIFO_H_
#define _AUDIO_CFIFO_H_
#include "generic/list.h"
#include "typedef.h"
#include "system/spinlock.h"
#define WRITE_MODE_BLOCK 0
#define WRITE_MODE_FORCE 1
struct audio_cfifo {
u8 sample_channel; /*fifo采样声道数*/
s16 *addr; /*fifo首地址*/
u16 sample_size; /*fifo采样长度*/
u16 wp; /*fifo写偏移*/
u16 rp; /*fifo读偏移*/
u16 lock_rp; /*fifo不可擦写的已读偏移*/
u16 free_samples; /*fifo可写入样点个数*/
s16 unread_samples; /*fifo未读样点个数*/
int sample_rate; /*fifo对应的音频采样率*/
u32 sw_ptr;
u32 hw_ptr;
struct list_head head; /*子通道数据链表头*/
spinlock_t lock;
u8 bit_wide;
};
struct audio_cfifo_channel {
u8 write_mode; /*写入模式*/
u16 delay_time; /*最大延时(ms)*/
u16 rsp; /*读偏移*/
u16 wsp; /*写偏移*/
s16 unread_samples; /*通道未读样点个数*/
u16 max_samples; /*通道缓冲最大样点个数*/
u32 sw_ptr;
u32 hw_ptr;
struct audio_cfifo *fifo; /*主fifo指针*/
struct list_head entry; /*通道接入entry*/
u8 bit_wide;
};
/*************************************************************************
* Audio cfifo主fifo初始化
* INPUT : fifo - 主fifo结构指针,
* buf - fifo缓冲地址
* len - fifo缓冲长度
* sample_rate - fifo音频采样率
* channel - fifo音频声道数
* OUTPUT : 0 - 成功,非0 - 失败.
* WARNINGS : 无.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_init(struct audio_cfifo *fifo, void *buf, int len, int sample_rate, u8 channel);
/*************************************************************************
* Audio cfifo主fifo复位
* INPUT : fifo - 主fifo结构指针,
* buf - fifo缓冲地址
* len - fifo缓冲长度
* sample_rate - fifo音频采样率
* channel - fifo音频声道数
* OUTPUT : 0 - 成功,非0 - 失败.
* WARNINGS : 这里与audio_cfifo_init类似但意义不一样,不可以当作init使用.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_reset(struct audio_cfifo *fifo, void *buf, int len, int sample_rate, u8 channel);
/*************************************************************************
* 添加fifo子通道
* INPUT : fifo - 主fifo结构指针,
* ch - fifo子通道
* delay_time - 子通道延时
* write_mode - 子通道写入模式
* OUTPUT : 0 - 成功,非0 - 失败.
* WARNINGS : 无.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_channel_add(struct audio_cfifo *fifo, struct audio_cfifo_channel *ch, int delay_time, u8 write_mode);
/*************************************************************************
* 删除fifo子通道
* INPUT : ch - fifo子通道
* OUTPUT : 无.
* WARNINGS : 无.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
void audio_cfifo_channel_del(struct audio_cfifo_channel *ch);
/*************************************************************************
* 主fifo读数更新
* INPUT : fifo - 主fifo结构指针, samples - 读取的样点个数
* OUTPUT : 成功更新的样点个数.
* WARNINGS : 无.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_read_update(struct audio_cfifo *fifo, int samples);
/*************************************************************************
* fifo子通道数据写入
* INPUT : ch - fifo子通道, data - 数据指针, len - 数据长度
* OUTPUT : 写入fifo的长度.
* WARNINGS : 强制写入模式无论是否可以写入都将返回预期写入长度.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_channel_write(struct audio_cfifo_channel *ch, void *data, int len);
/*************************************************************************
* fifo子通道写入直流数据
* INPUT : ch - fifo子通道, data - 直流值, len - 长度
* OUTPUT : 写入fifo的长度.
* WARNINGS : 强制写入模式无论是否可以写入都将返回预期写入长度.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_channel_write_fixed_data(struct audio_cfifo_channel *ch, s16 data, int len);
/*************************************************************************
* fifo子通道擦除
* INPUT : ch - fifo子通道
* OUTPUT : 未知.
* WARNINGS : 待开发.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_channel_clear(struct audio_cfifo_channel *ch);
/*************************************************************************
* 主fifo获取写偏移
* INPUT : fifo - 主fifo结构指针
* OUTPUT : fifo写入偏移.
* WARNINGS : 无.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_get_write_offset(struct audio_cfifo *fifo);
/*************************************************************************
* 主fifo获取未读样点查询
* INPUT : fifo - 主fifo结构指针
* OUTPUT : 样点个数.
* WARNINGS : 无.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_get_unread_samples(struct audio_cfifo *fifo);
/*************************************************************************
* 主fifo与子fifo未读样点个数差值
* INPUT : ch - fifo子通道
* OUTPUT : 样点个数.
* WARNINGS : 无.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_channel_unread_diff_samples(struct audio_cfifo_channel *ch);
/*************************************************************************
* 主fifo通道个数
* INPUT : fifo - 主fifo结构指针
* OUTPUT : 通道个数.
* WARNINGS : 无.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_channel_num(struct audio_cfifo *fifo);
/*************************************************************************
* 主fifo设置已读样点不可擦除区域
* INPUT : fifo - 主fifo结构指针, samples - 不可擦除样点个数
* OUTPUT : 无.
* WARNINGS : 特殊处理,无需理解,仅作为开发人员使用.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
void audio_cfifo_set_readlock_samples(struct audio_cfifo *fifo, int samples);
/*************************************************************************
* 获取主fifo设置已读样点不可擦除区域大小
* INPUT : fifo - 主fifo结构指针.
* OUTPUT : 不可擦除样点个数.
* WARNINGS : 特殊处理,无需理解,仅作为开发人员使用.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_get_readlock_samples(struct audio_cfifo *fifo);
/*************************************************************************
* fifo使用回调读取通道的有效混合数据
* INPUT : fifo - 主fifo结构指针
* offset - 读偏移
* samples - 读取样点个数
* priv - 回调私有指针
* read_callback - 读回调
* OUTPUT : 读取长度.
* WARNINGS : 无.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_read_with_callback(struct audio_cfifo *fifo, int offset, int samples,
void *priv, int (*read_callback)(void *priv, void *data, int len));
/*************************************************************************
* fifo子通道未读样点查询
* INPUT : ch - fifo子通道
* OUTPUT : 样点个数.
* WARNINGS : 无.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_channel_unread_samples(struct audio_cfifo_channel *ch);
/*************************************************************************
* fifo子通道获取写偏移
* INPUT : ch - fifo子通道
* OUTPUT : 偏移.
* WARNINGS : 无.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
int audio_cfifo_channel_write_offset(struct audio_cfifo_channel *ch);
/*************************************************************************
* fifo获取缓冲最小的子通道
* INPUT : fifo - 主fifo结构指针
* OUTPUT : fifo子通道指针.
* WARNINGS : 无.
* HISTORY : 2020/12/28 by Lichao.
*=======================================================================*/
struct audio_cfifo_channel *audio_cfifo_min_samples_channel(struct audio_cfifo *fifo);
int audio_cfifo_get_sw_ptr(struct audio_cfifo *fifo);
int audio_cfifo_get_hw_ptr(struct audio_cfifo *fifo);
int audio_cfifo_read_data(struct audio_cfifo *fifo, s16 *out_buf, int len);
#endif
+328
View File
@@ -0,0 +1,328 @@
#ifndef AUDIO_DECODER_H
#define AUDIO_DECODER_H
#include "generic/typedef.h"
#include "generic/list.h"
#include "media/audio_base.h"
#include "os/os_api.h"
#include "media_memory.h"
enum {
AUDIO_DEC_EVENT_CURR_TIME = 0x20,
AUDIO_DEC_EVENT_END,
AUDIO_DEC_EVENT_ERR,
AUDIO_DEC_EVENT_SUSPEND,
AUDIO_DEC_EVENT_RESUME,
AUDIO_DEC_EVENT_START,
};
enum {
AUDIO_PLAY_EVENT_CURR_TIME = 0x20,
AUDIO_PLAY_EVENT_END,
AUDIO_PLAY_EVENT_ERR,
AUDIO_PLAY_EVENT_SUSPEND,
AUDIO_PLAY_EVENT_RESUME,
};
enum {
AUDIO_RES_GET,
AUDIO_RES_PUT,
};
enum {
DEC_STA_TRY_START,
DEC_STA_START,
DEC_STA_WAIT_STOP,
DEC_STA_WAIT_SUSPEND,
DEC_STA_WAIT_RESUME,
DEC_STA_WAIT_PAUSE,
};
enum {
AUDIO_IOCTRL_CMD_SET_BREAKPOINT_A = 0x08, // 设置复读A点
AUDIO_IOCTRL_CMD_SET_BREAKPOINT_B, // 设置复读B点
AUDIO_IOCTRL_CMD_SET_BREAKPOINT_MODE, // 设置AB点复读模式
AUDIO_IOCTRL_CMD_REPEAT_PLAY = 0x90, // 设置循环播放
AUDIO_IOCTRL_CMD_SET_DEST_PLAYPOS = 0x93, // 设置指定位置播放
AUDIO_IOCTRL_CMD_GET_PLAYPOS = 0x94, // 获取毫秒级时间
//固件自定义命令(非解码器命令)
AUDIO_IOCTRL_CMD_START_SILENCT_DROP = 0x1000,//开头静音数据丢弃处理
};
/*
* 指定位置播放
* 设置后跳到start_time开始播放,
* 播放到dest_time后如果callback_func存在,则调用callback_func
* 可以在callback_func回调中实现对应需要的动作
*/
struct audio_dest_time_play_param {
u32 start_time; // 要跳转过去播放的起始时间。单位:ms
u32 dest_time; // 要跳转过去播放的目标时间。单位:ms
u32(*callback_func)(void *priv); // 到达目标时间后回调
void *callback_priv; // 回调参数
};
/*
* ab点复读模式结构体
*/
struct audio_ab_repeat_mode_param {
u32 value;
};
struct fixphase_repair_obj {
short fifo_buf[18 + 12][32][2];
};
struct audio_repeat_mode_param {
int flag;
int headcut_frame;
int tailcut_frame;
int (*repeat_callback)(void *);
void *callback_priv;
struct fixphase_repair_obj *repair_buf;
};
struct audio_res_wait {
struct list_head entry;
u8 priority;
u8 preemption : 1;
u8 protect : 1;
u8 only_del : 1; // 仅删除
u8 snatch_same_prio : 1; // 优先级相同也抢断
u32 format;
int (*handler)(struct audio_res_wait *, int event);
};
struct audio_decoder_task {
struct list_head head;
struct list_head wait;
const char *name;
int wakeup_timer;
int fmt_lock;
OS_SEM sem;
};
struct audio_dec_breakpoint {
int len;
u32 fptr;
int data_len;
u8 data[0];
// u8 data[128];
};
struct audio_decoder;
struct audio_dec_input {
u32 coding_type;
// 定义在p_more_coding_type数组中的解码器会依照顺序依次检测
// 先检测coding_type再检测p_more_coding_type
u32 *p_more_coding_type;
u32 data_type : 8;
union {
struct {
int (*fread)(struct audio_decoder *, void *buf, u32 len);
int (*fseek)(struct audio_decoder *, u32 offset, int seek_mode);
int (*ftell)(struct audio_decoder *);
int (*flen)(struct audio_decoder *);
} file;
struct {
int (*fget)(struct audio_decoder *, u8 **frame);
void (*fput)(struct audio_decoder *, u8 *frame);
int (*ffetch)(struct audio_decoder *, u8 **frame);
} frame;
} ops;
};
struct audio_dec_handler {
int (*dec_probe)(struct audio_decoder *);
int (*dec_output)(struct audio_decoder *, s16 *data, int len, void *priv);
int (*dec_post)(struct audio_decoder *);
int (*dec_stop)(struct audio_decoder *);
};
struct stream_codec_info {
int time;
int frame_num;
u32 frame_len;
int frame_points;
int sequence_number;
u32 sample_rate;
u8 channel;
};
/*! \brief 音频解码器抽象接口 */
struct audio_decoder_ops {
u32 coding_type; /*!< 解码格式*/
void *(*open)(void *priv); /*!< */
int (*start)(void *); /*!< */
int (*get_fmt)(void *, struct audio_fmt *fmt);
int (*set_output_channel)(void *, enum audio_channel);
int (*get_play_time)(void *);
int (*fast_forward)(void *, int step_s);
int (*fast_rewind)(void *, int step_s);
int (*get_breakpoint)(void *, struct audio_dec_breakpoint *);
int (*set_breakpoint)(void *, struct audio_dec_breakpoint *);
int (*stream_info_scan)(void *, struct stream_codec_info *info, void *data, int len);
int (*set_tws_mode)(void *, int);
int (*run)(void *, u8 *);
int (*stop)(void *);
int (*close)(void *);
int (*reset)(void *);
int (*ioctrl)(void *, u32 cmd, void *parm);
};
#define REGISTER_AUDIO_DECODER(ops) \
const struct audio_decoder_ops ops SEC(.audio_decoder)
extern const struct audio_decoder_ops audio_decoder_begin[];
extern const struct audio_decoder_ops audio_decoder_end[];
#define list_for_each_audio_decoder(p) \
for (p = audio_decoder_begin; p < audio_decoder_end; p++)
struct audio_decoder {
struct list_head entry;
struct audio_decoder_task *task;
struct audio_fmt fmt;
const char *evt_owner;
const struct audio_dec_input *input;
const struct audio_decoder_ops *dec_ops;
const struct audio_dec_handler *dec_handler;
void (*evt_handler)(struct audio_decoder *dec, int, int *);
void *dec_priv;
void *bp;
u16 id;
u16 pick : 1;
u16 tws : 1;
u16 resume_flag : 1;
u16 output_err : 1;
u16 read_err : 1;
u16 reserved : 11;
u8 run_max;
u8 output_channel;
u8 state;
u8 err;
u8 remain;
u32 magic;
};
#define AUDIO_DEC_ORIG_CH AUDIO_CH_LR
#define AUDIO_DEC_L_CH AUDIO_CH_L
#define AUDIO_DEC_R_CH AUDIO_CH_R
#define AUDIO_DEC_MONO_LR_CH AUDIO_CH_DIFF
#define AUDIO_DEC_DUAL_L_CH AUDIO_CH_DUAL_L
#define AUDIO_DEC_DUAL_R_CH AUDIO_CH_DUAL_R
#define AUDIO_DEC_DUAL_LR_CH AUDIO_CH_DUAL_LR
#define AUDIO_DEC_IS_MONO(ch) (((ch)==AUDIO_DEC_L_CH) || ((ch)==AUDIO_DEC_R_CH) || ((ch)==AUDIO_DEC_MONO_LR_CH))
int audio_decoder_task_create(struct audio_decoder_task *task, const char *name);
int audio_decoder_task_add_wait(struct audio_decoder_task *, struct audio_res_wait *);
void audio_decoder_task_del_wait(struct audio_decoder_task *, struct audio_res_wait *);
int audio_decoder_task_wait_state(struct audio_decoder_task *task);
int audio_decoder_resume_all(struct audio_decoder_task *task);
int audio_decoder_resume_off_limits(struct audio_decoder_task *task, u8 limit_num, int *limit_dec);
int audio_decoder_resume_all_by_sem(struct audio_decoder_task *task, int time_out);
int audio_decoder_fmt_lock(struct audio_decoder_task *task, int fmt);
int audio_decoder_fmt_unlock(struct audio_decoder_task *task, int fmt);
void *audio_decoder_get_output_buff(void *_dec, int *len);
int audio_decoder_put_output_buff(void *_dec, void *buff, int len, void *priv);
int audio_decoder_read_data(void *_dec, u8 *data, int len, u32 offset);
int audio_decoder_get_input_data_len(void *_dec);
int audio_decoder_get_frame(void *_dec, u8 **frame);
int audio_decoder_fetch_frame(void *_dec, u8 **frame);
void audio_decoder_put_frame(void *_dec, u8 *frame);
int audio_fmt_find_frame(void *_dec, u8 **frame);
int audio_decoder_open(struct audio_decoder *dec, const struct audio_dec_input *input,
struct audio_decoder_task *task);
int audio_decoder_data_type(void *_dec);
void audio_decoder_set_id(struct audio_decoder *dec, int);
int audio_decoder_get_fmt(struct audio_decoder *dec, struct audio_fmt **fmt);
int audio_decoder_set_fmt(struct audio_decoder *dec, struct audio_fmt *fmt);
int audio_decoder_get_fmt_info(struct audio_decoder *dec, struct audio_fmt *fmt);
void audio_decoder_set_handler(struct audio_decoder *dec, const struct audio_dec_handler *handler);
void audio_decoder_set_event_handler(struct audio_decoder *dec,
void (*handler)(struct audio_decoder *, int, int *), u32 magic);
void audio_decoder_set_input_buff(struct audio_decoder *dec, u8 *buff, u16 buff_size);
void audio_decoder_set_output_buffs(struct audio_decoder *dec, s16 *buffs,
u16 buff_size, u8 buff_num);
int audio_decoder_set_output_channel(struct audio_decoder *dec, enum audio_channel);
int audio_decoder_start(struct audio_decoder *dec);
int audio_decoder_stop(struct audio_decoder *dec);
int audio_decoder_pause(struct audio_decoder *dec);
int audio_decoder_suspend(struct audio_decoder *dec, int timeout_ms);
int audio_decoder_resume(struct audio_decoder *dec);
int audio_decoder_close(struct audio_decoder *dec);
int audio_decoder_reset(struct audio_decoder *dec);
int audio_decoder_set_breakpoint(struct audio_decoder *dec, struct audio_dec_breakpoint *bp);
int audio_decoder_get_breakpoint(struct audio_decoder *dec, struct audio_dec_breakpoint *bp);
int audio_decoder_forward(struct audio_decoder *dec, int step_s);
int audio_decoder_rewind(struct audio_decoder *dec, int step_s);
int audio_decoder_get_total_time(struct audio_decoder *dec);
int audio_decoder_get_play_time(struct audio_decoder *dec);
int audio_decoder_set_pick_stu(struct audio_decoder *dec, u8 pick);
int audio_decoder_get_pick_stu(struct audio_decoder *dec);
int audio_decoder_set_tws_stu(struct audio_decoder *dec, u8 tws);
int audio_decoder_get_tws_stu(struct audio_decoder *dec);
int audio_decoder_set_run_max(struct audio_decoder *dec, u8 run_max);
void audio_decoder_dual_switch(u8 ch_type, u8 half_lr, s16 *data, int len);
int audio_decoder_running_number(struct audio_decoder_task *task);
int audio_decoder_ioctrl(struct audio_decoder *dec, u32 cmd, void *parm);
void audio_decoder_set_channel(void *_dec, u8 ch_num);
int audio_decoder_get_channel(void *_dec);
int audio_decoder_get_frame_len(void *_dec);
int audio_decoder_get_sample_rate(void *_dec);
int audio_decoder_get_bit_rate(void *_dec);
#endif
+211
View File
@@ -0,0 +1,211 @@
/*
*******************************************************************
* Audio Common Definitions
*
*Note(s):
* (1)Only macro definitions can be defined here.
* (2)Use (1UL << (n)) instead of BIT(n)
*******************************************************************
*/
#ifndef _AUDIO_DEF_H_
#define _AUDIO_DEF_H_
/*
*******************************************************************
* DAC Definitions
*******************************************************************
*/
#define DAC_DSM_6MHz (0)
#define DAC_DSM_12MHz (1)
#define DAC_OUTPUT_MONO_L (0) //左声道
#define DAC_OUTPUT_MONO_R (1) //右声道
#define DAC_OUTPUT_LR (2) //立体声
#define DAC_OUTPUT_MONO_LR_DIFF (3) //左右差分输出
#define DAC_OUTPUT_DUAL_LR_DIFF (6) //双声道差分
#define DAC_OUTPUT_FRONT_LR_REAR_L (7) //三声道单端输出 前L+前R+后L (不可设置vcmo公共端)
#define DAC_OUTPUT_FRONT_LR_REAR_R (8) //三声道单端输出 前L+前R+后R (可设置vcmo公共端)
#define DAC_OUTPUT_FRONT_LR_REAR_LR (9) //四声道单端输出
#define DAC_BIT_WIDTH_16 (0) //16bit 位宽
#define DAC_BIT_WIDTH_24 (1) //24bit 位宽
#define DAC_CH_FL (1UL << (0))
#define DAC_CH_FR (1UL << (1))
#define DAC_CH_RL (1UL << (2))
#define DAC_CH_RR (1UL << (3))
#define DAC_ANALOG_OPEN_PREPARE (1) //DAC打开前,即准备打开
#define DAC_ANALOG_OPEN_FINISH (2) //DAC打开后,即打开完成
#define DAC_ANALOG_CLOSE_PREPARE (3) //DAC关闭前,即准备关闭
#define DAC_ANALOG_CLOSE_FINISH (4) //DAC关闭后,即关闭完成
#define DAC_ANALOG_START (5) //DAC开始播放,硬件已经打开
#define DAC_ANALOG_STOP (6) //DAC停止播放,硬件还未关闭
/*
*******************************************************************
* Class-D Driver Definitions
*******************************************************************
*/
#define CLASSD_IO_OUTPUT_P (1UL << (0))
#define CLASSD_IO_OUTPUT_N (1UL << (1))
#define CLASSD_PA_MODE (1UL << (0))
#define CLASSD_APIO_MODE (1UL << (1))
#define CLASSD_GPIO_MODE (1UL << (2))
#define EPA_DSM_MODE_375K (0)
#define EPA_DSM_MODE_750K (1)
#define EPA_DSM_MODE_1500K (2)
#define EPA_PWM_MODE0 (0)
#define EPA_PWM_MODE1 (1)
#define EPA_PWM_MODE2 (2)
/*
*******************************************************************
* ADC Definitions
*******************************************************************
*/
#define ADC_BIT_WIDTH_16 (0) //16bit 位宽
#define ADC_BIT_WIDTH_24 (1) //24bit 位宽
#define ADC_AIN_PORT0 (1UL << (0))
#define ADC_AIN_PORT1 (1UL << (1))
#define ADC_AIN_PORT2 (1UL << (2))
#define ADC_AIN_PORT3 (1UL << (3))
#define ADC_AIN_PORT4 (1UL << (4))
//ADC输入模式定义
#define ADC_SINGLE_END (0) //单端输入模式
#define ADC_DIFF_END (1) //差分输入模式
#define ADC_CAPLESS_END (2) //省电容输入模式
/*
*******************************************************************
* Codec Definitions
*******************************************************************
*/
#define AUDIO_CODING_UNKNOW 0x00000000
#define AUDIO_CODING_MP3 0x00000001
#define AUDIO_CODING_WMA 0x00000002
#define AUDIO_CODING_WAV 0x00000004
#define AUDIO_CODING_JLA_LW 0x00000008
#define AUDIO_CODING_SBC 0x00000010
#define AUDIO_CODING_MSBC 0x00000020
#define AUDIO_CODING_G729 0x00000040
#define AUDIO_CODING_CVSD 0x00000080
#define AUDIO_CODING_PCM 0x00000100
#define AUDIO_CODING_AAC 0x00000200
#define AUDIO_CODING_MTY 0x00000400
#define AUDIO_CODING_FLAC 0x00000800
#define AUDIO_CODING_APE 0x00001000
#define AUDIO_CODING_M4A 0x00002000
#define AUDIO_CODING_AMR 0x00004000
#define AUDIO_CODING_DTS 0x00008000
#define AUDIO_CODING_APTX 0x00010000
#define AUDIO_CODING_LDAC 0x00020000
#define AUDIO_CODING_G726 0x00040000
#define AUDIO_CODING_MIDI 0x00080000
#define AUDIO_CODING_OPUS 0x00100000
#define AUDIO_CODING_SPEEX 0x00200000
#define AUDIO_CODING_LC3 0x00400000
#define AUDIO_CODING_WTGV2 0x01000000
#define AUDIO_CODING_ALAC 0x02000000
#define AUDIO_CODING_SINE 0x04000000
#define AUDIO_CODING_F2A 0x08000000
#define AUDIO_CODING_AIFF 0x10000000
#define AUDIO_CODING_JLA 0x20000000
#define AUDIO_CODING_OGG 0x40000000
#define AUDIO_CODING_LHDC 0x80000000
#define AUDIO_CODING_STENC_OPUS 0xB0000000
#define AUDIO_CODING_STREAM_MP3 0xE0000000
//#define AUDIO_CODING_STU_PICK 0x10000000
//#define AUDIO_CODING_STU_APP 0x20000000
//MSBC Dec Debug
#define CONFIG_MSBC_INPUT_FRAME_REPLACE_DISABLE 0
#define CONFIG_MSBC_INPUT_FRAME_REPLACE_SILENCE 1
#define CONFIG_MSBC_INPUT_FRAME_REPLACE_SINE 2
/*
*******************************************************************
* Linein(Aux) Definitions
*******************************************************************
*/
/*
*******************************************************************
* ANC Definitions
*******************************************************************
*/
//ANC Mode Enable
#define ANC_FF_EN (1UL << (0))
#define ANC_FB_EN (1UL << (1))
#define ANC_HYBRID_EN (1UL << (2))
//ANC芯片版本定义
#define ANC_VERSION_BR30 0x01 //AD697N/AC897N
#define ANC_VERSION_BR30C 0x02 //AC699N/AD698N
#define ANC_VERSION_BR36 0x03 //AC700N
#define ANC_VERSION_BR28 0x04 //JL701N/BR40
#define ANC_VERSION_BR28_MULT 0xA4 //JL701N 多滤波器
#define ANC_VERSION_BR50 0x05 //JL708N
/*
*******************************************************************
* Smart Voice Definitions
*******************************************************************
*/
/*离线语音识别语言选择*/
#define KWS_CH 1 /*中文*/
#define KWS_INDIA_EN 2 /*印度英语*/
#define KWS_FAR_CH 3 /*音箱中文*/
/*
*******************************************************************
* Bluetooth Audio Definitions
*******************************************************************
*/
/*TWS通话,从机是否出声*/
#define TWS_ESCO_MASTER_AND_SLAVE 1 //TWS通话主从机同时出声
#define TWS_ESCO_ONLY_MASTER 2 //TWS通话只有主机出声
/*
*******************************************************************
* Common Definitions
*******************************************************************
*/
#define VOL_TYPE_DIGITAL 0 //软件数字音量
#define VOL_TYPE_ANALOG 1 //硬件模拟音量
#define VOL_TYPE_AD 2 //联合音量(模拟数字混合调节)
#define VOL_TYPE_DIGITAL_HW 3 //硬件数字音量
//数据位宽定义
#define DATA_BIT_WIDE_16BIT 0
#define DATA_BIT_WIDE_24BIT 1
#define DATA_BIT_WIDE_32BIT 2
#define DATA_BIT_WIDE_32BIT_FLOAT 3
/*
*******************************************************************
* Effect Definitions
*******************************************************************
*/
//算法输入输出位宽使能位定义
#define EFx_BW_16t16 (1UL << (0))
#define EFx_BW_16t32 (1UL << (1))
#define EFx_BW_32t16 (1UL << (2))
#define EFx_BW_32t32 (1UL << (3))
//Limiter精度使能位定义
#define LIMITER_PRECISION_HIGH_NORMAL_LOW (1UL << (4))//高、普通、最低
#define LIMITER_PRECISION_MAX (1UL << (5)) //最高
#endif/*_AUDIO_DEF_H_*/
@@ -0,0 +1,12 @@
#ifndef _HPEST_LOOP_
#define _HPEST_LOOP_
void anc_HpEst_loop(s16 *input0, s16 *input1, float *out0_sum, float *out1_sum, int len);
void anc_HpEst_loop_out(float *out0_sum, float *out1_sum, int flen);
void anc_HpEst_loop4096(s16 *input0, s16 *input1, float *out0_sum, float *out1_sum, int len);
void anc_HpEst_psd(s16 *input0, float *out0_sum, int len, int *cnt);
void anc_HpEst_psd_out(float *out0_sum, int flen, int cnt);
#endif
+160
View File
@@ -0,0 +1,160 @@
#ifndef AUDIO_ENCODER_H
#define AUDIO_ENCODER_H
#include "generic/typedef.h"
#include "generic/list.h"
#include "generic/circular_buf.h"
#include "media/audio_base.h"
enum {
AUDIO_ENC_EVENT_CURR_TIME = 0x20,
AUDIO_ENC_EVENT_END,
AUDIO_ENC_EVENT_ERR,
AUDIO_ENC_EVENT_SUSPEND,
AUDIO_ENC_EVENT_RESUME,
};
struct audio_encoder_task {
struct list_head head;
const char *name;
};
struct audio_encoder;
struct audio_enc_input {
int (*fget)(struct audio_encoder *, s16 **frame, u16 frame_len);
void (*fput)(struct audio_encoder *, s16 *frame);
};
struct audio_enc_handler {
int (*enc_probe)(struct audio_encoder *);
int (*enc_output)(struct audio_encoder *, u8 *data, int len);
int (*enc_post)(struct audio_encoder *);
int (*enc_close)(struct audio_encoder *);//add by wuxu 20200221
};
struct audio_encoder_ops {
u32 coding_type;
void *(*open)(void *priv);
int (*start)(void *);
int (*set_fmt)(void *, struct audio_fmt *fmt);
int (*run)(void *);
int (*stop)(void *);
int (*close)(void *);
int (*ioctrl)(void *, int argc, int argv[]);
};
#define REGISTER_AUDIO_ENCODER(ops) \
const struct audio_encoder_ops ops SEC(.audio_encoder)
extern const struct audio_encoder_ops audio_encoder_begin[];
extern const struct audio_encoder_ops audio_encoder_end[];
#define list_for_each_audio_encoder(p) \
for (p = audio_encoder_begin; p < audio_encoder_end; p++)
#define AUDIO_ENC_OS_MUTEX_EN 1
#if (AUDIO_ENC_OS_MUTEX_EN)
#include "os/os_api.h"
#endif//AUDIO_ENC_OS_MUTEX_EN
struct audio_encoder {
struct list_head entry;
struct audio_encoder_task *task;
struct audio_fmt fmt;
const char *evt_owner;
const struct audio_enc_input *input;
const struct audio_encoder_ops *enc_ops;
const struct audio_enc_handler *enc_handler;
void (*evt_handler)(struct audio_encoder *enc, int, int *);
void *enc_priv;
u32 pend_timeout;
s16 *pcm_frame;
u16 pcm_remain;
u16 pcm_len;
s16 *output_buffs;
u16 output_buff_size;
u8 output_buff_num;
u8 curr_output_buff;
u8 output_channel;
u8 state;
u8 err;
volatile u8 resume_flag;
u32 magic;
#if (AUDIO_ENC_OS_MUTEX_EN)
OS_MUTEX mutex;
#endif//AUDIO_ENC_OS_MUTEX_EN
};
enum {
AUDIO_ENCODER_IOCTRL_CMD_GET_HEAD_INFO = 0x0,
AUDIO_ENCODER_IOCTRL_CMD_GET_TIME,
AUDIO_ENCODER_IOCTRL_CMD_GET_TMARK,//书签
};
int audio_encoder_task_create(struct audio_encoder_task *task, const char *name);
int audio_encoder_task_del(struct audio_encoder_task *task);
int audio_encoder_resume_all(struct audio_encoder_task *task);
int audio_encoder_get_output_buff(void *_enc, s16 **buf);
int audio_encoder_put_output_buff(void *_enc, void *buff, int len);
int audio_encoder_get_frame(void *_enc, s16 **frame, u16 len);
void audio_encoder_put_frame(void *_enc, s16 *frame);
int audio_encoder_open(struct audio_encoder *enc, const struct audio_enc_input *input,
struct audio_encoder_task *task);
int audio_encoder_get_fmt(struct audio_encoder *enc, struct audio_fmt **fmt);
int audio_encoder_set_fmt(struct audio_encoder *enc, struct audio_fmt *fmt);
void audio_encoder_set_handler(struct audio_encoder *enc, const struct audio_enc_handler *handler);
void audio_encoder_set_event_handler(struct audio_encoder *enc,
void (*handler)(struct audio_encoder *, int, int *), u32 maigc);
void audio_encoder_set_input_buff(struct audio_encoder *enc, u8 *buff, u16 buff_size);
void audio_encoder_set_output_buffs(struct audio_encoder *enc, s16 *buffs,
u16 buff_size, u8 buff_num);
int audio_encoder_set_output_channel(struct audio_encoder *enc, enum audio_channel);
int audio_encoder_start(struct audio_encoder *enc);
int audio_encoder_stop(struct audio_encoder *enc);
int audio_encoder_suspend(struct audio_encoder *enc, int timeout_ms);
int audio_encoder_resume(struct audio_encoder *enc);
int audio_encoder_close(struct audio_encoder *enc);
int audio_encoder_ioctrl(struct audio_encoder *enc, int argc, ...);
/*
*********************************************************************
* Audio Encoder Get channel
* Description: 获取编码器声道配置参数
* Arguments : *enc 编码句柄
* Return : 声道数
* Note(s) : None
*********************************************************************
*/
int audio_encoder_get_channel(struct audio_encoder *enc);
#endif
+111
View File
@@ -0,0 +1,111 @@
/*******************************************************************************************
File : audio_energy_detect.h
By : LinHaibin
brief: 数据能量检测
memory : 148 + 56 * channels (Byte)
mips:
dcc mode: 3MHz / 44100 points / 2channel / sec
nodcc mode: 2.3MHz / 44100 points / 2channel / sec
Email: linhaibin@zh-jieli.com
date : Fri, 24 Jul 2020 18:11:37 +0800
********************************************************************************************/
#ifndef _AUDIO_ENERGY_DETECT_H_
#define _AUDIO_ENERGY_DETECT_H_
#include "typedef.h"
#define AUDIO_E_DET_UNMUTE (0x00)
#define AUDIO_E_DET_MUTE (0x01)
typedef struct _audio_energy_detect_param {
s16 mute_energy; // mute 阈值
s16 unmute_energy; // unmute 阈值
u16 mute_time_ms; // 能量低于mute阈值进入mute状态时间
u16 unmute_time_ms; // 能量高于unmute阈值进入unmute状态时间
u32 sample_rate; // 采样率
void *prive;
void (*event_handler)(void *prive, u8, u8, u8 ch_total); // 事件回调函数 event channel
u16 count_cycle_ms; // 能量计算的时间周期
u8 ch_total; // 通道总数
u8 pcm_mute; // 保留,未使用
u8 onoff; // 保留,未使用
u8 skip; // 1:数据不处理 0:处理
u8 dcc; // 1:去直流打开 0:关闭
u8 bit_width;
} audio_energy_detect_param;
extern void *audio_energy_detect_entry_get(void *_hdl);
extern void *audio_energy_detect_open(audio_energy_detect_param *param);
extern int audio_energy_detect_run(void *_hdl, s16 *data, u32 len);
extern int audio_energy_detect_close(void *_hdl);
extern int audio_energy_detect_skip(void *_hdl, u32 channel, u8 skip);
extern int audio_energy_detect_energy_get(void *_hdl, u8 ch);
extern int audio_energy_detect_sample_rate_update(void *_hdl, u32 sample_rate);
extern void audio_energy_set_event_handler(void *_hdl, void *prive, void (*event_handler)(void *prive, u8, u8, u8 ch_total));
struct energy_detect_parm_tool_cfg {
s16 is_bypass;
s16 mute_energy; // mute 阈值 (0~32767)
s16 unmute_energy; // unmute 阈值(0~32767) unmute > mute
u16 mute_time_ms; // 能量低于mute阈值进入mute状态时间(1~30000)ms (min >= cyc_time)
u16 unmute_time_ms; // 能量高于unmute阈值进入unmute状态时间(1~30000)ms
u16 count_cycle_ms; // 能量计算的时间周期(1~1000)ms
u16 dcc; // 1:去直流打开 0:关闭
} __attribute__((packed));
struct energy_detect_get_parm {
char name[16];
int type;
void (*event_handler)(void *prive, u8, u8, u8 ch_total); // 事件回调函数 event channel
};
struct audio_get_energy {
char name[16];
int tar_ch;//目标通道,(BIT(0)对应通道0,如此类推)
int energy;//目标通道的能量值
};
#define SET_ENERGY_DET_EVENT_HANDLER 0xaa
/******************************************************************************
audio energy detect demo
INCLUDE:
#include "application/audio_energy_detect.h"
void *audio_e_det_hdl = NULL;
struct list_head *audio_e_det_entry = NULL;
void test_e_det_handler(void *prive,u8 event, u8 ch)
{
printf(">>>> ch:%d %s\n", ch, event ? ("MUTE") : ("UNMUTE"));
// ch < ch_total 时:表示通道(ch)触发的事件
// ch = ch_total 时:表示全部通道都触发的事件
}
OPEN:
audio_energy_detect_param e_det_param = {0};
e_det_param.mute_energy = 5;
e_det_param.unmute_energy = 10;
e_det_param.mute_time_ms = 100;
e_det_param.unmute_time_ms = 50;
e_det_param.count_cycle_ms = 100;
e_det_param.sample_rate = 44100;
e_det_param.event_handler = test_e_det_handler;
e_det_param.ch_total = 2;
e_det_param.dcc = 1;
audio_e_det_hdl = audio_energy_detect_open(&e_det_param);
1.接入 audio stream
audio_e_det_entry = audio_energy_detect_entry_get(audio_e_det_hdl);
entries[entry_cnt++] = audio_e_det_entry;
2.手动调用
audio_energy_detect_run(audio_e_det_hdl, data, len);
// data:需要运算的音频数据起始地址 len:需要运算的音频数据总字节长度
CLOSE:
audio_energy_detect_close(audio_e_det_hdl);
******************************************************************************/
#endif // #ifndef _AUDIO_ENERGY_DETECT_H_
+14
View File
@@ -0,0 +1,14 @@
#ifndef _AUDIO_EVENT_MANAGER_H_
#define _AUDIO_EVENT_MANAGER_H_
#include "generic/typedef.h"
enum audio_lib_event {
AUDIO_LIB_EVENT_DAC_LOWPOWER,
AUDIO_LIB_EVENT_VBG_TRIM_WRITE,
AUDIO_LIB_EVENT_VBG_TRIM_READ,
};
int audio_event_notify(enum audio_lib_event event, void *priv, int arg);
#endif
+19
View File
@@ -0,0 +1,19 @@
#ifndef _AUDIO_GENERAL_H
#define _AUDIO_GENERAL_H
#include "generic/typedef.h"
struct audio_general_params {
int sample_rate;
u8 system_bit_width;
u8 media_bit_width;
u8 esco_bit_width;
u8 mic_bit_width;
u8 usb_audio_bit_width;
};
struct audio_general_params *audio_general_get_param(void);
int audio_general_out_dev_bit_width();
int audio_general_in_dev_bit_width();
int audio_general_init();
#endif
+36
View File
@@ -0,0 +1,36 @@
#ifndef _AUDIO_SPLICING_H_
#define _AUDIO_SPLICING_H_
#include "generic/typedef.h"
void pcm_single_to_dual(void *out, void *in, u16 len);
void pcm_single_to_dual_with_slience(void *out, void *in, u16 len, u8 slience);
void pcm_single_to_qual(void *out, void *in, u16 len);
void pcm_dual_to_qual(void *out, void *in, u16 len);
void pcm_dual_to_qual_with_slience(void *out, void *in, u16 len, u8 slience);
void pcm_dual_mix_to_dual(void *out, void *in, u16 len);
void pcm_dual_to_single(void *out, void *in, u16 len);
void pcm_dual_to_single_optional(void *out, void *in, u16 len, u8 channel_mode);
void pcm_qual_to_single(void *out, void *in, u16 len);
void pcm_single_l_r_2_dual(void *out, void *in_l, void *in_r, u16 in_len);
void pcm_fl_fr_rl_rr_2_qual(void *out, void *in_fl, void *in_fr, void *in_rl, void *in_rr, u16 in_len);
void pcm_flfr_rlrr_2_qual(void *out, void *in_flfr, void *in_rlrr, u16 in_len);
void pcm_fill_single_2_qual(void *out, void *in, u16 in_len, u8 idx);
void pcm_fill_flfr_2_qual(void *out, void *in_flfr, u16 in_len);
void pcm_fill_rlrr_2_qual(void *out, void *in_rlrr, u16 in_len);
void pcm_mix_buf(s32 *obuf, s16 *ibuf, u16 len);
void pcm_mix_buf_limit(s16 *obuf, s32 *ibuf, u16 len);
// 四声道转双声道(q0+q2,q1+q3
void pcm_qual_to_dual(void *out, void *in, u16 len);
void pcm_single_to_dual_32bit(void *out, void *in, u16 len);
void pcm_qual_to_dual_32bit(void *out, void *in, u16 len);
void pcm_qual_to_single_32bit(void *out, void *in, u16 len);
void pcm_dual_to_qual_with_slience_32bit(void *out, void *in, u16 len, u8 slience);
void pcm_dual_to_single_32bit(void *out, void *in, u16 len);
void pcm_dual_to_single_32bit_optional(void *out, void *in, u16 len, u8 channel_mode);
void pcm_single_to_qual_32bit(void *out, void *in, u16 len);
void pcm_single_to_dual_with_slience_32bit(void *out, void *in, u16 len, u8 slience);
#endif/*_AUDIO_SPLICING_H_*/
+55
View File
@@ -0,0 +1,55 @@
/*****************************************************************
>file name : audio_src.h
>author : lichao
>create time : Fri 14 Dec 2018 03:05:49 PM CST
*****************************************************************/
#ifndef _AUDIO_SRC_H_
#define _AUDIO_SRC_H_
#include "system/includes.h"
#include "audio_src_base.h"
#define SRC_TYPE_NONE 0
#define SRC_TYPE_RESAMPLE 1
#define SRC_TYPE_AUDIO_SYNC 2
struct audio_src_buffer {
void *addr;
int len;
};
// *INDENT-OFF*
struct audio_src_handle {
void *base;
struct audio_src_buffer output;
void *output_priv;
int (*output_handler)(void *priv, void *data, int len);
u8 *remain_addr;
int remain_len;
u8 output_malloc;
};
// *INDENT-ON*
int audio_hw_src_open(struct audio_src_handle *src, u8 channel, u8 type);
int audio_hw_src_set_rate(struct audio_src_handle *src, u32 input_rate, u32 output_rate);
int audio_hw_src_bufferd_frames(struct audio_src_handle *src);
int audio_src_resample_write(struct audio_src_handle *src, void *data, int len);
void audio_src_set_output_handler(struct audio_src_handle *src, void *priv,
int (*handler)(void *, void *, int));
int audio_hw_src_set_input_buffer(struct audio_src_handle *src, void *addr, int len);
int audio_hw_src_set_output_buffer(struct audio_src_handle *src, void *addr, int len);
int audio_hw_src_stop(struct audio_src_handle *src);
void audio_hw_src_close(struct audio_src_handle *src);
int audio_hw_src_trigger_resume(struct audio_src_handle *src, void *priv, void (*callback)(void *));
int audio_src_push_data_out(struct audio_src_handle *src);
u8 audio_src_get_hw_src_id(struct audio_src_handle *src);
#endif
+82
View File
@@ -0,0 +1,82 @@
/*****************************************************************
>file name : audio_src_base.h
>create time : Wed 02 Mar 2022 11:12:07 AM CST
*****************************************************************/
#ifndef _AUDIO_SRC_BASE_H_
#define _AUDIO_SRC_BASE_H_
#include "typedef.h"
#define AUDIO_ONLY_RESAMPLE 1
#define AUDIO_SYNC_RESAMPLE 2
#define AUDIO_LOW_LATENCY_RESAMPLE 3
#define AUDIO_RESAMPLE_SYNC_OUTPUT 4
#define AUDIO_SRC_HIGH_PERFORMANCE 5
#define AUDIO_SAMPLE_FMT_16BIT 0
#define AUDIO_SAMPLE_FMT_24BIT 1
#define BIND_AUDSYNC 0x10
#define SET_RESAMPLE_TYPE(fmt, type) (((fmt) << 4) | (type))
#define RESAMPLE_TYPE_TO_FMT(a) (((a) >> 4) & 0xf)
#define RESAMPLE_TYPE(a) ((a) & 0xf)
#define INPUT_FRAME_BITS 18//20 -- 整数位减少可提高单精度浮点的运算精度
#define RESAMPLE_INPUT_BIT_RANGE ((1 << INPUT_FRAME_BITS) - 1)
#define RESAMPLE_INPUT_BIT_NUM (1 << INPUT_FRAME_BITS)
struct resample_frame {
u8 nch;
int offset;
int len;
int size;
void *data;
};
void *audio_src_base_open(u8 channel, int in_sample_rate, int out_sample_rate, u8 type);
int audio_src_base_set_output_handler(void *resample,
void *priv,
int (*handler)(void *priv, void *data, int len));
int audio_src_base_set_channel(void *resample, u8 channel);
int audio_src_base_set_in_buffer(void *resample, void *buf, int len);
int audio_src_base_set_input_buff(void *resample, void *buf, int len);
int audio_src_base_resample_config(void *resample, int in_rate, int out_rate);
int audio_src_base_write(void *resample, void *data, int len);
int audio_src_base_stop(void *resample);
int audio_src_base_run_scale(void *resample);
int audio_src_base_input_frames(void *resample);
u32 audio_src_base_out_frames(void *resample);
float audio_src_base_position(void *resample);
int audio_src_base_scale_output(void *resample, int in_sample_rate, int out_sample_rate, int frames);
int audio_src_base_bufferd_frames(void *resample);
int audio_src_base_set_silence(void *resample, u8 silence, int fade_time);
int audio_src_base_wait_irq_callback(void *resample, void *priv, void (*callback)(void *));
int audio_src_base_frame_resample(void *resample, struct resample_frame *in_frame, struct resample_frame *out_frame);
int audio_src_base_get_phase(void *resample);
void audio_src_base_close(void *resample);
int audio_src_base_filter_frames(void *resample);
u8 audio_src_base_get_hw_core_id(void *resample);
int audio_src_base_push_data_out(void *resample);
#endif
+321
View File
@@ -0,0 +1,321 @@
#ifndef AUDIO_STREAM_H
#define AUDIO_STREAM_H
#include "generic/includes.h"
#include "media/audio_base.h"
// 数据流IOCTRL命令
#define AUDIO_STREAM_IOCTRL_CMD_CHECK_ACTIVE (1) // 检查数据流是否活动
struct audio_stream_entry;
struct audio_frame_copy;
/*
* 数据流中的传输内容
*/
struct audio_data_frame {
u8 channel; // 通道数
u16 stop : 1; // 数据流停止标志
u16 data_sync : 1; // 数据流同步标志
u16 no_subsequent : 1; // 1-不再执行后续的数据流;0-正常执行
u32 sample_rate; // 采样率
u16 offset; // 数据偏移
u16 data_len; // 数据长度
s16 *data; // 数据地址
};
/*
* 数据流
* 多个数据流节点组成一个数据流
*/
struct audio_stream {
struct audio_stream_entry *entry; // 数据流节点
void *priv; // resume私有参数
void (*resume)(void *priv); // 激活回调接口
};
/*
* 数据流群组
* 用于串联多个数据流,在调用resume/clear等操作时依次处理各个数据流
* 如数据流stream0最后一个节点是entry0_n,数据流1最后一个节点是entry1_n
* 把这两个数据流加入到群组test_group中
* audio_stream_group_add_entry(&test_group, &entry0_n);
* audio_stream_group_add_entry(&test_group, &entry1_n);
* 另一个数据流streamX的第一个节点是entryX_0,把群组关联到streamX数据流
* entryX_0.group = &test_group;
* 那么调用streamX中的resume就会依次调用stream0和stream1的resume了
*/
struct audio_stream_group {
struct audio_stream_entry *entry; // 数据流节点
};
/*
* 数据流节点
* 数据流节点依次串联,数据依次往后传递
*/
struct audio_stream_entry {
u8 pass_by; // 1-同步处理(即往后传的buf就是上层传入的buf);
// 0-异步处理(数据存到其他buf再往后传)
u8 remain; // 1-上次数据没输出完。0-上次数据输出完
u16 offset; // 同步处理时的数据偏移
struct audio_stream *stream; // 所属的数据流
struct audio_stream_entry *input; // 上一个节点
struct audio_stream_entry *output; // 下一个节点
struct audio_stream_entry *sibling; // 数据流群组中的数据流节点链表
struct audio_stream_group *group; // 数据流群组节点
struct audio_frame_copy *frame_copy; // 数据分支节点
int (*prob_handler)(struct audio_stream_entry *, struct audio_data_frame *in); // 预处理
int (*data_handler)(struct audio_stream_entry *, struct audio_data_frame *in,
struct audio_data_frame *out); // 数据处理
void (*data_process_len)(struct audio_stream_entry *, int len); // 后级返回使用的数据长度
void (*data_clear)(struct audio_stream_entry *); // 清除节点数据
int (*ioctrl)(struct audio_stream_entry *, int cmd, int *param); // 节点IOCTRL
};
/*
* 数据流分支
* 支持一传多(分支)功能,内部自动生成struct audio_frame_copy来处理多个分支
* 有多少个分支就会申请多少个空间,数据分别拷贝到对应分支空间然后往后传递
*/
struct audio_frame_copy {
struct list_head head; // 链表。用于连接各个分支
struct audio_data_frame frame; // 保存上层的传输内容
struct audio_stream_entry entry; // 连接上层的节点
};
/*
*********************************************************************
* Audio Stream Open
* Description: 创建一个数据流
* Arguments : *priv resume回调的私有参数
* resume 模块唤醒数据流时的回调函数
* Return : 数据流句柄
* Note(s) : None.
*********************************************************************
*/
struct audio_stream *audio_stream_open(void *priv, void (*resume)(void *priv));
/*
*********************************************************************
* Audio Stream Add First
* Description: 添加第一个数据流节点
* Arguments : *stream 数据流句柄
* *entry 数据流节点句柄
* Return : None.
* Note(s) : 第一个节点一般为解码输出
*********************************************************************
*/
void audio_stream_add_first(struct audio_stream *stream,
struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Add Head
* Description: 将节点插入到数据流的first节点后面
* Arguments : *stream 数据流句柄
* *entry 数据流节点句柄
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_add_head(struct audio_stream *stream,
struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Add Tail
* Description: 将节点放到数据流的最后
* Arguments : *stream 数据流句柄
* *entry 数据流节点句柄
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_add_tail(struct audio_stream *stream,
struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Add Entry
* Description: 将output节点添加到input节点之后
* Arguments : *input 数据流节点句柄
* *output 需要添加的数据流节点句柄
* Return : None.
* Note(s) : 如果input节点后面已经连接有节点,将创建数据流分支处理
*********************************************************************
*/
void audio_stream_add_entry(struct audio_stream_entry *input,
struct audio_stream_entry *output);
/*
*********************************************************************
* Audio Stream Add List
* Description: 将entry数组中节点按顺序添加到数据流中
* Arguments : *stream 数据流句柄
* *entry[] 数据流节点数组
* num 节点总个数
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_add_list(struct audio_stream *stream,
struct audio_stream_entry *entry[], int num);
/*
*********************************************************************
* Audio Stream Delete Entry
* Description: 将节点从数据流中删除
* Arguments : *entry 数据流节点句柄
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_del_entry(struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Delete List Entry
* Description: 依次将数组中的节点删除
* Arguments : *entry[] 数据流节点数组
* num 节点总个数
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_del_list(struct audio_stream_entry *entry[], int num);
/*
*********************************************************************
* Audio Stream Group Add Entry
* Description: 将节点加入到群组之中
* Arguments : *group 数据流群组句柄
* *entry 数据流节点句柄
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_group_add_entry(struct audio_stream_group *group,
struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Group Delete Entry
* Description: 将节点从群组之中删除
* Arguments : *group 数据流群组句柄
* *entry 数据流节点句柄
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_group_del_entry(struct audio_stream_group *group,
struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Group Get Entry Number
* Description: 获取群组中的节点个数
* Arguments : *group 数据流群组句柄
* Return : 节点个数
* Note(s) : None.
*********************************************************************
*/
int audio_stream_group_entry_num(struct audio_stream_group *group);
/*
*********************************************************************
* Audio Stream Run
* Description: 数据处理接口
* Arguments : *entry 数据流节点句柄
* *input 输入数据
* Return : 负数-出错
* Note(s) : 数据流依次递归往后传输。直到最后一个节点,或者no_subsequent==1
* 或者prob_handler/data_handler处理错误返回负数
*********************************************************************
*/
int audio_stream_run(struct audio_stream_entry *from, struct audio_data_frame *input);
/*
*********************************************************************
* Audio Stream Resume
* Description: 唤醒数据流
* Arguments : *entry 数据流节点句柄
* Return : 0-成功
* Note(s) : 最终会递归调用到struct audio_stream结构体中的.resume回调接口
*********************************************************************
*/
int audio_stream_resume(struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Clear From Entry
* Description: 清除指定节点及后续所有节点的数据
* Arguments : *entry 数据流节点句柄
* Return : None.
* Note(s) : 会清除offset/pass_by等记录,并且调用data_clear回调接口清除用户数据
*********************************************************************
*/
void audio_stream_clear_from(struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Clear
* Description: 清除数据流所有节点数据
* Arguments : *stream 数据流句柄
* Return : None.
* Note(s) : 会清除offset/pass_by等记录,并且调用data_clear回调接口清除用户数据
*********************************************************************
*/
void audio_stream_clear(struct audio_stream *stream);
/*
*********************************************************************
* Audio Stream Clear By Entry
* Description: 通过数据流某个节点清除数据流所有节点数据
* Arguments : *entry 数据流节点句柄
* Return : None.
* Note(s) : 先找到数据流起始位置,再调用audio_stream_clear()清除所有节点
*********************************************************************
*/
void audio_stream_clear_by_entry(struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Check Active From Entry
* Description: 检测指定节点及后续节点是否有活动情况
* Arguments : *entry 数据流节点句柄
* Return : true 活动
* Note(s) : 只要中间有某个节点活动就会返回数据流活动
*********************************************************************
*/
int audio_stream_check_active_from(struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Close
* Description: 关闭数据流
* Arguments : *stream 数据流句柄
* Return : None.
* Note(s) : 需关闭所有数据流节点之后才能调用该函数
*********************************************************************
*/
void audio_stream_close(struct audio_stream *stream);
#endif
+60
View File
@@ -0,0 +1,60 @@
#ifndef AUDIO_AUTOMUTE_H
#define AUDIO_AUTOMUTE_H
#include "generic/typedef.h"
#include "generic/list.h"
#define AUDIO_EVENT_AUTO_MUTE 0x10
#define AUDIO_EVENT_AUTO_UNMUTE 0x11
#define AUTOMUTE_CH 4
enum mute_value {
AUDIO_MUTE_DEFAULT = 0,
AUDIO_UNMUTE_DEFAULT,
AUDIO_MUTE_L_CH,
AUDIO_UNMUTE_L_CH,
AUDIO_MUTE_R_CH,
AUDIO_UNMUTE_R_CH,
};
struct pcm_energy {
u32 points; //计算多少个点
u32 point_count;
s32 total_value;
/*void *priv;*/
/*void (*output)(void *, u16, u8);*/
s16 average_value;
};
struct automute_filter {
u32 mute_number;
u32 unmute_number;
u32 mute_count;
u32 unmute_count;
};
struct audio_automute {
struct pcm_energy energy[AUTOMUTE_CH];
void (*handler)(u8 event, u8 channel);
u8 channels;
u8 pcm_mute;
u8 mute_channel;
u8 mute;
u32 mute_energy;
u32 unmute_energy;
u32 filt_points;
u32 filt_mute_number;
u32 filt_unmute_number;
struct automute_filter filt[AUTOMUTE_CH];
u8 on;
u8 skip;
};
int audio_automute_open(struct audio_automute *automute);
void audio_automute_run(struct audio_automute *automute, void *data, int len);
void audio_automute_close(struct audio_automute *automute);
int audio_automute_onoff(struct audio_automute *automute, u8 onoff, u8 need_cb);
void audio_automute_skip(struct audio_automute *automute, u8 skip);
#endif
+57
View File
@@ -0,0 +1,57 @@
/*****************************************************************
>file name : bt_audio_timestamp.h
>create time : Fri 21 May 2021 03:05:35 PM CST
*****************************************************************/
#ifndef _BT_AUDIO_TIMESTAMP_H_
#define _BT_AUDIO_TIMESTAMP_H_
#include "typedef.h"
#define TWS_A2DP_AUDIO 0
#define TWS_ESCO_AUDIO 1
#define TWS_FILE_AUDIO 2
#define TWS_SHARE_AUDIO 3
#define TWS_UNKOWN_AUDIO 8
/*===================================A2DP 音频时间戳接口==================================*/
void *a2dp_audio_timestamp_create(int sample_rate, u32 timestamp, u8 factor);
u32 a2dp_audio_update_timestamp(void *handle, u16 seqn, u32 dts);
void a2dp_audio_delay_offset_update(void *handle, int distance);
int a2dp_audio_sample_rate(void *handle);
bool a2dp_audio_timestamp_is_available(void *handle, u16 seqn, u32 dts, int *drop);
int tws_a2dp_share_timestamp(void *handle);
void a2dp_audio_set_base_time(void *handle, u32 base_time);
void a2dp_audio_timestamp_close(void *handle);
int a2dp_tws_audio_conn_offline(void);
void a2dp_tws_audio_conn_delete(void);
int a2dp_tws_timestamp_event_handler(int event, void *args);
/*========================================================================================*/
/*===================================ESCO 音频时间戳接口==================================*/
void *esco_audio_timestamp_create(u8 frame_clkn, u32 delay_time, u8 factor);
u32 esco_audio_timestamp_update(void *handle, u32 time);
void esco_audio_timestamp_close(void *handle);
/*========================================================================================*/
/*===================================FILE 音频时间戳接口==================================*/
void *file_audio_timestamp_create(u32 magic, int sample_rate, u32 timestamp, u32 delay_time, u8 factor);
bool tws_file_timestamp_available(void *handle);
u32 file_audio_timestamp_update(void *handle, u32 dts);
void file_audio_timestamp_close(void *handle);
/*========================================================================================*/
#endif
@@ -0,0 +1,125 @@
#ifndef AUDIO_DECODE_COMMON_API_H
#define AUDIO_DECODE_COMMON_API_H
#include "cpu.h"
/********************* DEC *********************/
//通用解码器配置信息
#define PLAY_MOD_NORMAL 0x00
#define PLAY_MOD_FF 0x01
#define PLAY_MOD_FB 0x02
#define SET_DECODE_MODE 0x80
typedef struct _AUDIO_DECODE_PARA {
u32 mode;
} AUDIO_DECODE_PARA;
typedef struct _deccfg_inf {
u32 bitwidth; //16_24(s32)
u32 channels; //最多支持的声道数
u32 sr; //最大支持的采样率.
} deccfg_inf;
typedef struct decoder_inf {
u32 sr ; ///< sample rate
u32 br ; ///< bit rate
u32 nch ; ///<声道
u32 total_time; ///<总时间
} dec_inf_t ;
enum { //format_check 格式检查返回值, FORMAT_OK可继续调run,
//sdk根据获取的解码信息位宽、采样率、声道数控制是否支持解码.
FORMAT_OK = 0,
FORMAT_OK_BUT_NO_SUPPORT, //格式正确不支持的其他参数.
FORMAT_ERR,
FORMAT_NOT_DETECTED,
FORMAT_OK_UNSUPPORTED_BPS, //不支持的位宽.
FORMAT_OK_UNSUPPORTED_NSR, //不支持的采样率.
FORMAT_OK_UNSUPPORTED_NCH, //不支持的声道数.
FORMAT_OK_UNSUPPORTED_BLK, //不支持的块长度.
M4A_MEMORY_NOT_ENOUGH = 0x10,
};
//编解码器错误的返回值
enum {
MAD_ERROR_FILE_END = 0x40, //文件结束
MAD_ERROR_FILESYSTEM_ERR = 0x41,
MAD_ERROR_DISK_ERR = 0x42,
MAD_ERROR_SYNC_LIMIT = 0x43,
MAD_ERROR_FF_FR_FILE_END = 0x44, //快进到文件结束了
MAD_ERROR_FF_FR_END = 0x45,
MAD_ERROR_FF_FR_FILE_START = 0x46, //快退到头
MAD_ERROR_LIMIT = 0x47,
MAD_ERROR_NODATA = 0x48, //读不到数了
MAD_ERROR_UNKNOWN_REQ_INDEX_CODEBOOK = 0x49,
MAD_ERROR_BLOCK_CODE_LOOKUP_FAILED = 0x4a,
MAD_ERROR_SUBFRAME_COUNTER = 0x4b,
MAD_ERROR_BITALLOC = 0x4c,
MAD_ERROR_HEADER_CHECK = 0x4d,
MAD_ERROR_FOOTER_CHECK = 0x4e,
MAD_ERROR_SYNC = 0x4f,
MAD_ERROR_DSPBUSY = 0x50,
MAD_ERROR_FRLEN_OVFLOW = 0x60,
MAD_ERROR_DEODE_ELSE_ERR = 0x61,
BT_AAC_NODATA_OR_FRLEN_ERR = 0x62,
DECODER_ERR_OUT_SPACE = 0x80,
DECODER_ERR_UNFINISH,
};
//通用解码器api
struct if_decoder_io {
void *priv ;
int (*input)(void *priv, u32 addr, void *buf, int len, u8 type);
/*
priv -- 私有结构体,由初始化函数提供。
addr -- 文件位置
buf -- 读入地址
len -- 读入长度 512 的整数倍
type -- 0 --同步读(等到数据读回来,函数才返回) ,1 -- 异步读(不等数据读回来,函数就放回)
*/
int (*check_buf)(void *priv, u32 addr, void *buf);
int (*output)(void *priv, void *data, int len);
u32(*get_lslen)(void *priv);
u32(*store_rev_data)(void *priv, u32 addr, int len);
int (*input_fr)(void *priv, void **buf);
};
typedef struct if_decoder_io IF_DECODER_IO;
typedef struct __audio_decoder_ops {
char *name; ///< 解码器名称
u32(*open)(void *work_buf, void *stk_buf, const struct if_decoder_io *decoder_io, u8 *bk_point_ptr, void *dci); ///<打开解码器
u32(*format_check)(void *work_buf, void *stk_buf); ///<格式检查
u32(*run)(void *work_buf, u32 type, void *stk_buf); ///<主循环
dec_inf_t *(*get_dec_inf)(void *work_buf); ///<获取解码信息
u32(*get_playtime)(void *work_buf); ///<获取播放时间
u32(*get_bp_inf)(void *work_buf); ///<获取断点信息;返回断点信息存放的地址
//u32 (*need_workbuf_size)() ; ///<获取整个解码所需的buffer
u32(*need_dcbuf_size)(void *dci); ///<获取解码需要的buffer
u32(*need_skbuf_size)(void *dci); ///<获取解码过程中stack_buf的大小
u32(*need_bpbuf_size)(void *dci); ///<获取保存断点信息需要的buffer的长度
//void (*set_dcbuf)(void* ptr); ///<设置解码buffer
//void (*set_bpbuf)(void *work_buf,void* ptr); ///<设置断点保存buffer
void (*set_step)(void *work_buf, u32 step); ///<设置快进快进步长。
void (*set_err_info)(void *work_buf, u32 cmd, u8 *ptr, u32 size); ///<设置解码的错误条件
u32(*dec_config)(void *work_buf, u32 cmd, void *parm);
} audio_decoder_ops, decoder_ops_t;
#endif
@@ -0,0 +1,37 @@
#ifndef AUDIO_ENCODE_COMMON_API_H
#define AUDIO_ENCODE_COMMON_API_H
#include "cpu.h"
/*********************** ENC *************************/
typedef struct _EN_FILE_IO_ {
void *priv;
u16(*input_data)(void *priv, s16 *buf, u8 channel, u16 len);
u32(*output_data)(void *priv, u8 *buf, u16 len);
} EN_FILE_IO;
typedef struct _ENC_DATA_INFO_ {
u16 sr; ///<sample rate
u16 br; ///<mp2的时候它是bitrate,但是adpcm的时候,它是blockSize,一般配成256/512/1024/2048,超过2048会被限制成2048
u32 nch;
u8 bit_width;
} ENC_DATA_INFO;
typedef struct _ENC_OPS {
u32(*need_buf)(u32 channel);
void (*open)(void *ptr, EN_FILE_IO *audioIO);
void (*set_info)(void *ptr, ENC_DATA_INFO *data_info);
u32(*init)(void *ptr);
u32(*run)(void *ptr);
u8 *(*write_head)(void *ptr, u16 *len);
u32(*get_time)(void *ptr);
} ENC_OPS;
#endif
@@ -0,0 +1,72 @@
#ifndef OPUS_CODEC_API_H
#define OPUS_CODEC_API_H
#include "audio_encode_common_api.h"
#include "audio_decode_common_api.h"
/******************* ENC *******************/
typedef struct _OPUS_EN_FILE_IO_ {
void *priv;
u16(*input_data)(void *priv, s16 *buf, u8 channel, u16 points); //short 2字节一个点.
u32(*output_data)(void *priv, u8 *buf, u16 len); //bytes
} OPUS_EN_FILE_IO;
/******************** DEC **********************/
typedef struct _OPUS_ENC_PARA_ {
int sr; //samplerate: fixed_16000.
int br; //bitrate: old:16000/32000/64000. --->new:16000~80000.16~80kbps.
u16 nch; //channels fixed_1. 仅支持单声道编码.
u16 format_mode; //封装格式: 0:百度无头. 1:酷狗_eng+range. 2:ogg封装,pc软件可播放. 3:size+rangeFinal. 源码可兼容版本.
u16 complexity; //0.1.2.3. 3质量最好.速度要求最高.
u16 frame_ms; //20|40|60|80|100ms.
} OPUS_ENC_PARA;
typedef struct __OPUS_ENC_OPS {
u32(*need_buf)(OPUS_ENC_PARA *para);
u32(*open)(u8 *ptr, OPUS_EN_FILE_IO *audioIO, OPUS_ENC_PARA *para);
u32(*run)(u8 *ptr);
} OPUS_ENC_OPS;
extern OPUS_ENC_OPS *get_opus_enc_ops(void);
typedef struct __OPUSLIB_DEC_OPS {
u32(*need_buf)(int bitwidth);
u32(*open)(u32 *ptr, int br_index, int bitwidth);
u32(*run)(u32 *ptr, char *frame_data, short *frame_out);
} opuslib_dec_ops;
typedef struct _BR_CONTEXT_ {
int br_index;
} BR_CONTEXT;
#define SET_DEC_SR 0x91
// ogg_opus 解码设置
#define SET_OPUS_RAWDTF 0x90 //设置OPUS 为raw 数据. 带8字节packet头(4字节大端包长+4字节range校验值)
#define SET_OPUS_CBR_PKTLEN 0x91 //设置OPUS 为raw 数据 + CBR_OPUS 包长,可能有多帧共用TOC. 返回0设置成功.
typedef struct _AUDIO_OPUS_PKTLEN {
u32 opus_pkt_len; //SET_OPUS_CBR_PKTLEN
} AUDIO_OPUS_PKTLEN;
extern opuslib_dec_ops *getopuslibdec_ops();
#define OPUS_INDATA_SUPPORT_FILE 1 // 支持文件类型数据
#define OPUS_SR_8000_OUT_POINTS (160)
#define OPUS_SR_16000_OUT_POINTS (320)
#endif
+145
View File
@@ -0,0 +1,145 @@
/*
*
* Bluetooth low-complexity, subband codec (SBC) library
*
* Copyright (C) 2008-2010 Nokia Corporation
* Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
* Copyright (C) 2004-2005 Henryk Ploetz <henryk@ploetzli.ch>
* Copyright (C) 2005-2006 Brad Midgley <bmidgley@xmission.com>
*
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifndef __SBC_ENC_H
#define __SBC_ENC_H
#ifdef __cplusplus
extern "C" {
#endif
//typedef unsigned char uint8 ,u8 ,U8 ,uint8_t;
//typedef unsigned short int uint16 ,UINT16 ,U16 ,u16 ,uint16_t;
//typedef unsigned int uint32 ,UINT32,U32 ,u32 ,uint32_t ,uintptr_t;
//typedef signed char sint8 ,s8 ,S8,int8 ,int8_t;
//typedef signed short int sint16 ,SINT16 ,S16 ,s16,int16,INT16,int16_t ;
//typedef signed int sint32 ,SINT32,S32 ,s32,int32 ,INT32;//,;
//typedef unsigned int size_t,ssize_t;
//typedef int int32_t ;
//typedef unsigned __int64 int64_t;
//typedef __int64 uint64_t ;
//#include "typedef.h"
//#include <stdint.h>
//#include <sys/types.h>
#include <stddef.h>
#ifndef __GNUC__
#define SBC_ENCODE
#endif
/* sampling frequency */
#define SBC_FREQ_16000 0x00
#define SBC_FREQ_32000 0x01
#define SBC_FREQ_44100 0x02
#define SBC_FREQ_48000 0x03
/* blocks */
#define SBC_BLK_4 0x00
#define SBC_BLK_8 0x01
#define SBC_BLK_12 0x02
#define SBC_BLK_16 0x03
/* channel mode */
#define SBC_MODE_MONO 0x00
#define SBC_MODE_DUAL_CHANNEL 0x01
#define SBC_MODE_STEREO 0x02
#define SBC_MODE_JOINT_STEREO 0x03
/* allocation method */
#define SBC_AM_LOUDNESS 0x00
#define SBC_AM_SNR 0x01
/* subbands */
#define SBC_SB_4 0x00
#define SBC_SB_8 0x01
/* Data endianness */
#define SBC_LE 0x00
#define SBC_BE 0x01
typedef struct sbc_struct {
unsigned int flags;
unsigned char frequency;
unsigned char blocks;
unsigned char subbands;
unsigned char mode;
unsigned char allocation;
unsigned char bitpool;
unsigned char endian;
void *priv;
void *priv_alloc_base;
} sbc_t;
unsigned int sbc_enc_query(void);
int sbc_init(sbc_t *sbc, unsigned long flags, void *priv);
int sbc_reinit(sbc_t *sbc, unsigned long flags);
unsigned int sbc_parse(sbc_t *sbc, const void *input, size_t input_len);
/* Decodes ONE input block into ONE output block */
unsigned int sbc_decode(sbc_t *sbc, const void *input, size_t input_len,
void *output, size_t output_len, size_t *written);
/* Encodes ONE input block into ONE output block */
unsigned int sbc_encode(sbc_t *sbc, const void *input, size_t input_len,
void *output, size_t output_len, unsigned int *written);
/* Returns the output block size in bytes */
//size_t sbc_get_frame_length(sbc_t *sbc);
/* Returns the time one input/output block takes to play in msec*/
unsigned sbc_get_frame_duration(sbc_t *sbc);
/* Returns the input block size in bytes */
//size_t sbc_get_codesize(sbc_t *sbc);
const char *sbc_get_implementation_info(sbc_t *sbc);
void sbc_finish(sbc_t *sbc);
//#define htons(x) ( ( (((unsigned short)(x)) >>8) & 0xff) | ((((unsigned short)(x)) & 0xff)<<8) )
#ifdef __cplusplus
}
#endif
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
#endif /* __SBC_ENC_H */
+440
View File
@@ -0,0 +1,440 @@
#ifndef _ANC_H_
#define _ANC_H_
#include "generic/typedef.h"
#include "system/task.h"
#include "media/audio_def.h"
#include "asm/audio_adc.h"
enum {
ANCDB_ERR_CRC = 1,
ANCDB_ERR_TAG,
ANCDB_ERR_PARAM,
ANCDB_ERR_STATE,
};
typedef enum {
ANC_OFF = 1, /*关闭模式*/
ANC_ON, /*降噪模式*/
ANC_TRANSPARENCY, /*通透模式*/
ANC_BYPASS, /*训练模式*/
ANC_TRAIN, /*训练模式*/
ANC_TRANS_TRAIN, /*通透训练模式*/
} ANC_mode_t;
/*ANC状态*/
enum {
ANC_STA_CLOSE = 0,
ANC_STA_INIT,
ANC_STA_OPEN,
};
typedef enum {
TRANS_ERR_TIMEOUT = 1, //训练超时
TRANS_ERR_MICERR, //训练中MIC异常
TRANS_ERR_FORCE_EXIT //强制退出训练
} ANC_trans_errmsg_t;
typedef enum {
ANC_L_FF_IIR = 0x0, //左FF滤波器ID
ANC_L_FB_IIR = 0x1, //左FB滤波器ID
ANC_L_CMP_IIR = 0x2, //左音乐补偿滤波器ID
ANC_L_TRANS_IIR = 0x3, //左通透滤波器ID
ANC_L_FIR = 0x4, //(保留位,暂时不用)
ANC_R_FF_IIR = 0x10, //右FF滤波器ID
ANC_R_FB_IIR = 0x11, //右FB滤波器ID
ANC_R_CMP_IIR = 0x12, //右音乐补偿滤波器ID
ANC_R_TRANS_IIR = 0x13, //右通透滤波器ID
ANC_R_FIR = 0x14 //(保留位,暂时不用)
} ANC_config_seg_id_t;
typedef enum {
ANC_ALOGM1 = 0,
ANC_ALOGM2,
ANC_ALOGM3,
ANC_ALOGM4,
ANC_ALOGM5,
ANC_ALOGM6,
ANC_ALOGM7,
ANC_ALOGM8,
} ANC_alogm_t; //ANC算法模式
typedef enum {
A_MIC0 = 0x0, //模拟MIC0 PA1 PA2
A_MIC1, //模拟MIC1 PB7 PB8
D_MIC0, //数字MIC0(plnk_dat0_pin-上升沿采样)
D_MIC1, //数字MIC1(plnk_dat1_pin-上升沿采样)
D_MIC2, //数字MIC2(plnk_dat0_pin-下降沿采样)
D_MIC3, //数字MIC3(plnk_dat1_pin-下降沿采样)
MIC_NULL = 0XFF, //没有定义相关的MIC
} ANC_mic_type_t;
/*ANC模式使能位*/
#define ANC_OFF_BIT BIT(1) /*降噪关闭使能*/
#define ANC_ON_BIT BIT(2) /*降噪模式使能*/
#define ANC_TRANS_BIT BIT(3) /*通透模式使能*/
//ANC Ch ---eg:双声道 ANC_L_CH|ANC_R_CH
#define ANC_L_CH BIT(0) //通道左
#define ANC_R_CH BIT(1) //通道右
//ANC各类增益对应符号位
#define ANCL_FF_SIGN BIT(0) //左声道FF增益符号
#define ANCL_FB_SIGN BIT(1) //左声道FB增益符号
#define ANCL_TRANS_SIGN BIT(2) //左声道通透增益符号
#define ANCL_CMP_SIGN BIT(3) //左声道音乐补偿增益符号
#define ANCR_FF_SIGN BIT(4) //右声道FF增益符号
#define ANCR_FB_SIGN BIT(5) //右声道FB增益符号
#define ANCR_TRANS_SIGN BIT(6) //右声道通透增益符号
#define ANCR_CMP_SIGN BIT(7) //右声道音乐补偿增益符号
//DRC中断标志
#define ANCL_REF_DRC_ISR BIT(0)
#define ANCL_ERR_DRC_ISR BIT(1)
#define ANCR_REF_DRC_ISR BIT(2)
#define ANCR_ERR_DRC_ISR BIT(3)
#define ANC_ERR_DRC_ISR ANCL_ERR_DRC_ISR | ANCR_ERR_DRC_ISR
#define ANC_REF_DRC_ISR ANCL_REF_DRC_ISR | ANCR_REF_DRC_ISR
//DRC模块使能标志
#define ANC_DRC_FF_EN BIT(0) //DRC_FF使能标志
#define ANC_DRC_FB_EN BIT(1) //DRC_FB使能标志
#define ANC_DRC_TRANS_EN BIT(2) //DRC_TRANS使能标志
//ANC DUT音频模块使能控制
#define ANC_DUT_ANC_ENABLE BIT(0) //ANC_DUT ANC使能
#define ANC_DUT_ADC_ENABLE BIT(1) //ANC_DUT ADC使能
#define ANC_DUT_DAC_ENABLE BIT(2) //ANC_DUT DAC使能
#define ANC_DUT_CLOSE ANC_DUT_ANC_ENABLE | ANC_DUT_ADC_ENABLE | ANC_DUT_DAC_ENABLE //ANC_DUT模块关闭,正常开启所有模块
/*ANC训练方式*/
#define ANC_AUTO_UART 0
#define ANC_AUTO_BT_SPP 1
#define ANC_TRAIN_WAY ANC_AUTO_BT_SPP
/*SZ频响获取默认算法模式*/
#define ANC_SZ_EXPORT_DEF_ALOGM ANC_ALOGM5
/*ANC芯片版本定义(只读)*/
#define ANC_CHIP_VERSION ANC_VERSION_BR36
/*ANC CFG读写标志*/
#define ANC_CFG_READ 0x01
#define ANC_CFG_WRITE 0x02
typedef struct {
u8 mode; //当前训练步骤
u8 train_busy; //训练繁忙位 0-空闲 1-训练中 2-训练结束测试中
u8 train_step; //训练系数
u8 ret_step; //自适应训练系数值
u8 auto_ts_en; //自动步进微调使能位
u8 enablebit; //训练模式使能标志位 前馈|混合馈|通透
u8 tool_time_flag; //工具修改时间标志
u8 mic_dma_export_en; //从ANC DAM拿数,会消耗4*4K
u8 only_mute_train_en; //只跑静音训练保持sz,fz系数
u16 timerout_id; //训练超时定时器ID
s16 fb0_gain;
s16 fb0sz_dly_en;
u16 fb0sz_dly_num;
int sz_gain; //静音训练sz 增益
u32 sz_lower_thr; //误差MIC下限能量阈值
u32 fz_lower_thr; //参考MIC下限能量阈值
u32 sz_noise_thr; //误差MIC底噪阈值
u32 fz_noise_thr; //参考MIC底噪阈值
u32 sz_adaptive_thr; //误差MIC自适应收敛阈值
u32 fz_adaptive_thr; //参考MIC自适应收敛阈值
u32 wz_train_thr; //噪声训练阈值
} anc_train_para_t;
typedef struct {
u8 mic_errmsg;
u8 status;
u32 dat[4]; //ff_num/ff_dat/fb_num/fb_dat
u32 pow;
u32 temp_pow;
u32 mute_pow;
} anc_ack_msg_t;
#define ANC_GAINS_VERSION 0X7003 //结构体版本号信息
typedef struct {
//cfg
u16 version; //当前结构体版本号
u8 dac_gain; //dac模拟增益 range 0-15; default 13
u8 ref_mic_gain; //参考mic range 0-19; default 10
u8 err_mic_gain; //误差mic range 0-19; default 10
u8 cmp_en; //音乐补偿使能 range 0-1; default 1
u8 drc_en; //DRC使能 range 0-7; default 0
u8 ahs_en; //AHS使能 range 0-1; default 1
u8 dcc_sel; //DCC选择 range 0-8; default 4
u8 gain_sign; //ANC各类增益的符号 range 0-255; default 0
u8 noise_lvl; //训练的噪声等级 range 0-255; default 0
u8 fade_step; //淡入淡出步进 range 0-15; default 1
u32 alogm; //ANC算法因素
u32 trans_alogm; //通透算法因素
float l_ffgain; //ANCL FF增益 range 0.0316(-30dB) - 31.622(+30dB); default 1.0(0dB)
float l_fbgain; //ANCL FB增益 range 0.0316(-30dB) - 31.622(+30dB); default 1.0(0dB)
float l_transgain; //ANCL 通透增益 range 0.0316(-30dB) - 31.622(+30dB); default 1.0(0dB)
float l_cmpgain; //ANCL 音乐补偿增益 range 0.0316(-30dB) - 31.622(+30dB); default 1.0(0dB)
float r_ffgain; //ANCR FF增益 range 0.0316(-30dB) - 31.622(+30dB); default 1.0(0dB)
float r_fbgain; //ANCR FB增益 range 0.0316(-30dB) - 31.622(+30dB); default 1.0(0dB)
float r_transgain; //ANCR 通透增益 range 0.0316(-30dB) - 31.622(+30dB); default 1.0(0dB)
float r_cmpgain; //ANCR 音乐补偿增益 range 0.0316(-30dB) - 31.622(+30dB); default 1.0(0dB)
u8 drcff_zero_det; //DRCFF过零检测使能 range 0-1; default 0;
u8 drcff_dat_mode; //DRCFF_DAT模式 range 0-3; default 0;
u8 drcff_lpf_sel; //DRCFF_LPF档位 range 0-3; default 0;
u8 drcfb_zero_det; //DRCFB过零检测使 range 0-1; default 0;
u8 drcfb_dat_mode; //DRCFB_DAT模式 range 0-3; default 0;
u8 drcfb_lpf_sel; //DRCFB_LPF档位 range 0-3; default 0;
u16 drcff_lthr; //DRCFF_LOW阈值 range 0-32767; default 0;
u16 drcff_hthr; //DRCFF_HIGH阈值 range 0-32767; default 32767;
s16 drcff_lgain; //DRCFF_LOW增益 range 0-32767; default 0;
s16 drcff_hgain; //DRCFF_HIGH增益 range 0-32767; default 1024;
s16 drcff_norgain; //DRCFF_NOR增益 range 0-32767; default 1024;
u16 drcfb_lthr; //DRCFB_LOW阈值 range 0-32767; default 0;
u16 drcfb_hthr; //DRCFB_HIGH阈值 range 0-32767; default 32767;
s16 drcfb_lgain; //DRCFB_LOW增益 range 0-32767; default 0;
s16 drcfb_hgain; //DRCFB_HIGH增益 range 0-32767; default 1024;
s16 drcfb_norgain; //DRCFB_NOR增益 range 0-32767; default 1024;
u16 drctrans_lthr; //DRCTRANS_LOW阈值 range 0-32767; default 0;
u16 drctrans_hthr; //DRCTRANS_HIGH阈值 range 0-32767; default 32767;
s16 drctrans_lgain; //DRCTRANS_LOW增益 range 0-32767; default 0;
s16 drctrans_hgain; //DRCTRANS_HIGH增益 range 0-32767; default 1024;
s16 drctrans_norgain; //DRCTRANS_NOR增益 range 0-32767; default 1024;
u8 ahs_dly; //AHS_DLY range 0-15; default 1;
u8 ahs_tap; //AHS_TAP range 0-255; default 100;
u8 ahs_wn_shift; //AHS_WN_SHIFT range 0-15; default 9;
u8 ahs_wn_sub; //AHS_WN_SUB range 0-1; default 1;
u16 ahs_shift; //AHS_SHIFT range 0-65536; default 210;
u16 ahs_u; //AHS步进 range 0-65536; default 4000;
s16 ahs_gain; //AHS增益 range -32767-32767;default -1024;
u8 reserve; //保留位
u8 developer_mode; //GAIN开发者模式 range 0-1; default 0;
//version 0x7001
float audio_drc_thr; //Audio DRC阈值 range -6.0-0; default -6.0dB;
} anc_gain_param_t;
/*ANCIF配置区滤波器系数gains*/
typedef struct {
anc_gain_param_t gains;
u8 reserve[236 - 104]; //236 + 20byte(header)
} anc_gain_t;
typedef struct {
u8 start; //ANC状态
u8 mode; //ANC模式:降噪关;降噪开;通透...
u8 production_mode; //量产模式
u8 anc_fade_en; //ANC淡入淡出使能
u8 tool_enablebit; //ANC动态使能,使用过程中可随意控制
u8 ch; //ANC通道选择 ANC_L_CH | ANC_R_CH
u8 ff_yorder; //FF滤波器阶数
u8 trans_yorder; //通透滤波器阶数
u8 fb_yorder; //FB滤波器阶数
u8 debug_sel; //ANCdebug data输出源
u8 lff_en; //左耳FF使能
u8 lfb_en; //左耳FB使能
u8 rff_en; //右耳FF使能
u8 rfb_en; //右耳FB使能
u8 online_busy; //在线调试繁忙标志位
u8 fade_time_lvl; //淡入时间等级,越大时间越长
u8 mic_type[4]; //ANC mic类型控制位
u8 fade_lock; //ANC淡入淡出增益锁
u8 dut_audio_enablebit; //ANC_DUT 音频使能控制,用于分离模块功耗
u16 anc_fade_gain; //ANC淡入淡出增益
u16 drc_fade_gain; //DRC淡出增益
u16 drc_time_id; //DRCtimeout定时器ID
u16 enablebit; //ANC模式:FF,FB,HYBRID
u32 coeff_size; //ANC 读滤波器总长度
u32 write_coeff_size; //ANC 写滤波器总长度
int train_err; //训练结果 0:成功 other:失败
u32 gains_size; //ANC 滤波器长度
int *debug_buf; //测试数据流,最大65536byte(堆)
s32 *lfir_coeff; //FZ补偿滤波器表
s32 *rfir_coeff; //FZ补偿滤波器表
double *lff_coeff; //左耳FF滤波器
double *lfb_coeff; //左耳FB滤波器
double *lcmp_coeff; //左耳cmp滤波器
double *ltrans_coeff; //左耳通透滤波器
double *rff_coeff; //右耳FF滤波器
double *rfb_coeff; //右耳FB滤波器
double *rcmp_coeff; //右耳cmp滤波器
double *rtrans_coeff; //右耳通透滤波器
anc_gain_param_t gains;
anc_train_para_t train_para;//训练参数结构体
void (*train_callback)(u8, u8);
void (*pow_callback)(anc_ack_msg_t *msg_t, u8 setp);
int (*cfg_online_deal_cb)(u8, anc_gain_t *);
void (*post_msg_drc)(void);
void (*post_msg_debug)(void);
} audio_anc_t;
#define ANC_DB_HEAD_LEN 20/*ANC配置区数据头长度*/
#define ANCIF_GAIN_TAG_01 "ANCGAIN01"
#define ANCIF_COEFF_TAG_01 "ANCCOEF01"
#define ANCIF_GAIN_TAG ANCIF_GAIN_TAG_01 //当前增益配置版本
#define ANCIF_COEFF_TAG ANCIF_COEFF_TAG_01 //当前系数配置版本
#define ANCIF_HEADER_LEN 10
typedef struct {
u32 total_len; //4 后面所有数据加起来长度
u16 group_crc; //6 group_type开始做的CRC,更新数据后需要对应更新CRC
u16 group_type; //8
u16 group_len; //10 header开始到末尾的长度
char header[ANCIF_HEADER_LEN];//20
int coeff[0];
} anc_db_head_t;
typedef struct {
u16 id;
u16 offset;
u16 len;
} anc_param_head_t;
/*ANCIF配置区滤波器系数coeff*/
typedef struct {
u16 version;
u16 cnt;
u8 dat[0];
} anc_coeff_t;
int audio_anc_train(audio_anc_t *param, u8 en);
/*
*Description : audio_anc_run
*Arguements : param is audio anc param
*Returns : 0 open success
* : -EPERM 不支持ANC
* : -EINVAL 参数错误
*Notes :
*/
int audio_anc_run(audio_anc_t *param);
int audio_anc_close();
void audio_anc_gain(int ffwz_gain, int fbwz_gain);
void audio_anc_fade(int gain, u8 en, u8 step);
void audio_anc_test(audio_anc_t *param);
void anc_train_para_init(anc_train_para_t *para);
void anc_coeff_online_update(audio_anc_t *param, u8 reset_en);
int anc_coeff_size_count(audio_anc_t *param);
/*ANC配置id*/
enum {
ANC_DB_COEFF, //ANC系数
ANC_DB_GAIN, //ANC增益
ANC_DB_MAX,
};
typedef struct {
u8 state; //ANC配置区状态
u16 total_size; //ANC配置区总大小
} anc_db_t;
/*anc配置区初始化*/
int anc_db_init(void);
/*根据配置id获取不同的anc配置*/
int *anc_db_get(u8 id, u32 *len);
/*
*gain:增益配置,没有的话传NULL
*coeff:系数配置,没有的话传NULL
*/
int anc_db_put(audio_anc_t *param, anc_gain_t *gain, anc_coeff_t *coeff);
/*anc 音乐补偿模块在线开关*/
void audio_anc_cmp_en(audio_anc_t *param, u8 en);
int anc_coeff_single_fill(anc_coeff_t *target_coeff, anc_coeff_t *tmp_coeff);
/*
*********************************************************************
* ANC DCC Config
* Description: anc dcc 等级设置
* Arguments : dcc_sel dcc等级
* Return : None.
* Note(s) : 不可以异步
*********************************************************************
*/
void audio_anc_dcc_set(u8 dcc_sel);
void audio_anc_gain_sign(audio_anc_t *param);
void audio_anc_drc_ctrl(audio_anc_t *param, float drc_ratio);
void audio_anc_reset(u8 en);
void audio_anc_norgain(s16 ffgain, s16 fbgain);
void audio_anc_tool_en_ctrl(audio_anc_t *param, u8 enablebit);
int audio_anc_gains_version_verify(audio_anc_t *param, anc_gain_t *cfg_target);
void audio_anc_drc_process(void);
void audio_anc_max_yorder_verify(audio_anc_t *param, u8 max_order);
int audio_anc_fade_dly_get(int target_value, int alogm);
void audio_anc_param_normalize(audio_anc_t *param);
void audio_anc_param_init(audio_anc_t *param);
int anc_cfg_online_deal(u8 cmd, anc_gain_t *cfg);
void audio_anc_drc_process(void);
void audio_anc_debug_data_output(void);
void audio_anc_debug_cbuf_sel_set(u8 sel);
void audio_anc_debug_extern_trigger(u8 flag);
/********************工具交互API*************************/
/*设置结果回调函数*/
void anc_api_set_callback(void (*callback)(u8, u8), void (*pow_callback)(anc_ack_msg_t *, u8));
/*设置淡入淡出使能*/
void anc_api_set_fade_en(u8 en);
/*获取参数结构体*/
anc_train_para_t *anc_api_get_train_param(void);
/*获取步进*/
u8 anc_api_get_train_step(void);
/*设置通透目标能量值*/
void anc_api_set_trans_aim_pow(u32 pow);
/*ANC在线调试标志设置*/
void anc_online_busy_set(u8 en);
/*ANC在线调试标志获取*/
u8 anc_online_busy_get(void);
/*ANC滤波器大小设置*/
void anc_coeff_size_set(u8 mode, int len);
/*ANC滤波器大小获取*/
int anc_coeff_size_get(u8 mode);
/*ANC滤波器参数填充*/
int anc_coeff_fill(anc_coeff_t *db_coeff);
/*ANC滤波器格式校验*/
int anc_coeff_check(anc_coeff_t *db_coeff, u16 len);
/*ANC量产模式设置*/
void anc_production_mode_set(u8 en);
#endif/*_ANC_H_*/
@@ -0,0 +1,413 @@
#ifndef AUDIO_ADC_H
#define AUDIO_ADC_H
#include "generic/typedef.h"
#include "generic/list.h"
#include "generic/atomic.h"
#include "system/spinlock.h"
#include "audio_def.h"
/*无电容电路*/
#define SUPPORT_MIC_CAPLESS 1
#define LADC_STATE_INIT 1
#define LADC_STATE_OPEN 2
#define LADC_STATE_START 3
#define LADC_STATE_STOP 4
#define FPGA_BOARD 0
#define LADC_MIC 0
#define LADC_LINEIN 1
/* ADC 最大通道数 */
#define AUDIO_ADC_MAX_NUM (1)
#define AUDIO_ADC_MIC_MAX_NUM (1)
#define AUDIO_ADC_LINEIN_MAX_NUM (1)
/* 通道选择 */
#define AUDIO_ADC_MIC(x) BIT(x)
#define AUDIO_ADC_MIC_0 BIT(0)
#define AUDIO_ADC_MIC_1 BIT(1)
#define AUDIO_ADC_MIC_2 BIT(2)
#define AUDIO_ADC_MIC_3 BIT(3)
#define AUDIO_ADC_LINE(x) BIT(x)
#define AUDIO_ADC_LINE0 BIT(0)
#define AUDIO_ADC_LINE1 BIT(1)
#define AUDIO_ADC_LINE2 BIT(2)
#define AUDIO_ADC_LINE3 BIT(3)
#define PLNK_MIC BIT(6)
#define ALNK_MIC BIT(7)
/*******************************应用层**********************************/
/* 通道选择 */
#define AUDIO_ADC_MIC_CH AUDIO_ADC_MIC_0
/********************************************************************************
mic_mode 工作模式配置
********************************************************************************/
// TCFG_AUDIO_MICx_MODE
#define AUDIO_MIC_CAP_MODE 0 //单端隔直电容模式
#define AUDIO_MIC_CAP_DIFF_MODE 1 //差分隔直电容模式
#define AUDIO_MIC_CAPLESS_MODE 2 //单端省电容模式
/********************************************************************************
MICx 输入IO配置(要注意IO与mic bias 供电IO配置互斥)
********************************************************************************/
// TCFG_AUDIO_MIC0_AIN_SEL
#define AUDIO_MIC0_CH0 ADC_AIN_PORT0 // PA4
#define AUDIO_MIC0_CH1 ADC_AIN_PORT1 // PA3
#define AUDIO_MIC0_CH2 ADC_AIN_PORT2 // PA2
#define AUDIO_MIC0_CH3 ADC_AIN_PORT3
#define AUDIO_MIC0_CH4 ADC_AIN_PORT4
// TCFG_AUDIO_MIC1_AIN_SEL
#define AUDIO_MIC1_CH0 ADC_AIN_PORT0
#define AUDIO_MIC1_CH1 ADC_AIN_PORT1
#define AUDIO_MIC1_CH2 ADC_AIN_PORT2
// TCFG_AUDIO_MIC2_AIN_SEL
#define AUDIO_MIC2_CH0 ADC_AIN_PORT0
#define AUDIO_MIC2_CH1 ADC_AIN_PORT1
// TCFG_AUDIO_MIC3_AIN_SEL
#define AUDIO_MIC3_CH0 ADC_AIN_PORT0
#define AUDIO_MIC3_CH1 ADC_AIN_PORT1
/********************************************************************************
MICx mic bias 供电IO配置(要注意IO与micin IO配置互斥)
********************************************************************************/
// TCFG_AUDIO_MICx_BIAS_SEL
#define AUDIO_MIC_BIAS_NULL (0) // no bias
#define AUDIO_MIC_BIAS_CH0 BIT(0) // PA4 br29只使用PA0
#define AUDIO_MIC_BIAS_CH1 BIT(1)
#define AUDIO_MIC_BIAS_CH2 BIT(2)
#define AUDIO_MIC_BIAS_CH3 BIT(3)
#define AUDIO_MIC_LDO_PWR BIT(4)
/********************************************************************************
LINEINx 输入IO配置
********************************************************************************/
// TCFG_AUDIO_LINEIN0_AIN_SEL
#define AUDIO_LINEIN0_CH0 ADC_AIN_PORT0
#define AUDIO_LINEIN0_CH1 ADC_AIN_PORT1
#define AUDIO_LINEIN0_CH2 ADC_AIN_PORT2
#define AUDIO_LINEIN0_CH3 ADC_AIN_PORT3
#define AUDIO_LINEIN0_CH4 ADC_AIN_PORT4
// TCFG_AUDIO_LINEIN1_AIN_SEL
#define AUDIO_LINEIN1_CH0 ADC_AIN_PORT0
#define AUDIO_LINEIN1_CH1 ADC_AIN_PORT1
#define AUDIO_LINEIN1_CH2 ADC_AIN_PORT2
// TCFG_AUDIO_LINEIN2_AIN_SEL
#define AUDIO_LINEIN2_CH0 ADC_AIN_PORT0
#define AUDIO_LINEIN2_CH1 ADC_AIN_PORT1
// TCFG_AUDIO_LINEIN3_AIN_SEL
#define AUDIO_LINEIN3_CH0 ADC_AIN_PORT0
#define AUDIO_LINEIN3_CH1 ADC_AIN_PORT1
struct mic_capless_trim_result {
u8 bias_rsel;
};
struct mic_capless_trim_param {
u16 trigger_threshold;
u16 open_delay_ms; //adc上电等待稳定延时
u16 trim_delay_ms; //偏置调整等待稳定延时
};
struct audio_adc_output_hdl {
struct list_head entry;
void *priv;
void (*handler)(void *, s16 *, int);
};
struct audio_adc_private_param {
u8 mic_ldo_vsel; // default value=3
u8 performance_mode; // 性能模式 0:高性能 1:低功耗
};
struct mic_open_param {
u8 mic_ain_sel; // 0/1/2
u8 mic_bias_sel; // A
u8 mic_bias_rsel; // 单端隔直电容mic bias rsel
u8 mic_mode : 4; // MIC工作模式
u8 mic_dcc : 4; // DCC level
};
struct linein_open_param {
u8 linein_ain_sel; // 0/1/2
u8 linein_mode : 4; // LINEIN 工作模式
u8 linein_dcc : 4; // DCC level
};
struct audio_adc_hdl {
struct list_head head;
struct audio_adc_private_param *private;
spinlock_t lock;
#if SUPPORT_MIC_CAPLESS
struct mic_capless_trim_result capless_trim;
struct mic_capless_trim_param capless_param;
#endif
u8 adc_sel[AUDIO_ADC_MAX_NUM];
u8 adc_dcc[AUDIO_ADC_MAX_NUM];
struct mic_open_param mic_param[AUDIO_ADC_MAX_NUM];
struct linein_open_param linein_param[AUDIO_ADC_MAX_NUM];
u8 mic_ldo_state;
u8 state;
u8 channel;
u8 channel_num;
u8 mic_num;
u8 linein_num;
s16 *hw_buf; //ADC 硬件buffer的地址
u8 max_adc_num; //默认打开的ADC通道数
u8 buf_fixed; //是否固定adc硬件使用的buffer地址
u8 bit_width;
};
struct adc_mic_ch {
struct audio_adc_hdl *adc;
u8 gain[AUDIO_ADC_MIC_MAX_NUM];
u8 buf_num;
u16 buf_size;
s16 *bufs;
u16 sample_rate;
void (*handler)(struct adc_mic_ch *, s16 *, u16);
u8 ch_map;
};
struct adc_linein_ch {
struct audio_adc_hdl *adc;
u8 gain[AUDIO_ADC_LINEIN_MAX_NUM];
u8 buf_num;
u16 buf_size;
s16 *bufs;
u16 sample_rate;
void (*handler)(struct adc_linein_ch *, s16 *, u16);
};
/*
*********************************************************************
* Audio ADC Initialize
* Description: 初始化Audio_ADC模块的相关数据结构
* Arguments : adc ADC模块操作句柄
* pd ADC模块硬件相关配置参数
* Note(s) : None.
*********************************************************************
*/
void audio_adc_init(struct audio_adc_hdl *adc, struct audio_adc_private_param *private);
/*
*********************************************************************
* Audio ADC Output Callback
* Description: 注册adc采样输出回调函数
* Arguments : adc adc模块操作句柄
* output 采样输出回调
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_adc_add_output_handler(struct audio_adc_hdl *adc, struct audio_adc_output_hdl *output);
/*
*********************************************************************
* Audio ADC Output Callback
* Description: 删除adc采样输出回调函数
* Arguments : adc adc模块操作句柄
* output 采样输出回调
* Return : None.
* Note(s) : 采样通道关闭的时候,对应的回调也要同步删除,防止内存释
* 放出现非法访问情况
*********************************************************************
*/
void audio_adc_del_output_handler(struct audio_adc_hdl *adc, struct audio_adc_output_hdl *output);
/*
*********************************************************************
* Audio ADC IRQ Handler
* Description: Audio ADC中断回调函数
* Arguments : adc adc模块操作句柄
* Return : None.
* Note(s) : 仅供Audio_ADC中断使用
*********************************************************************
*/
void audio_adc_irq_handler(struct audio_adc_hdl *adc);
/*
*********************************************************************
* Audio ADC Mic Open
* Description: 打开mic采样通道
* Arguments : mic mic操作句柄
* ch_map mic通道索引
* adc adc模块操作句柄
* Return : 0 成功 其他 失败
* Note(s) : None.
*********************************************************************
*/
int audio_adc_mic_open(struct adc_mic_ch *mic, u32 ch_map, struct audio_adc_hdl *adc, struct mic_open_param *param);
/*
*********************************************************************
* Audio ADC Mic Gain
* Description: 设置mic增益
* Arguments : mic mic操作句柄
* gain mic增益
* Return : 0 成功 其他 失败
* Note(s) : MIC增益范围:0(-8dB)~19(30dB),step:2dB,level(4)=0dB
*********************************************************************
*/
int audio_adc_mic_set_gain(struct adc_mic_ch *mic, u32 ch_map, int gain);
/*
*********************************************************************
* Audio ADC Mic Pre_Gain
* Description: 设置mic第一级/前级增益
* Arguments : en 前级增益使能(0:6dB 1:0dB)
* Return : None.
* Note(s) : 前级增益只有0dB和6dB两个档位
*********************************************************************
*/
void audio_adc_mic_0dB_en(u32 ch_map, bool en);
/*
*********************************************************************
* Audio ADC Mic Gain Boost
* Description: 设置mic第一级/前级增益
* Arguments : ch_map AUDIO_ADC_MIC_0/AUDIO_ADC_MIC_1/AUDIO_ADC_MIC_2/AUDIO_ADC_MIC_3,多个通道可以或上同时设置
* level 前级增益档位(AUD_MIC_GB_0dB/AUD_MIC_GB_6dB)
* Return : None.
* Note(s) : None.
*********************************************************************
*/
#define AUD_MIC_GB_0dB (0)
#define AUD_MIC_GB_6dB (1)
void audio_adc_mic_gain_boost(u32 ch_map, u8 level);
/*
*********************************************************************
* Audio ADC linein Open
* Description: 打开linein采样通道
* Arguments : linein linein操作句柄
* ch_map linein通道索引
* adc adc模块操作句柄
* Return : 0 成功 其他 失败
* Note(s) : None.
*********************************************************************
*/
int audio_adc_linein_open(struct adc_linein_ch *linein, u32 ch_map, struct audio_adc_hdl *adc, struct linein_open_param *param);
/*
*********************************************************************
* Audio ADC linein Gain
* Description: 设置linein增益
* Arguments : linein linein操作句柄
* gain linein增益
* Return : 0 成功 其他 失败
* Note(s) : linein增益范围:0(-8dB)~19(30dB),step:2dB,level(4)=0dB
*********************************************************************
*/
int audio_adc_linein_set_gain(struct adc_linein_ch *linein, u32 ch_map, int gain);
/*
*********************************************************************
* Audio ADC Linein Gain Boost
* Description: 设置linein第一级/前级增益
* Arguments : ch_map AUDIO_ADC_LINE0/AUDIO_ADC_LINE1/AUDIO_ADC_LINE2/AUDIO_ADC_LINE3,多个通道可以或上同时设置
* level 前级增益档位(AUD_LINEIN_GB_0dB/AUD_LINEIN_GB_6dB)
* Return : None.
* Note(s) : None.
*********************************************************************
*/
#define AUD_LINEIN_GB_0dB (0)
#define AUD_LINEIN_GB_6dB (1)
void audio_adc_linein_gain_boost(u32 ch_map, u8 level);
/*
*********************************************************************
* Audio ADC linein Pre_Gain
* Description: 设置linein第一级/前级增益
* Arguments : en 前级增益使能(0:6dB 1:0dB)
* Return : None.
* Note(s) : 前级增益只有0dB和6dB两个档位
*********************************************************************
*/
void audio_adc_linein_0dB_en(u32 ch_map, bool en);
/*
*********************************************************************
* AUDIO MIC_LDO Control
* Description: mic电源mic_ldo控制接口
* Arguments : index ldo索引(MIC_LDO/MIC_LDO_BIAS0/MIC_LDO_BIAS1)
* en 使能控制
* pd audio_adc模块配置
* Return : 0 成功 其他 失败
* Note(s) : (1)MIC_LDO输出不经过上拉电阻分压
* MIC_LDO_BIAS输出经过上拉电阻分压
* (2)打开一个mic_ldo示例:
* audio_adc_mic_ldo_en(MIC_LDO,1);
* (2)打开多个mic_ldo示例:
* audio_adc_mic_ldo_en(MIC_LDO | MIC_LDO_BIAS,1);
*********************************************************************
*/
/*MIC LDO index输出定义*/
#define MIC_LDO BIT(0) //PA0输出原始MIC_LDO
#define MIC_LDO_BIAS0 BIT(1) //Pxx输出经过内部上拉电阻分压的偏置
#define MIC_LDO_BIAS1 BIT(2) //Pxx输出经过内部上拉电阻分压的偏置
#define MIC_LDO_BIAS2 BIT(3) //Pxx输出经过内部上拉电阻分压的偏置
#define MIC_LDO_BIAS3 BIT(4) //Pxx输出经过内部上拉电阻分压的偏置
int audio_adc_mic_ldo_en(u8 index, u8 en, u8 mic_bias_rsel);
int audio_adc_mic_set_sample_rate(struct adc_mic_ch *mic, int sample_rate);
int audio_adc_mic_set_buffs(struct adc_mic_ch *mic, s16 *bufs, u16 buf_size, u8 buf_num);
int audio_adc_mic_start(struct adc_mic_ch *mic);
int audio_adc_mic_close(struct adc_mic_ch *mic);
int audio_adc_linein_set_sample_rate(struct adc_linein_ch *linein, int sample_rate);
int audio_adc_linein_set_buffs(struct adc_linein_ch *linein, s16 *bufs, u16 buf_size, u8 buf_num);
int audio_adc_linein_start(struct adc_linein_ch *linein);
int audio_adc_linein_close(struct adc_linein_ch *linein);
int audio_adc_mic_type(u8 mic_idx);
u8 audio_adc_is_active(void);
void audio_adc_add_ch(struct audio_adc_hdl *adc, u8 amic_seq);
int get_adc_seq(struct audio_adc_hdl *adc, u16 ch_map);
int audio_adc_set_buf_fix(u8 fix_en, struct audio_adc_hdl *adc);
/*
*********************************************************************
* Audio ADC Mic PGA Mute
* Description: 打开ADC的PGA Mute时,相当与设置了PGA增益为-40dB
* Arguments : ch_map mic的通道
* mute mute的控制位
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_adc_mic_set_pga_mute(u32 ch_map, bool mute);
/*
*********************************************************************
* Audio ADC Linein PGA Mute
* Description: 打开ADC的PGA Mute时,相当与设置了PGA增益为-40dB
* Arguments : ch_map linein的通道
* mute mute的控制位
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_adc_linein_set_pga_mute(u32 ch_map, bool mute);
int audio_mic_bias_adjust(struct mic_capless_trim_result *capless_trim, struct mic_capless_trim_param *capless_param);
#endif/*AUDIO_ADC_H*/
@@ -0,0 +1,88 @@
#ifndef _AUDIO_APIO_H_
#define _AUDIO_APIO_H_
#include "generic/typedef.h"
#include "generic/atomic.h"
#include "os/os_api.h"
#include "circular_buf.h"
#define AUDIO_APIO_DSM_CLK_384K 0
#define AUDIO_APIO_DSM_CLK_768K 1
#define AUDIO_APIO_PWM_MODE0 0
#define AUDIO_APIO_PWM_MODE1 1
#define AUDIO_APIO_PWM_MODE2 2
/************************************
apio性能模式
************************************/
// TCFG_AUDIO_APIO_PERFORMANCE_MODE
#define APIO_MODE_HIGH_PERFORMANCE (0)
#define APIO_MODE_LOW_POWER (1)
struct apio_platform_data {
u8 dcc_level;
u8 pwm_mode;
u8 pwm_mute;
u8 dsm_clk_mode;
u8 fade_en;
u8 fade_slow;
u8 fade_fast;
u8 pwm_clk_mode;
u8 classd_vbg_value;
u8 apa_en; // APA模块使能
u8 apio_en; // APIO模块使能
u16 syspll_clk_mode;
};
struct audio_apio_hdl {
struct apio_platform_data *pd;
s16 *output_buf;
u16 output_buf_len;
s16 *fifo;
cbuffer_t cbuf;
u32 sample_rate;
volatile u8 state; /*apio运行状态*/
u8 power_on;
OS_MUTEX mutex;
};
enum CLASSD_GPIO_STATE {
CLASSD_OUTPUT_LOGIC0 = 0,
CLASSD_OUTPUT_LOGIC1,
CLASSD_OUTPUT_HIGHZ,
};
enum CLASSD_GPIO_PWM_SEL {
CLASSD_MCPWM0_H = 29,
CLASSD_MCPWM1_H,
CLASSD_MCPWM0_L,
CLASSD_MCPWM1_L,
};
void audio_apio_irq_handler(struct audio_apio_hdl *apio);
int audio_apio_init(struct audio_apio_hdl *apio, struct apio_platform_data *pd);
int audio_apio_set_sample_rate(struct audio_apio_hdl *apio, int sample_rate);
int audio_apio_get_sample_rate(struct audio_apio_hdl *apio);
int audio_apio_try_power_on(struct audio_apio_hdl *apio);
int audio_apio_start(struct audio_apio_hdl *apio);
int audio_apio_write(struct audio_apio_hdl *apio, void *buf, int len);
int audio_apio_close(struct audio_apio_hdl *apio);
// -- CLASSD IO FUNCTION -- //
// param: *apio -- apio_hdl地址
// classd_ch -- 操作的CLASSD通道(CLASSD_IO_OUTPUT_P or CLASSD_IO_OUTPUT_N or (CLASSD_IO_OUTPUT_P | CLASSD_IO_OUTPUT_N))
// io_state -- 设置IO状态(enum CLASSD_GPIO_STATE)
// ----------------------- //
void audio_classd_io_output_open(struct audio_apio_hdl *apio, u8 classd_ch);
void audio_classd_io_output_set(struct audio_apio_hdl *apio, u8 classd_ch, enum CLASSD_GPIO_STATE io_state);
// -- CLASSD IO PWM FUNCTION -- //
//注意:在该模式时,要将对应模块先行配置起来!!!
// param: *apio -- apio_hdl地址
// classd_ch -- 操作的CLASSD通道(CLASSD_IO_OUTPUT_P or CLASSD_IO_OUTPUT_N or (CLASSD_IO_OUTPUT_P | CLASSD_IO_OUTPUT_N))
// pwm_src_sel -- 设置PWM信号源: //apa_och1_sel, 0~7: gp_och0~7 8~13: sd0 14~18: spi1 19~23: spi2 24~25: iic0 26~28: uart0 29~32: mcpwm0 33~36:scan chain
// ----------------------- //
void audio_classd_io_output_set_pwm(struct audio_apio_hdl *apio, u8 classd_ch, enum CLASSD_GPIO_PWM_SEL pwm_src_sel);
void audio_classd_io_output_close(struct audio_apio_hdl *apio);
#endif
@@ -0,0 +1,56 @@
#ifndef _AUDIO_COMMON_H_
#define _AUDIO_COMMON_H_
#include "generic/typedef.h"
#include "system/includes.h"
/************************************
dac时钟
************************************/
#define AUDIO_COMMON_CLK_DIG_SINGLE (0)
#define AUDIO_COMMON_CLK_DIF_XOSC (1)
#define AUDIO_COMMON_VCM_CAP_LEVEL1 (0) // VCM-cap, 要求VDDIO >= 2.7V
#define AUDIO_COMMON_VCM_CAP_LEVEL2 (1) // VCM-cap, 要求VDDIO >= 2.9V
#define AUDIO_COMMON_VCM_CAP_LEVEL3 (2) // VCM-cap, 要求VDDIO >= 3.1V
#define AUDIO_COMMON_VCM_CAP_LEVEL4 (3) // VCM-cap, 要求VDDIO >= 3.3V
#define AUDIO_COMMON_VCM_CAP_LEVEL5 (4) // VCM-cap, 要求VDDIO >= 3.5V
#define AUDIO_COMMON_DACLDO_CAPLESS_LEVEL1 (5) // VCM-capless, 要求VDDIO >= 2.7v
#define AUDIO_COMMON_DACLDO_CAPLESS_LEVEL2 (6) // VCM-capless, 要求VDDIO >= 2.9v
#define AUDIO_COMMON_DACLDO_CAPLESS_LEVEL3 (7) // VCM-capless, 要求VDDIO >= 3.1v
#define AUDIO_COMMON_DACLDO_CAPLESS_LEVEL4 (8) // VCM-capless, 要求VDDIO >= 3.3v
typedef struct {
u8 clock_mode;
u8 power_level;
u8 pmu_vbg_value;
u8 aud_vbg_value;
u8 vcm_cap_en;
} audio_common_param_t;
typedef struct {
u8 pmu_vbg_value;
u8 aud_vbg_value;
} audio_vbg_trim_t;
void audio_delay(int time_ms);
void audio_common_init(audio_common_param_t *param);
audio_common_param_t *audio_common_get_param(void);
void audio_common_audio_init(void *adc_data, void *dac_data);
void *audio_common_get_dac_data(void);
void *audio_common_get_adc_data(void);
void audio_common_clock_open(u8 clk_mode);
void audio_common_clock_close(void);
void audio_common_power_open(audio_common_param_t *param);
void audio_common_power_close(void);
int audio_adc_digital_status_add_check(int add);
int audio_adc_analog_status_add_check(u8 ch_index, int add);
int audio_dac_digital_status_add_check(int add);
int audio_dac_analog_status_add_check(int add);
int audio_common_power_trim(audio_vbg_trim_t *vbg_trim, u8 vcm_level);
#endif // _AUDIO_COMMON_H_
@@ -0,0 +1,34 @@
#ifndef _AUDIO_LINEIN_H_
#define _AUDIO_LINEIN_H_
#include "generic/typedef.h"
#include "asm/audio_adc.h"
/*
*ch:
*amux_en:
*/
int audio_linein0_open(u8 ch, u8 amux_en);
int audio_linein0_close(u8 ch, u8 amux_en);
int audio_linein1_open(u8 ch, u8 amux_en);
int audio_linein1_close(u8 ch, u8 amux_en);
int audio_linein2_open(u8 ch, u8 amux_en);
int audio_linein2_close(u8 ch, u8 amux_en);
/*
*
*/
void audio_linein_mute(u8 mute);
/*
*
*/
void audio_linein_gain(u8 gain);
void audio_linein_bias(u8 ch, u8 en);
void audio_linein_amux_bias(u8 amux_bias);
/*
*
*
*/
void audio_linein_ch_combine(u8 LR_2_L, u8 LR_2_R);
#endif
@@ -0,0 +1,14 @@
/*****************************************************************
>file name : interface/media/cpu/br30/includes.h
>author : lichao
>create time : Fri 29 Nov 2019 02:24:47 PM CST
*****************************************************************/
#ifndef _ASM_MEDIA_INCLUDES_H_
#define _ASM_MEDIA_INCLUDES_H_
#include "asm/audio_adc.h"
#include "asm/audio_linein.h"
#include "dac.h"
#include "asm/hw_eq.h"
#endif
+634
View File
@@ -0,0 +1,634 @@
#ifndef __CPU_DAC_H__
#define __CPU_DAC_H__
#include "generic/typedef.h"
#include "generic/atomic.h"
#include "os/os_api.h"
#include "audio_src.h"
#include "media/audio_cfifo.h"
#include "system/spinlock.h"
#include "audio_def.h"
#define AUDIO_DAC_CHANNEL_NUM 1
// TCFG_AUDIO_DAC_MODE
#define DAC_MODE_SINGLE (0)
#define DAC_MODE_DIFF (1)
#define DAC_MODE_VCMO (2)
/************************************
dac性能模式
************************************/
// TCFG_DAC_PERFORMANCE_MODE
#define DAC_MODE_HIGH_PERFORMANCE (0)
#define DAC_MODE_LOW_POWER (1)
/************************************
dac 供电模式
************************************/
// TCFG_DAC_POWER_LEVEL
#define AUDIO_VCM_CAP_LEVEL1 (0) // VCM-cap, VCM = 1.2v
#define AUDIO_VCM_CAP_LEVEL2 (1) // VCM-cap, VCM = 1.3v
#define AUDIO_VCM_CAP_LEVEL3 (2) // VCM-cap, VCM = 1.4v
#define AUDIO_VCM_CAP_LEVEL4 (3) // VCM-cap, VCM = 1.5v
#define AUDIO_VCM_CAP_LEVEL5 (4) // VCM-cap, VCM = 1.6v
#define AUDIO_VCM_CAPLESS_LEVEL1 (5) // VCM-capless, DACLDO = 2.4v
#define AUDIO_VCM_CAPLESS_LEVEL2 (6) // VCM-capless, DACLDO = 2.6v
#define AUDIO_VCM_CAPLESS_LEVEL3 (7) // VCM-capless, DACLDO = 2.8v
#define AUDIO_VCM_CAPLESS_LEVEL4 (8) // VCM-capless, DACLDO = 3.0v
#define AUDIO_DAC_SYNC_IDLE 0
#define AUDIO_DAC_SYNC_PROBE 1
#define AUDIO_DAC_SYNC_START 2
#define AUDIO_DAC_SYNC_NO_DATA 3
#define AUDIO_DAC_ALIGN_NO_DATA 4
#define AUDIO_DAC_SYNC_ALIGN_COMPLETE 5
#define AUDIO_DAC_SYNC_KEEP_RATE_DONE 6
#define AUDIO_SRC_SYNC_ENABLE 1
#define SYNC_LOCATION_FLOAT 1
#if SYNC_LOCATION_FLOAT
#define PCM_PHASE_BIT 0
#else
#define PCM_PHASE_BIT 8
#endif
#define DA_LEFT 0
#define DA_RIGHT 1
#define DA_SOUND_NORMAL 0x0
#define DA_SOUND_RESET 0x1
#define DA_SOUND_WAIT_RESUME 0x2
#define DACR32_DEFAULT 8192
#define DA_SYNC_INPUT_BITS 20
#define DA_SYNC_MAX_NUM (1 << DA_SYNC_INPUT_BITS)
//void audio_dac_power_state(u8 state)
//在应用层重定义 audio_dac_power_state 函数可以获取dac模拟开关的状态
struct audio_dac_hdl;
struct dac_platform_data {
void (*analog_open_cb)(struct audio_dac_hdl *);
void (*analog_close_cb)(struct audio_dac_hdl *);
void (*analog_light_open_cb)(struct audio_dac_hdl *);
void (*analog_light_close_cb)(struct audio_dac_hdl *);
u16 dma_buf_time_ms; // DAC dma buf 大小
u8 output; // DAC输出模式
u8 output_mode; // single/diff/vcmo
u8 performance_mode; // low_power/high_performance
u8 light_close; //使能轻量级关闭,最低功耗保持dac开启
u32 max_sample_rate; //支持的最大采样率
u8 dcc_level; // DAC去直流滤波器档位, 0~7:关闭 8~15:开启(档位越大,高通截止点越小)
u8 bit_width; // DAC输出位宽
u8 power_level;
u8 mode;
u8 clock_mode;
};
struct analog_module {
/*模拟相关的变量*/
u8 inited;
};
struct digital_module {
/*数字相关的变量*/
u8 inited;
};
struct trim_init_param_t {
u8 clock_mode;
u8 power_level;
struct audio_dac_trim *dac_trim;
struct audio_dac_hdl *dac; /* DAC设备*/
};
struct audio_dac_trim {
s16 left;
s16 right;
};
// *INDENT-OFF*
struct audio_dac_sync {
u32 channel : 3;
u32 start : 1;
u32 fast_align : 1;
u32 connect_sync : 1;
u32 release_by_bt : 1;
u32 resevered : 1;
u32 input_num : DA_SYNC_INPUT_BITS;
int fast_points;
int keep_points;
int phase_sub;
int in_rate;
int out_rate;
int bt_clkn;
int bt_clkn_phase;
#if AUDIO_SRC_SYNC_ENABLE
struct audio_src_sync_handle *src_sync;
void *buf;
int buf_len;
void *filt_buf;
int filt_len;
#else
struct audio_src_base_handle *src_base;
#endif
#if SYNC_LOCATION_FLOAT
float pcm_position;
#else
u32 pcm_position;
#endif
void *priv;
int (*handler)(void *priv, u8 state);
void *correct_priv;
void (*correct_cabllback)(void *priv, int diff);
};
struct audio_dac_fade {
u8 enable;
volatile u8 ref_L_gain;
volatile u8 ref_R_gain;
int timer;
};
struct audio_dac_sync_node {
u8 triggered;
u8 network;
u32 timestamp;
void *hdl;
struct list_head entry;
void *ch;
};
struct audio_dac_channel_attr {
u8 write_mode; /*DAC写入模式*/
u16 delay_time; /*DAC通道延时*/
u16 protect_time; /*DAC延时保护时间*/
};
struct audio_dac_channel {
u8 state; /*DAC状态*/
u8 pause;
u8 samp_sync_step; /*数据流驱动的采样同步步骤*/
struct audio_dac_channel_attr attr; /*DAC通道属性*/
struct audio_sample_sync *samp_sync; /*样点同步句柄*/
struct audio_dac_hdl *dac; /* DAC设备*/
struct audio_cfifo_channel fifo; /*DAC cfifo通道管理*/
//struct audio_dac_sync sync;
// struct list_head sync_list;
};
struct audio_dac_hdl {
struct analog_module analog;
struct digital_module digital;
const struct dac_platform_data *pd;
OS_SEM sem;
struct audio_dac_trim trim;
void (*fade_handler)(u8 left_gain, u8 right_gain);
void (*update_frame_handler)(u8 channel_num, void *data, u32 len);
volatile u8 mute;
volatile u8 state;
volatile u8 light_state;
volatile u8 agree_on;
u8 gain;
u8 vol_l;
u8 vol_r;
u8 channel;
u16 max_d_volume;
u16 d_volume[4];
u32 sample_rate;
u16 start_ms;
u16 delay_ms;
u16 start_points;
u16 delay_points;
u16 prepare_points;//未开始让DAC真正跑之前写入的PCM点数
u16 irq_points;
s16 protect_time;
s16 protect_pns;
s16 fadein_frames;
s16 fade_vol;
u8 protect_fadein;
u8 vol_set_en;
u8 volume_enhancement;
u8 sound_state;
unsigned long sound_resume_time;
s16 *output_buf;
u16 output_buf_len;
u8 anc_dac_open;
u8 dac_read_flag; //AEC可读取DAC参考数据的标志
u8 fifo_state;
u16 unread_samples; /*未读样点个数*/
struct audio_cfifo fifo; /*DAC cfifo结构管理*/
struct audio_dac_channel main_ch;
u8 dvol_mute; //DAC数字音量是否mute
#if 0
struct audio_dac_sync sync;
struct list_head sync_list;
u8 sync_step;
#endif
u8 active;
s16 weight;
void *resample_ch;
void *resample_buf;
int resample_buf_len;
void *feedback_priv;
void (*underrun_feedback)(void *priv);
/*******************************************/
/**sniff退出时,dac模拟提前初始化,避免模拟初始化延时,影响起始同步********/
u8 power_on;
u8 need_close;
OS_MUTEX mutex;
OS_MUTEX mutex_power_off;
OS_MUTEX dvol_mutex;
/*******************************************/
spinlock_t lock;
u32 dac_dvol; //记录DAC 停止前数字音量寄存器DAC_VL0的值
/*******************************************/
struct list_head sync_list;
};
/*
*********************************************************************
* audio_dac_init
* Description: DAC 初始化
* Arguments : dac dac 句柄
* pd dac 参数配置结构体
* Return : 0:成功 -1:失败
* Note(s) :
*********************************************************************
*/
int audio_dac_init(struct audio_dac_hdl *dac, const struct dac_platform_data *pd);
void *audio_dac_get_pd_data(void);
/*
*********************************************************************
* audio_dac_get_hdl
* Description: 获取 DAC 句柄
* Arguments :
* Return : DAC 句柄
* Note(s) :
*********************************************************************
*/
struct audio_dac_hdl *audio_dac_get_hdl(void);
int audio_dac_trim_value_check(struct audio_dac_trim *dac_trim);
/*
*********************************************************************
* audio_dac_do_trim
* Description: DAC 直流偏置校准
* Arguments : dac dac 句柄
* dac_trim 存放 trim 值结构体的地址
* fast_trim 快速 trim 使能
* Return : 0:成功 -1:失败
* Note(s) :
*********************************************************************
*/
int audio_dac_do_trim(struct audio_dac_hdl *dac, struct audio_dac_trim *dac_trim, u8 fast_trim);
/*
*********************************************************************
* audio_dac_set_trim_value
* Description: 将 DAC 直流偏置校准值写入 DAC 配置
* Arguments : dac dac 句柄
* dac_trim 存放 trim 值结构体的地址
* Return : 0:成功 -1:失败
* Note(s) :
*********************************************************************
*/
int audio_dac_set_trim_value(struct audio_dac_hdl *dac, struct audio_dac_trim *dac_trim);
/*
*********************************************************************
* audio_dac_irq_handler
* Description: DAC 中断回调函数
* Arguments : dac dac 句柄
* Return :
* Note(s) :
*********************************************************************
*/
void audio_dac_irq_handler(struct audio_dac_hdl *dac);
/*
*********************************************************************
* audio_dac_write
* Description: 将数据写入默认的 dac channel cfifo。等同于调用 audio_dac_channel_write 函数 private_data 传 NULL
* Arguments : dac dac 句柄
* buf 数据的起始地址
* len 数据的字节长度
* Return : 成功写入的数据字节长度
* Note(s) :
*********************************************************************
*/
int audio_dac_write(struct audio_dac_hdl *dac, void *buf, int len);
int audio_dac_get_write_ptr(struct audio_dac_hdl *dac, s16 **ptr);
int audio_dac_update_write_ptr(struct audio_dac_hdl *dac, int len);
/*
*********************************************************************
* audio_dac_set_sample_rate
* Description: 设置 DAC 的输出采样率
* Arguments : dac dac 句柄
* sample_rate 采样率
* Return : 0:成功 -1:失败
* Note(s) :
*********************************************************************
*/
int audio_dac_set_sample_rate(struct audio_dac_hdl *dac, int sample_rate);
/*
*********************************************************************
* audio_dac_get_sample_rate
* Description: 获取 DAC 的输出采样率
* Arguments : dac dac 句柄
* Return : 采样率
* Note(s) :
*********************************************************************
*/
int audio_dac_get_sample_rate(struct audio_dac_hdl *dac);
u32 audio_dac_select_sample_rate(u32 sample_rate);
int audio_dac_clk_switch(u8 clk);
int audio_dac_clk_get(void);
int audio_dac_set_channel(struct audio_dac_hdl *dac, u8 channel);
int audio_dac_get_channel(struct audio_dac_hdl *dac);
/*
*********************************************************************
* audio_dac_set_digital_vol
* Description: 设置 DAC 的数字音量
* Arguments : dac dac 句柄
* vol 需要设置的数字音量等级
* Return : 0:成功 -1:失败
* Note(s) :
*********************************************************************
*/
int audio_dac_set_digital_vol(struct audio_dac_hdl *dac, u16 vol);
/*
*********************************************************************
* audio_dac_set_analog_vol
* Description: 设置 DAC 的模拟音量
* Arguments : dac dac 句柄
* vol 需要设置的模拟音量等级
* Return : 0:成功 -1:失败
* Note(s) :
*********************************************************************
*/
int audio_dac_set_analog_vol(struct audio_dac_hdl *dac, u16 vol);
int audio_dac_ch_analog_gain_set(struct audio_dac_hdl *dac, u32 ch, u32 again);
/*
*********************************************************************
* audio_dac_try_power_on
* Description: 根据设置好的参数打开 DAC 的模拟模块和数字模块。与 audio_dac_start 功能基本一样,但不设置 PNS
* Arguments : dac dac 句柄
* Return : 0:成功 -1:失败
* Note(s) :
*********************************************************************
*/
int audio_dac_try_power_on(struct audio_dac_hdl *dac);
/*
*********************************************************************
* audio_dac_start
* Description: 根据设置好的参数打开 DAC 的模拟模块和数字模块。
* Arguments : dac dac 句柄
* Return : 0:成功 -1:失败
* Note(s) :
*********************************************************************
*/
int audio_dac_start(struct audio_dac_hdl *dac);
/*
*********************************************************************
* audio_dac_stop
* Description: 关闭 DAC 数字部分。所有 DAC channel 都关闭后才能调用这个函数
* Arguments : dac dac 句柄
* Return : 0:成功 -1:失败
* Note(s) :
*********************************************************************
*/
int audio_dac_stop(struct audio_dac_hdl *dac);
/*
*********************************************************************
* audio_dac_idle
* Description: 获取 DAC 空闲状态
* Arguments : dac dac 句柄
* Return : 0:非空闲 1:空闲
* Note(s) :
*********************************************************************
*/
int audio_dac_idle(struct audio_dac_hdl *dac);
void audio_dac_mute(struct audio_dac_hdl *hdl, u8 mute);
u8 audio_dac_digital_mute_state(struct audio_dac_hdl *hdl);
void audio_dac_digital_mute(struct audio_dac_hdl *dac, u8 mute);
int audio_dac_open(struct audio_dac_hdl *dac);
/*
*********************************************************************
* audio_dac_close
* Description: 关闭 DAC 模拟部分。audio_dac_stop 之后才可以调用
* Arguments : dac dac 句柄
* Return : 0:成功 -1:失败
* Note(s) :
*********************************************************************
*/
int audio_dac_close(struct audio_dac_hdl *dac);
/*
*********************************************************************
* audio_dac_set_volume
* Description: 设置音量等级记录变量,但是不会直接修改音量。只有当 DAC 关闭状态时,第一次调用 audio_dac_channel_start 打开 dac fifo 后,会根据 audio_dac_set_fade_handler 设置的回调函数来设置系统音量,回调函数的传参就是 audio_dac_set_volume 设置的音量值。
* Arguments : dac dac 句柄
gain 记录的音量等级
* Return : 0:成功 -1:失败
* Note(s) :
*********************************************************************
*/
int audio_dac_set_volume(struct audio_dac_hdl *dac, u8 gain);
int audio_dac_set_L_digital_vol(struct audio_dac_hdl *dac, u16 vol);
int audio_dac_set_R_digital_vol(struct audio_dac_hdl *dac, u16 vol);
int audio_dac_set_RL_digital_vol(struct audio_dac_hdl *dac, u16 vol);
int audio_dac_set_RR_digital_vol(struct audio_dac_hdl *dac, u16 vol);
void audio_dac_ch_high_resistance(struct audio_dac_hdl *dac, u8 ch, u8 en);
/*
*********************************************************************
* audio_dac_ch_mute
* Description: 将某个通道静音,用于降低底噪,或者做串扰隔离的功能
* Arguments : dac dac 句柄
* ch 需要操作的通道,BIT(n)代表操作第n个通道,可以多个通道或上操作
* mute 0:解除mute 1:mute
* Return : 0:成功 -1:失败
* Note(s) :
*********************************************************************
*/
void audio_dac_ch_mute(struct audio_dac_hdl *dac, u8 ch, u8 mute);
/*
*********************************************************************
* audio_dac_set_fade_handler
* Description: DAC 关闭状态时,第一次调用 audio_dac_channel_start 打开 dac fifo 后,会根据 audio_dac_set_fade_handler 设置的回调函数来设置系统音量
* Arguments : dac dac 句柄
* priv 暂无作用
* fade_handler 回调函数的地址
* Return : 0:成功 -1:失败
* Note(s) :
*********************************************************************
*/
void audio_dac_set_fade_handler(struct audio_dac_hdl *dac, void *priv, void (*fade_handler)(u8, u8));
int audio_dac_get_status(struct audio_dac_hdl *dac);
u8 audio_dac_is_working(struct audio_dac_hdl *dac);
int audio_dac_set_irq_time(struct audio_dac_hdl *dac, int time_ms);
int audio_dac_data_time(struct audio_dac_hdl *dac);
int audio_dac_irq_enable(struct audio_dac_hdl *dac, int time_ms, void *priv, void (*callback)(void *));
int audio_dac_set_protect_time(struct audio_dac_hdl *dac, int time, void *priv, void (*feedback)(void *));
int audio_dac_buffered_frames(struct audio_dac_hdl *dac);
void audio_dac_add_syncts_handle(struct audio_dac_hdl *dac, void *syncts);
void audio_dac_remove_syncts_handle(struct audio_dac_channel *ch, void *syncts);
void audio_dac_count_to_syncts(struct audio_dac_channel *ch, int frames);
void audio_dac_syncts_latch_trigger(struct audio_dac_channel *ch);
void audio_dac_add_syncts_with_timestamp(struct audio_dac_channel *ch, void *syncts, u32 timestamp);
void audio_dac_syncts_trigger_with_timestamp(struct audio_dac_channel *ch, u32 timestamp);
/*
* 音频同步
*/
void *audio_dac_resample_channel(struct audio_dac_hdl *dac);
int audio_dac_sync_resample_enable(struct audio_dac_hdl *dac, void *resample);
int audio_dac_sync_resample_disable(struct audio_dac_hdl *dac, void *resample);
void audio_dac_set_input_correct_callback(struct audio_dac_hdl *dac,
void *priv,
void (*callback)(void *priv, int diff));
int audio_dac_set_sync_buff(struct audio_dac_hdl *dac, void *buf, int len);
int audio_dac_set_sync_filt_buff(struct audio_dac_hdl *dac, void *buf, int len);
int audio_dac_sync_open(struct audio_dac_hdl *dac);
int audio_dac_sync_set_channel(struct audio_dac_hdl *dac, u8 channel);
int audio_dac_sync_set_rate(struct audio_dac_hdl *dac, int in_rate, int out_rate);
int audio_dac_sync_auto_update_rate(struct audio_dac_hdl *dac, u8 on_off);
int audio_dac_sync_flush_data(struct audio_dac_hdl *dac);
int audio_dac_sync_fast_align(struct audio_dac_hdl *dac, int in_rate, int out_rate, int fast_output_points, float phase_diff);
#if SYNC_LOCATION_FLOAT
float audio_dac_sync_pcm_position(struct audio_dac_hdl *dac);
#else
u32 audio_dac_sync_pcm_position(struct audio_dac_hdl *dac);
#endif
int audio_dac_sync_keep_rate(struct audio_dac_hdl *dac, int points);
int audio_dac_sync_pcm_input_num(struct audio_dac_hdl *dac);
void audio_dac_sync_input_num_correct(struct audio_dac_hdl *dac, int num);
void audio_dac_set_sync_handler(struct audio_dac_hdl *dac, void *priv, int (*handler)(void *priv, u8 state));
int audio_dac_sync_start(struct audio_dac_hdl *dac);
int audio_dac_sync_stop(struct audio_dac_hdl *dac);
int audio_dac_sync_reset(struct audio_dac_hdl *dac);
int audio_dac_sync_data_lock(struct audio_dac_hdl *dac);
int audio_dac_sync_data_unlock(struct audio_dac_hdl *dac);
void audio_dac_sync_close(struct audio_dac_hdl *dac);
u32 local_audio_us_time_set(u16 time);
int local_audio_us_time(void);
int audio_dac_start_time_set(void *_dac, u32 us_timeout, u32 cur_time, u8 on_off);
u32 audio_dac_sync_pcm_total_number(void *_dac);
void audio_dac_sync_set_pcm_number(void *_dac, u32 output_points);
u32 audio_dac_pcm_total_number(void *_dac, int *pcm_r);
u8 audio_dac_sync_empty_state(void *_dac);
void audio_dac_sync_empty_reset(void *_dac, u8 state);
void audio_dac_set_empty_handler(void *_dac, void *empty_priv, void (*handler)(void *priv, u8 empty));
void audio_dac_set_dcc(u8 dcc);
u8 audio_dac_ana_gain_mapping(u8 level);
/*
*********************************************************************
* audio_dac_volume_enhancement_mode_get
* Description: DAC 音量增强模式切换
* Arguments : dac dac 句柄
* Return : 1:音量增强模式 0:普通模式
* Note(s) : None.
*********************************************************************
*/
u8 audio_dac_volume_enhancement_mode_get(struct audio_dac_hdl *dac);
void audio_dac_channel_start(void *private_data);
void audio_dac_channel_close(void *private_data);
int audio_dac_channel_write(void *private_data, struct audio_dac_hdl *dac, void *buf, int len);
int audio_dac_channel_set_attr(struct audio_dac_channel *ch, struct audio_dac_channel_attr *attr);
int audio_dac_new_channel(struct audio_dac_hdl *dac, struct audio_dac_channel *ch);
void audio_dac_add_update_frame_handler(struct audio_dac_hdl *dac, void (*update_frame_handler)(u8, void *, u32));
void audio_dac_del_update_frame_handler(struct audio_dac_hdl *dac);
/*AEC参考数据软回采接口*/
int audio_dac_read_reset(void);
int audio_dac_read(s16 points_offset, void *data, int len, u8 read_channel);
#endif
+356
View File
@@ -0,0 +1,356 @@
#ifndef __HW_EQ_H
#define __HW_EQ_H
#include "generic/typedef.h"
#include "generic/list.h"
#include "os/os_api.h"
#include "effects/eq_func_define.h"
#include "system/spinlock.h"
enum { //运行模式
NORMAL = 0, //正常模式
MONO, //单声道模式
STEREO //立体声模式
};
enum { //输出数据类型
DATO_SHORT = 0, //short
DATO_INT, //int
DATO_FLOAT //float
};
enum { //输入数据类型
DATI_SHORT = 0, //short
DATI_INT, // int
DATI_FLOAT //float
};
enum { //输入数据存放模式
BLOCK_DAT_IN = 0, //块模式,例如输入数据是2通道,先存放完第1通道的所有数据,再存放第2通道的所有数据
SEQUENCE_DAT_IN, //序列模式,例如输入数据是2通道,先存放第通道的第一个数据,再存放第2个通道的第一个数据,以此类推。
};
enum { //输出数据存放模式
BLOCK_DAT_OUT = 0,//块模式,例如输出数据是2通道,先存放完第1通道的所有数据,再存放第2通道的所有数据
SEQUENCE_DAT_OUT, //序列模式,例如输入数据是2通道,先存放第通道的第一个数据,再存放第2个通道的第一个数据,以此类推。
};
/*eq IIR type*/
typedef enum {
EQ_IIR_TYPE_HIGH_PASS = 0x00,
EQ_IIR_TYPE_LOW_PASS,
EQ_IIR_TYPE_BAND_PASS,
EQ_IIR_TYPE_HIGH_SHELF,
EQ_IIR_TYPE_LOW_SHELF,
EQ_IIR_TYPE_HIGH_SHELF_Q_TYPE,
EQ_IIR_TYPE_LOW_SHELF_Q_TYPE,
EQ_IIR_TYPE_HIGH_PASS_ADVANCE,//在gain位置存阶数,0~6阶级,0disbale
EQ_IIR_TYPE_LOW_PASS_ADVANCE,//在gain位置存阶数,0~6阶级,0disbale
} EQ_IIR_TYPE;
struct eq_seg_info {
u16 index;
u16 iir_type; ///<EQ_IIR_TYPE
int freq;
float gain;
float q;
};
struct eq_coeff_info {
u8 nsection; //eq段数
u8 no_coeff; //不是滤波系数
#ifdef CONFIG_EQ_NO_USE_COEFF_TABLE
u32 sr; //采样率
#endif
float *L_coeff;
float *R_coeff;
float L_gain;
float R_gain;
float *N_coeff[8];
float N_gain[8];
};
struct hw_eq_ch;
struct hw_eq_cfg {
u16 irq_index;
u8 hw_section;
u8 cpu_section;
u32 hw_ram_addr;
u32 cpu_ram_addr;
int hw_ram_size;
// JL_EQ_TypeDef *regs;
void (*irq_handler)(void);
};
struct hw_eq {
struct list_head head; //链表头
struct list_head frame_head; //数据帧链表头
volatile struct hw_eq_ch *cur_ch; //当前需要处理的eq通道
volatile struct hw_eq_cfg *cfg; //硬件寄存器相关配置
u32 core;
/*****增加eq name标识,用于申请时钟数*/
u32 cnt;
/*连续的dma_buf, 每个硬件都有一块,每次以最大使用量做申请*/
s32 *dma_addr;
s32 dma_len;//byte
};
enum {
HW_EQ_CMD_CLEAR_MEM = 0xffffff00,
HW_EQ_CMD_CLEAR_MEM_L,
HW_EQ_CMD_CLEAR_MEM_R,
};
struct hw_eq_handler {
int (*eq_probe)(struct hw_eq_ch *);
int (*eq_output)(struct hw_eq_ch *, s16 *, u16);
int (*eq_post)(struct hw_eq_ch *);
int (*eq_input)(struct hw_eq_ch *, void **, void **);
};
struct hw_eq_info {
unsigned char run_mode; //0按照输入的数据排布方式 ,输出数据 1:单入多出, 2:立体声入多出
unsigned char in_mode; //输入数据的位宽 0short 1:int 2:float
unsigned char out_mode; //输出数据的位宽 0short 1:int 2:float
unsigned char out_channels; //输出通道数
unsigned char data_in_mode; //输入数据存放模式
unsigned char data_out_mode; //输入数据存放模式
};
struct hw_eq_ch {
unsigned char updata; //更新参数以及中间数据
unsigned char updata_coeff_only; //只更新参数,不更新中间数据
unsigned char no_wait; //是否是异步eq处理 0:同步的eq 1:异步的eq
unsigned char channels; //输入通道数
unsigned char nsection; //eq段数
unsigned char no_coeff; // 非滤波系数
volatile unsigned char active; //已启动eq处理 1busy 0:处理结束
volatile unsigned char need_run; //多eq同时使用时,未启动成功的eq,是否需要重新唤醒处理 1:需要 0:否
unsigned char run_mode; //0按照输入的数据排布方式 ,输出数据 1:单入多出, 2:立体声入多出
unsigned char in_mode; //输入数据的位宽 0short 1:int 2:float
unsigned char out_32bit; //输出数据的位宽 0short 1:int 2:float
unsigned char out_channels; //输出通道数
unsigned char data_in_mode; //输入数据存放模式
unsigned char data_out_mode; //输入数据存放模式
float *L_coeff;
float *R_coeff;
float L_gain;
float R_gain;
float *N_coeff[8];
float N_gain[8];
float *eq_LRmem;
s16 *out_buf;
s16 *in_buf;
int in_len;
void *priv;
volatile OS_SEM sem;
struct list_head entry;
struct hw_eq *eq;
const struct hw_eq_handler *eq_handler;
void *irq_priv; //eq管理层传入的私有指针
void (*irq_callback)(void *priv);//需要eq中断执行的回调函数
void *eq_ch;
int (*irq_eq_process)(void *eq_ch, void *indata, void *outdata, int inlen);
struct list_head frame_entry;
/*****增加eq name标识,用于申请时钟数*/
char name[8];
};
//系数计算子函数
/*
fc: 低通滤波器-3dB衰减频点
fs: 采样率
nSOS: 生成nSOS阶IIR
coeff: 输出系数地址 大小为 ((nSOS & 1) + (nSOS >> 1))*5 , 顺序是按照硬件EQ摆放了 )
段数:((nSOS & 1) + (nSOS >> 1))*/
/*
* 多阶级低通滤波器
fc: 低通滤波器-3dB衰减频点
fs: 采样率
nSOS: 生成多少个2阶IIR
coeff: 输出系数地址 ( 大小为 nSOS*5 , 顺序是按照硬件EQ摆放了 )*/
extern void butterworth_lp_design(int fc, int fs, int nSOS, float *coeff);
/*
fc: 通滤波器-3dB衰减频点
fs: 采样率
nSOS: 生成nSOS阶IIR
coeff: 输出系数地址 大小为((nSOS & 1) + (nSOS >> 1))*5 , 顺序是按照硬件EQ摆放了 )
段数:((nSOS & 1) + (nSOS >> 1))*/
extern void butterworth_hp_design(int fc, int fs, int nSOS, float *coeff);
/*----------------------------------------------------------------------------*/
/**@brief 低通滤波器
@param fc:中心截止频率
@param fs:采样率
@param quality_factor:q值
@param coeff:计算后,系数输出地址
@return
@note
*/
/*----------------------------------------------------------------------------*/
extern void design_lp(int fc, int fs, float quality_factor, float *coeff);
/*----------------------------------------------------------------------------*/
/**@brief 高通滤波器
@param fc:中心截止频率
@param fs:采样率
@param quality_factor:q值
@param coeff:计算后,系数输出地址
@return
@note
*/
/*----------------------------------------------------------------------------*/
extern void design_hp(int fc, int fs, float quality_factor, float *coeff);
/*----------------------------------------------------------------------------*/
/**@brief 带通滤波器
@param fc:中心截止频率
@param fs:采样率
@param gain:增益
@param quality_factor:q值
@param coeff:计算后,系数输出地址
@return
@note
*/
/*----------------------------------------------------------------------------*/
extern void design_pe(int fc, int fs, float gain, float quality_factor, float *coeff);
/*----------------------------------------------------------------------------*/
/**@brief 低频搁架式滤波器
@param fc:中心截止频率
@param fs:采样率
@param gain:增益
@param quality_factor:q值
@param coeff:计算后,系数输出地址
@return
@note
*/
/*----------------------------------------------------------------------------*/
extern void design_ls(int fc, int fs, float gain, float quality_factor, float *coeff);
/*----------------------------------------------------------------------------*/
/**@brief 高频搁架式滤波器
@param fc:中心截止频率
@param fs:采样率
@param gain:增益
@param quality_factor:q值
@param coeff:计算后,系数输出地址
@return
@note
*/
/*----------------------------------------------------------------------------*/
extern void design_hs(int fc, int fs, float gain, float quality_factor, float *coeff);
/*----------------------------------------------------------------------------*/
/**@brief 滤波器系数检查
@param coeff:滤波器系数
@return
@note
*/
/*----------------------------------------------------------------------------*/
extern int eq_stable_check(float *coeff);
float eq_db2mag(float x);
/*----------------------------------------------------------------------------*/
/**@brief 获取直通的滤波器系数
@param coeff:滤波器系数
@return
@note
*/
/*----------------------------------------------------------------------------*/
extern void eq_get_AllpassCoeff(void *Coeff);
/*----------------------------------------------------------------------------*/
/**@brief 在EQ中断中调用
@param *eq:句柄
@return
@note
*/
/*----------------------------------------------------------------------------*/
void audio_hw_eq_irq_handler(struct hw_eq *eq);
/*----------------------------------------------------------------------------*/
/**@brief EQ初始化
@param *eq:句柄
@return
@note
*/
/*----------------------------------------------------------------------------*/
int audio_hw_eq_init(struct hw_eq *eq, u32 eq_section_num);
/*----------------------------------------------------------------------------*/
/**@brief 打开一个通道
@param *ch:通道句柄
@param *eq:句柄
@return
@note
*/
/*----------------------------------------------------------------------------*/
int audio_hw_eq_ch_open(struct hw_eq_ch *ch, struct hw_eq *eq);
/*----------------------------------------------------------------------------*/
/**@brief 设置回调接口
@param *ch:通道句柄
@param *handler:回调的句柄
@return
@note
*/
/*----------------------------------------------------------------------------*/
int audio_hw_eq_ch_set_handler(struct hw_eq_ch *ch, struct hw_eq_handler *handler);
//
/*----------------------------------------------------------------------------*/
/**@brief 设置通道基础信息
@param *ch:通道句柄
@param channels:通道数
@param out_32bit:是否输出32bit位宽数据 1:是 0:16bit位宽
@return
@note
*/
/*----------------------------------------------------------------------------*/
int audio_hw_eq_ch_set_info(struct hw_eq_ch *ch, u8 channels, u8 out_32bit);
int audio_hw_eq_ch_set_info_new(struct hw_eq_ch *ch, struct hw_eq_info *info);
/*----------------------------------------------------------------------------*/
/**@brief 设置硬件转换系数
@param *ch:通道句柄
@param *info:系数、增益等信息
@return
@note
*/
/*----------------------------------------------------------------------------*/
int audio_hw_eq_ch_set_coeff(struct hw_eq_ch *ch, struct eq_coeff_info *info);
/*----------------------------------------------------------------------------*/
/**@brief 启动一次转换
@param *ch:eq句柄
@param *input:输入数据地址
@param *output:输出数据地址
@param len:输入数据长度
@return
@note
*/
/*----------------------------------------------------------------------------*/
int audio_hw_eq_ch_start(struct hw_eq_ch *ch, void *input, void *output, int len);
/*----------------------------------------------------------------------------*/
/**@brief 关闭一个通道
@param *ch:eq句柄
@return
@note
*/
/*----------------------------------------------------------------------------*/
int audio_hw_eq_ch_close(struct hw_eq_ch *ch);
/*----------------------------------------------------------------------------*/
/**@brief 获取eq是否正在运行状态
@param *ch:eq句柄
@return
@note
*/
/*----------------------------------------------------------------------------*/
int audio_hw_eq_is_running(struct hw_eq *eq);
void audio_hw_eq_spin_lock(struct hw_eq *eq);
void audio_hw_eq_spin_unlock(struct hw_eq *eq);
void design_ls_Q(int fc, int fs, float gain, float quality_factor, float *coeff);
void design_hs_Q(int fc, int fs, float gain, float quality_factor, float *coeff);
#endif /*__HW_EQ_H*/
@@ -0,0 +1,14 @@
#ifndef _AUDIO_OUTPUT_DAC_H_
#define _AUDIO_OUTPUT_DAC_H_
#include "typedef.h"
#define TYPE_DAC_AGAIN (0x01)
#define TYPE_DAC_DGAIN (0x02)
extern int audio_dac_vol_set(u8 type, u32 ch, u16 gain, u8 fade_en);
extern int audio_dac_vol_mute(u8 mute, u8 fade);
extern int audio_dac_vol_mute_lock(u8 lock);
#endif // _AUDIO_OUTPUT_DAC_H_
+82
View File
@@ -0,0 +1,82 @@
#ifndef _AEC_UART_DEBUG_H_
#define _AEC_UART_DEBUG_H_
#include "generic/typedef.h"
/*
*********************************************************
* aec_uart_open
* Description: 打开数据写卡接口
* Arguments : nch 总通道数,single_size 单个通道的数据大小
* Return : 0 成功 其他 失败
* Note(s) : None.
*********************************************************
*/
int aec_uart_open(u8 nch, u16 single_size);
/*
*********************************************************
* aec_uart_init
* Description: 数据写卡初始化
* Arguments : None.
* Return : 0 成功 其他 失败
* Note(s) : None.
*********************************************************
*/
int aec_uart_init(void);
/*
*********************************************************
* aec_uart_fill
* Description: 填写对应通道的数据
* Arguments : ch 通道号,buf 数据地址,size 数据大小
* Return : 0 成功 其他 失败
* Note(s) : None.
*********************************************************
*/
int aec_uart_fill(u8 ch, void *buf, u16 size);
/*
*********************************************************
* aec_uart_write
* Description: 将写入通话的数据写入串口buffer
* Arguments : None.
* Return : None.
* Note(s) : None.
*********************************************************
*/
void aec_uart_write(void);
/*
*********************************************************
* aec_uart_close
* Description: 关闭数据写卡
* Arguments : None.
* Return : 0 成功 其他 失败
* Note(s) : None.
*********************************************************
*/
int aec_uart_close(void);
/*
*********************************************************
* aec_uart_open_v2
* Description: 打开数据写卡接口
* Arguments : nch 总通道数,single_size 单次运行发送的数据大小
* Return : 0 成功 其他 失败
* Note(s) : None.
*********************************************************
*/
int aec_uart_open_v2(u8 nch, u16 single_size);
/* Description: 填写对应通道的数据
* Arguments : ch 通道号,buf 数据地址,size 数据大小*/
int aec_uart_fill_v2(u8 ch, void *buf, u16 size);
/*将数据写入串口buffer*/
void aec_uart_write_v2(void);
/*关闭数据写卡*/
int aec_uart_close_v2(void);
#endif/*_AEC_UART_DEBUG_H_*/
+22
View File
@@ -0,0 +1,22 @@
#ifndef _AUDIO_AGC_H_
#define _AUDIO_AGC_H_
#include "generic/typedef.h"
typedef struct {
float AGC_max_lvl; //最大幅度压制,range[0 : -90] dB
float AGC_fade_in_step; //淡入步进,range[0.1 : 5] dB
float AGC_fade_out_step; //淡出步进,range[0.1 : 5] dB
float AGC_max_gain; //放大上限, range[-90 : 40] dB
float AGC_min_gain; //放大下限, range[-90 : 40] dB
float AGC_speech_thr; //放大阈值, range[-70 : -40] dB
int AGC_samplerate; //采样率
int AGC_frame_size; //帧长(short),处理数据长度是帧长的倍数时,没有数据缓存延时
} agc_param_t;
int audio_agc_run(void *hdl, short *in, short *out, int len);
void *audio_agc_open(agc_param_t *param);
int audio_agc_close(void *hdl);
#endif/*_AUDIO_AGC_H_*/
+81
View File
@@ -0,0 +1,81 @@
/*
*******************************************************************
* Audio CVP Definitions
*
*Note(s):
* (1)Only macro definitions can be defined here.
* (2)Use (1UL << (n)) instead of BIT(n)
*******************************************************************
*/
#ifndef _AUDIO_CVP_DEF_H_
#define _AUDIO_CVP_DEF_H_
/*agc类型定义*/
#define AGC_EXTERNAL 0
#define AGC_INTERNAL 1
/*
*SMS算法选择
*(1)SMS_TDE模式性能更好,同时也需要更多的ram和mips
*(2)SMS_TDE内置了延时估计和延时补偿
*可以更好的兼容延时不固定的场景
*/
//<SMS Mode Defined>
#define SMS_DEFAULT 0 //独立库算法模型
#define SMS_TDE 1 //集成库算法模型
//<Noise Suppress Config>
#define CVP_ANS_MODE 0 /*传统降噪*/
#define CVP_DNS_MODE 1 /*神经网络降噪*/
/*DMS Mode Config*/
#define DMS_NORMAL 1 //普通双mic降噪(mic距离固定)
#define DMS_FLEXIBLE 2 //适配mic距离不固定且距离比较远的情况,比如头戴式话务耳机
#define DMS_HYBRID 3 //talk mic + fb mic 风噪处理
#define DMS_AWN 4 //talk mic + ff mic 风噪处理
/*develop cvp select*/
#define CVP_CFG_USER_DEFINED 1 //用户自定义开发算法
#define CVP_CFG_AIS_3MIC 2 //思必驰3mic算法
/*DMS版本定义*/
#define DMS_GLOBAL_V100 0xB1
#define DMS_GLOBAL_V200 0xB2
/*
* V200新算法回声消除nlp模式
* JLSP_NLP_MODE1: 模式1为单独的NLP回声抑制,回声压制会偏过,该模式下NLP模块可以单独开启
* JLSP_NLP_MODE2: 模式2下回声信号会先经过AEC线性压制,然后进行NLP非线性压制
* 此模式NLP不能单独打开需要同时打开AEC,使用AEC模块压制不够时,建议开启该模式
*/
#define JLSP_NLP_MODE1 0x01 //模式一(默认)
#define JLSP_NLP_MODE2 0x02 //模式二
/*
* V200新算法风噪降噪模式
* JLSP_WD_MODE1: 模式1为常规的降风噪模式,风噪残余会偏大些
* JLSP_WD_MODE2: 模式2为神经网络降风噪,风噪抑制会比较干净,但是会需要多消耗31kb的flash
*/
#define JLSP_WD_MODE1 0x01 //常规降噪
#define JLSP_WD_MODE2 0x02 //nn降风噪,目前该算法启用会多31kflash
/*
* JLSP_3MIC_MODE0 //使用双麦模式
* JLSP_3MIC_MODE1 //3mic模式1,一般tws耳机使用
* JLSP_3MIC_MODE2 //3mic模式2,一般头戴式耳机使用
* choosemode函数只用来在线设置切换跑2mic还是3mic,设置mode1和mode2时才有效
*/
#define JLSP_3MIC_MODE0 0x00 //使用双麦模式或单麦模式
#define JLSP_3MIC_MODE1 0x01 //3mic模式1
#define JLSP_3MIC_MODE2 0x02 //3mic模式2
/*CVP带宽配置*/
#define CVP_NB_EN 0x01 //Narrow-Band
#define CVP_WB_EN 0x02 //Wide-Band
/*CVP参考数据来源定义*/
#define CVP_REF_SOURCE_DAC_INTERNAL (1UL << (0)) //DAC内部参考数据
#define CVP_REF_SOURCE_EXTERNAL (1UL << (1)) //外部参考数据:FM_Tx/IIS
#endif/*_AUDIO_CVP_DEF_H_*/
+167
View File
@@ -0,0 +1,167 @@
SECTIONS
{
.data ALIGN(32):SUBALIGN(4)
{
audio_cvp_data_begin = .;
. = ALIGN(4);
*(.jlsp_aec_data)
*(.jlsp_nlp_data)
*(.jlsp_dns_data)
*(.jlsp_enc_data)
*(.jlsp_prep_data)
*(.jlsp_wn_data)
*(.jlsp_tri_data)
*(.jlsp_agc_data)
*(.jlsp_dms_hybrid_data)
*(.jlsp_dms_awn_data)
*(.sms_data)
*(.sms_stereo_data)
*(.dms_data)
*(.data._*)
*(.aec_data)
*(.res_data)
*(.ns_data)
*(.jlsp_data)
*(.nlp_data)
*(.der_data)
*(.qmf_data)
*(.fft_data)
audio_cvp_data_end = .;
audio_cvp_data_size = audio_cvp_data_end - audio_cvp_data_begin ;
. = ALIGN(4);
} > ram0
.bss ALIGN(32):SUBALIGN(4)
{
audio_cvp_bss_begin = .;
. = ALIGN(4);
*(.sms_bss)
*(.sms_stereo_bss)
*(.aec_bss)
*(.nlp_bss)
*(.res_bss)
*(.ns_bss)
*(.der_bss)
. = ALIGN(4);
*(.jlsp_bss)
*(.jlsp_aec_bss)
*(.jlsp_nlp_bss)
*(.jlsp_dns_bss)
*(.jlsp_enc_bss)
*(.jlsp_prep_bss)
*(.jlsp_wn_bss)
*(.jlsp_tri_bss)
*(.jlsp_agc_bss)
*(.jlsp_dms_hybrid_bss)
*(.jlsp_dms_awn_bss)
audio_cvp_bss_end = .;
audio_cvp_bss_size = audio_cvp_bss_end - audio_cvp_bss_begin ;
} > ram0
.text ALIGN(32):SUBALIGN(4)
{
. = ALIGN(4);
cvp_code_begin = . ;
*(.dns_16k_data)
*(.dns_8k_data)
. = ALIGN(4);
*(.jlsp_const)
*(.jlsp_code)
*(.jlsp_dns_code)
*(.jlsp_dns_const)
*(.dns_param_data_wind)
*(.dns_common_data_wind)
*(.ns_sparse_code )
*(.aec_sparse_code)
*(.nlp_sparse_code)
*(.der_sparse_code)
*(.qmf_sparse_code)
*(.sms_sparse_code)
*(.sms_stereo_sparse_code)
*(.dms_sparse_code)
*(.opcore_maskrom)
#if AUDIO_CVP_TEXT_AT_RAM == 0
. = ALIGN(4);
*(.text._*)
#endif
#if AUDIO_CVP_AEC_AT_RAM == 0
*(.jlsp_aec_code)
*(.jlsp_aec_const)
#endif
#if AUDIO_CVP_NLP_AT_RAM == 0
*(.nlp_code)
*(.nlp_const)
*(.qmf_code)
*(.qmf_const)
*(.jlsp_nlp_code)
*(.jlsp_nlp_const)
#endif
#if AUDIO_CVP_NS_AT_RAM == 0
*(.ns_code)
*(.ns_const)
#endif
#if AUDIO_CVP_COMMON_AT_RAM == 0
. = ALIGN(4);
*(.aec_mem)
*(.aec_mux)
*(.aec_code)
*(.aec_const)
*(.res_code)
*(.res_const)
*(.bark_const)
*(.fft_code)
*(.fft_const)
*(.der_code)
*(.der_const)
#endif
#if AUDIO_CVP_DNS_AT_RAM == 0
. = ALIGN(4);
*(.dns_common_data)
*(.dns_param_data_single)
*(.dns_param_data_dual)
. = ALIGN(4);
#endif
#if AUDIO_CVP_AGC_AT_RAM == 0
*(.agc_code)
*(.agc_const)
*(.jlsp_agc_code)
*(.jlsp_agc_const)
#endif
#if AUDIO_CVP_DMS_AT_RAM == 0
*(.dms_code)
*(.dms_const)
*(.jlsp_enc_code)
*(.jlsp_enc_const)
*(.jlsp_dms_hybrid_code)
*(.jlsp_dms_hybrid_const)
*(.jlsp_dms_awn_code)
*(.jlsp_dms_awn_const)
#endif
#if AUDIO_CVP_SMS_AT_RAM == 0
*(.sms_const)
*(.sms_code)
*(.sms_stereo_const)
*(.sms_stereo_code)
#endif
#if AUDIO_CVP_PREP_AT_RAM == 0
*(.jlsp_prep_code)
*(.jlsp_prep_const)
#endif
#if AUDIO_CVP_WN_AT_RAM == 0
*(.jlsp_wn_code)
*(.jlsp_wn_const)
#endif
#if AUDIO_CVP_THIRD_AT_RAM == 0
*(.jlsp_tri_code)
*(.jlsp_tri_const)
#endif
. = ALIGN(4);
cvp_code_end = . ;
cvp_code_size = cvp_code_end - cvp_code_begin ;
} > code0
}
@@ -0,0 +1,83 @@
/*使用动态加载时*/
#ifdef CONFIG_CODE_MOVABLE_ENABLE
. = ALIGN(4);
cvp_data_code_begin = . ;
#if AUDIO_CVP_TEXT_AT_RAM
. = ALIGN(4);
*(.text._*)
#endif
#if AUDIO_CVP_AEC_AT_RAM
*(.jlsp_aec_code)
*(.jlsp_aec_const)
#endif
#if AUDIO_CVP_NLP_AT_RAM
*(.nlp_code)
*(.nlp_const)
*(.qmf_code)
*(.qmf_const)
*(.jlsp_nlp_code)
*(.jlsp_nlp_const)
#endif
#if AUDIO_CVP_NS_AT_RAM
*(.ns_code)
*(.ns_const)
#endif
#if AUDIO_CVP_COMMON_AT_RAM
. = ALIGN(4);
*(.aec_mem)
*(.aec_mux)
*(.aec_code)
*(.aec_const)
*(.res_code)
*(.res_const)
*(.bark_const)
*(.fft_code)
*(.fft_const)
*(.der_code)
*(.der_const)
#endif
#if AUDIO_CVP_DNS_AT_RAM
. = ALIGN(4);
*(.dns_common_data)
*(.dns_param_data_single)
*(.dns_param_data_dual)
. = ALIGN(4);
#endif
#if AUDIO_CVP_AGC_AT_RAM
*(.agc_code)
*(.agc_const)
*(.jlsp_agc_code)
*(.jlsp_agc_const)
#endif
#if AUDIO_CVP_DMS_AT_RAM
*(.dms_code)
*(.dms_const)
*(.jlsp_enc_code)
*(.jlsp_enc_const)
*(.jlsp_dms_hybrid_code)
*(.jlsp_dms_hybrid_const)
*(.jlsp_dms_awn_code)
*(.jlsp_dms_awn_const)
#endif
#if AUDIO_CVP_SMS_AT_RAM
*(.sms_const)
*(.sms_code)
#endif
#if AUDIO_CVP_PREP_AT_RAM
*(.jlsp_prep_code)
*(.jlsp_prep_const)
#endif
#if AUDIO_CVP_WN_AT_RAM
*(.jlsp_wn_code)
*(.jlsp_wn_const)
#endif
#if AUDIO_CVP_THIRD_AT_RAM
*(.jlsp_tri_code)
*(.jlsp_tri_const)
#endif
. = ALIGN(4);
cvp_data_code_end = . ;
cvp_data_code_size = cvp_data_code_end - cvp_data_code_begin ;
#endif /*CONFIG_CODE_MOVABLE_ENABLE*/
+58
View File
@@ -0,0 +1,58 @@
#ifndef _CVP_COMMON_H_
#define _CVP_COMMON_H_
#include "audio_cvp_def.h"
extern const int const_audio_cvp_debug_online_enable;
/*CVP参考数据源配置*/
/* #define CVP_REF_SOURCE_CFG CVP_REF_SOURCE_DAC_INTERNAL */
#define CVP_REF_SOURCE_CFG (CVP_REF_SOURCE_DAC_INTERNAL | CVP_REF_SOURCE_EXTERNAL)
//CVP外部参考数据使能判断
#define CVP_REF_SOURCE_EXTERNAL_ENABLE (CVP_REF_SOURCE_CFG & CVP_REF_SOURCE_EXTERNAL)
/*DMS输出选择*/
typedef enum {
DMS_OUTPUT_SEL_DEFAULT = 0, /*默认输出:dms处理后的数据*/
DMS_OUTPUT_SEL_MASTER, /*主mic原始数据*/
DMS_OUTPUT_SEL_SLAVE, /*副mic原始数据*/
DMS_OUTPUT_SEL_FBMIC, /*FB mic原始数据*/
} CVP_OUTPUT_ENUM;
/*
*********************************************************************
* Audio CVP IOCTL
* Description: CVP功能配置
* Arguments : cmd 操作命令
* value 操作数
* priv 操作内存地址
* Return : 0 成功 其他 失败
* Note(s) : (1)比如动态开关降噪NS模块:
* aec_dms_ioctl(CVP_NS_SWITCH,1,NULL); //降噪关
* aec_dms_ioctl(CVP_NS_SWITCH,0,NULL); //降噪开
*********************************************************************
*/
enum {
CVP_AEC_SWITCH = 1,
CVP_NLP_SWITCH,
CVP_NS_SWITCH,
CVP_AGC_SWITCH,
CVP_ENC_SWITCH,
CVP_AGC_MAX_LVL,
CVP_ANS_NOISE_FLOOR,
CVP_ANS_LOWCUTTHR,
CVP_WNC_SWITCH,
CVP_MFDT_SWITCH,
CVP_OUTWAY_REF_IGNORE,
};
int aec_ioctl(int cmd, int value, void *priv);
int sms_tde_ioctl(int cmd, int value, void *priv);
int aec_dms_ioctl(int cmd, int value, void *priv);
int aec_dms_flexible_ioctl(int cmd, int value, void *priv);
int aec_dms_hybrid_ioctl(int cmd, int value, void *priv);
int aec_dms_awn_ioctl(int cmd, int value, void *priv);
int aec_tms_ioctl(int cmd, int value, void *priv);
#endif /*_CVP_COMMON_H_*/
+447
View File
@@ -0,0 +1,447 @@
#ifndef _CVP_DMS_H_
#define _CVP_DMS_H_
#include "generic/typedef.h"
#include "cvp_common.h"
/*降噪版本定义*/
#define DMS_V100 0xA1
#define DMS_V200 0xA2
//dms_cfg:
typedef struct {
u8 mic_again; //DAC增益,default:3(0~14)
u8 dac_again; //MIC增益,default:22(0~31)
u8 enable_module; //使能模块
u8 ul_eq_en; //上行EQ使能,default:enable(disable(0), enable(1))
/*AGC*/
float ndt_fade_in; //单端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float ndt_fade_out; //单端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float dt_fade_in; //双端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float dt_fade_out; //双端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float ndt_max_gain; //单端讲话放大上限,default: 12.f(0 ~ 24 dB)
float ndt_min_gain; //单端讲话放大下限,default: 0.f(-20 ~ 24 dB)
float ndt_speech_thr; //单端讲话放大阈值,default: -50.f(-70 ~ -40 dB)
float dt_max_gain; //双端讲话放大上限,default: 12.f(0 ~ 24 dB)
float dt_min_gain; //双端讲话放大下限,default: 0.f(-20 ~ 24 dB)
float dt_speech_thr; //双端讲话放大阈值,default: -40.f(-70 ~ -40 dB)
float echo_present_thr; //单端双端讲话阈值,default:-70.f(-70 ~ -40 dB)
/*aec*/
int aec_process_maxfrequency; //default:8000,range[3000:8000]
int aec_process_minfrequency; //default:0,range[0:1000]
int af_length; //default:128 range[128:256]
/*nlp*/
int nlp_process_maxfrequency; //default:8000,range[3000:8000]
int nlp_process_minfrequency; //default:0,range[0:1000]
float overdrive; //default:1,range[0:30]
/*ans*/
float aggressfactor; //default:1.25,range[1:2]
float minsuppress; //default:0.04,range[0.01:0.1]
float init_noise_lvl; //default:-75dB,range[-100:-30]
/*enc*/
int enc_process_maxfreq; //default:8000,range[3000:8000]
int enc_process_minfreq; //default:0,range[0:1000]
int sir_maxfreq; //default:3000,range[1000:8000]
float mic_distance; //default:0.015,range[0.035:0.015]
float target_signal_degradation;//default:1,range[0:1]
float enc_aggressfactor; //default:4.f,range[0:4]
float enc_minsuppress; //default:0.09f,range[0:0.1]
/*common*/
float global_minsuppress; //default:0.0,range[0.0:0.09]
/*回采*/
u16 adc_ref_en; /*adc回采参考数据使能*/
/*MFDT Parameters*/
float detect_time; // // 检测时间s,影响状态切换的速度
float detect_eng_diff_thr; // 0~-90 dB 两个mic能量差异持续大于此阈值超过检测时间则会检测为故障
float detect_eng_lowerbound; // 0~-90 dB 当处于故障状态时,正常的mic能量大于此阈值才会检测能量差异,避免安静环境下误判切回正常状态
int MalfuncDet_MaxFrequency;// 检测信号的最大频率成分
int MalfuncDet_MinFrequency;// 检测信号的最小频率成分
int OnlyDetect;// 0 -> 故障切换到单mic模式, 1-> 只检测不切换
/*debug*/
u8 output_sel;/*dms output选择*/
} _GNU_PACKED_ AEC_DMS_CONFIG;
//dms_flexible_cfg:
typedef struct {
u8 ver; //Ver:01
u8 mic_again; //MIC0增益,default:10(0~14)
u8 mic1_again; //MIC1增益,default:3(0~14)
u8 dac_again; //DAC增益,default:22(0~31)
u8 enable_module; //使能模块 NS:BIT(2) ENC:BIT(3) AGC:BIT(4)
u8 ul_eq_en; //上行EQ使能,default:enable(disable(0), enable(1))
u8 reserved[2];
/*AGC*/
float ndt_fade_in; //单端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float ndt_fade_out; //单端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float dt_fade_in; //双端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float dt_fade_out; //双端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float ndt_max_gain; //单端讲话放大上限,default: 12.f(0 ~ 24 dB)
float ndt_min_gain; //单端讲话放大下限,default: 0.f(-20 ~ 24 dB)
float ndt_speech_thr; //单端讲话放大阈值,default: -50.f(-70 ~ -40 dB)
float dt_max_gain; //双端讲话放大上限,default: 12.f(0 ~ 24 dB)
float dt_min_gain; //双端讲话放大下限,default: 0.f(-20 ~ 24 dB)
float dt_speech_thr; //双端讲话放大阈值,default: -40.f(-70 ~ -40 dB)
float echo_present_thr; //单端双端讲话阈值,default:-70.f(-70 ~ -40 dB)
/*aec*/
int aec_process_maxfrequency; //default:8000,range[3000:8000]
int aec_process_minfrequency; //default:0,range[0:1000]
int af_length; //default:128 range[128:256]
/*nlp*/
int nlp_process_maxfrequency; //default:8000,range[3000:8000]
int nlp_process_minfrequency; //default:0,range[0:1000]
float overdrive; //default:1,range[0:30]
/*ans*/
float aggressfactor; //default:1.25,range[1:2]
float minsuppress; //default:0.04,range[0.01:0.1]
float init_noise_lvl; //default:-75dB,range[-100:-30]
/*enc*/
float enc_suppress_pre; //ENC前级压制,越大越强 default:0.6f,range[0:1]
float enc_suppress_post; //ENC后级压制,越大越强 default:0.15f,range[0:1]
float enc_minsuppress; //ENC后级压制下限 default:0.09f,range[0:1]
float enc_disconverge_erle_thr; //滤波器发散控制阈值,越大控制越强 default:-6.f,range[-20:5]
/*回采*/
u16 adc_ref_en; /*adc回采参考数据使能*/
/*debug*/
u8 output_sel;/*dms output选择*/
} _GNU_PACKED_ DMS_FLEXIBLE_CONFIG;
typedef struct {
u8 ver; //Ver:01
u8 mic_again; //MIC增益,default:3(0~14)
u8 fb_mic_again; //FB MIC增益,default:3(0~14)
u8 dac_again; //DAC增益,default:22(0~31)
u8 enable_module; //使能模块
u8 ul_eq_en; //上行EQ使能,default:enable(disable(0), enable(1))
u8 agc_type; //AGC类型选择,0AGC_EXTERNAL1AGC_INTERNAL
union {
/*AGC*/
struct {
float ndt_fade_in; //单端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float ndt_fade_out; //单端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float dt_fade_in; //双端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float dt_fade_out; //双端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float ndt_max_gain; //单端讲话放大上限,default: 12.f(-90 ~ 40 dB)
float ndt_min_gain; //单端讲话放大下限,default: 0.f(-90 ~ 40 dB)
float ndt_speech_thr; //单端讲话放大阈值,default: -50.f(-70 ~ -40 dB)
float dt_max_gain; //双端讲话放大上限,default: 12.f(-90 ~ 40 dB)
float dt_min_gain; //双端讲话放大下限,default: 0.f(-90 ~ 40 dB)
float dt_speech_thr; //双端讲话放大阈值,default: -40.f(-70 ~ -30 dB)
float echo_present_thr; //单端双端讲话阈值,default:-70.f(-70 ~ -30 dB)
} agc_ext;
/*JLSP AGC*/
struct {
int min_mag_db_level;//语音能量放大下限阈值,范围:-90 ~ -35 db,默认-50,单位:dB
int max_mag_db_level;//语音能量放大上限阈值,范围:-90 ~ 0 dB,默认-3 ,单位dB
int addition_mag_db_level;//语音补偿能量值,范围:0 ~ 20 dB,默认0 ,单位dB
int clip_mag_db_level;//语音最大截断能量值,范围:-10 ~ 0 dB,默认-3,单位dB
int floor_mag_db_level;//语音最小截断能量值,范围:-90 ~ -35 dB,默认-70,单位dB
} agc_int;
} agc;
/*aec*/
int aec_process_maxfrequency; //default:8000,range[3000:8000]
int aec_process_minfrequency; //default:0,range[0:1000]
int af_length; //default:128 range[128:256]
/*nlp*/
int nlp_process_maxfrequency; //default:8000,range[3000:8000]
int nlp_process_minfrequency; //default:0,range[0:1000]
float overdrive; //default:1,range[0:30]
/*dns*/
int dns_process_maxfrequency; //default:8000,range[3000:8000]
int dns_process_minfrequency; //default:0,range[0:1000]
float aggressfactor; //default:1.25,range[1:2]
float minsuppress; //default:0.04,range[0.01:0.1]
float init_noise_lvl; //default:-75dB,range[-100:-30]
/*enc*/
int enc_process_maxfreq; //default:8000,range[3000:8000]
int enc_process_minfreq; //default:0,range[0:1000]
float snr_db_T0; //sir设定阈值
float snr_db_T1; //sir设定阈值
float floor_noise_db_T;
float compen_db; //mic增益补偿, dB
/*wn*/
float coh_val_T; //双麦非相关性阈值,范围:0 ~ 1,默认值:0.6
float eng_db_T; //麦增益能量阈值,范围:0 ~ 255 dB,默认值:80,单位:dB
/*回采*/
u16 adc_ref_en; /*adc回采参考数据使能*/
/*debug*/
u8 output_sel;/*dms output选择: 0:Default, 1:Master Raw, 2:Slave Raw, 3:Fbmic Raw*/
} _GNU_PACKED_ DMS_HYBRID_CONFIG;
typedef struct {
u8 ver; //Ver:01
u8 mic_again; //MIC增益,default:3(0~14)
u8 fb_mic_again; //FB MIC增益,default:3(0~14)
u8 dac_again; //DAC增益,default:22(0~31)
u8 enable_module; //使能模块
u8 ul_eq_en; //上行EQ使能,default:enable(disable(0), enable(1))
u8 agc_type; //AGC类型选择,0AGC_EXTERNAL1AGC_INTERNAL
union {
/*AGC*/
struct {
float ndt_fade_in; //单端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float ndt_fade_out; //单端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float dt_fade_in; //双端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float dt_fade_out; //双端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float ndt_max_gain; //单端讲话放大上限,default: 12.f(-90 ~ 40 dB)
float ndt_min_gain; //单端讲话放大下限,default: 0.f(-90 ~ 40 dB)
float ndt_speech_thr; //单端讲话放大阈值,default: -50.f(-70 ~ -40 dB)
float dt_max_gain; //双端讲话放大上限,default: 12.f(-90 ~ 40 dB)
float dt_min_gain; //双端讲话放大下限,default: 0.f(-90 ~ 40 dB)
float dt_speech_thr; //双端讲话放大阈值,default: -40.f(-70 ~ -30 dB)
float echo_present_thr; //单端双端讲话阈值,default:-70.f(-70 ~ -30 dB)
} agc_ext;
/*JLSP AGC*/
struct {
int min_mag_db_level;//语音能量放大下限阈值,范围:-90 ~ -35 db,默认-50,单位:dB
int max_mag_db_level;//语音能量放大上限阈值,范围:-90 ~ 0 dB,默认-3 ,单位dB
int addition_mag_db_level;//语音补偿能量值,范围:0 ~ 20 dB,默认0 ,单位dB
int clip_mag_db_level;//语音最大截断能量值,范围:-10 ~ 0 dB,默认-3,单位dB
int floor_mag_db_level;//语音最小截断能量值,范围:-90 ~ -35 dB,默认-70,单位dB
} agc_int;
} agc;
/*aec*/
int aec_process_maxfrequency; //default:8000,range[3000:8000]
int aec_process_minfrequency; //default:0,range[0:1000]
int af_length; //default:128 range[128:256]
/*nlp*/
int nlp_process_maxfrequency; //default:8000,range[3000:8000]
int nlp_process_minfrequency; //default:0,range[0:1000]
float overdrive; //default:1,range[0:30]
/*dns*/
int dns_process_maxfrequency; //default:8000,range[3000:8000]
int dns_process_minfrequency; //default:0,range[0:1000]
float aggressfactor; //default:1.25,range[1:2]
float minsuppress; //default:0.04,range[0.01:0.1]
float init_noise_lvl; //default:-75dB,range[-100:-30]
/*wn*/
float coh_val_T; //双麦非相关性阈值,范围:0 ~ 1,默认值:0.6
float eng_db_T; //麦增益能量阈值,范围:0 ~ 255 dB,默认值:80,单位:dB
/*回采*/
u16 adc_ref_en; /*adc回采参考数据使能*/
/*debug*/
u8 output_sel;/*dms output选择: 0:Default, 1:Master Raw, 2:Slave Raw, 3:Fbmic Raw*/
} _GNU_PACKED_ DMS_AWN_CONFIG;
struct dms_attr {
u8 ul_eq_en: 1;
u8 wideband: 1;
u8 wn_en: 1;
u8 dly_est : 1;
u8 aptfilt_only: 1;
u8 reserved: 3;
u8 dst_delay;/*延时估计目标延时*/
u8 EnableBit;
u8 FB_EnableBit;
u8 packet_dump;
u8 SimplexTail;
u8 output_sel;/*dms output选择*/
u16 hw_delay_offset;/*dac hardware delay offset*/
u16 wn_gain;/*white_noise gain*/
u8 agc_type; /*agc类型*/
/*AGC*/
float AGC_NDT_fade_in_step; //in dB
float AGC_NDT_fade_out_step; //in dB
float AGC_NDT_max_gain; //in dB
float AGC_NDT_min_gain; //in dB
float AGC_NDT_speech_thr; //in dB
float AGC_DT_fade_in_step; //in dB
float AGC_DT_fade_out_step; //in dB
float AGC_DT_max_gain; //in dB
float AGC_DT_min_gain; //in dB
float AGC_DT_speech_thr; //in dB
float AGC_echo_present_thr; //In dB
int AGC_echo_look_ahead; //in ms
int AGC_echo_hold; // in ms
/*AEC*/
int aec_process_maxfrequency; //default:8000,range[3000:8000]
int aec_process_minfrequency; //default:0,range[0:1000]
int af_length; //default:128 range[128:256]
/*NLP*/
int nlp_process_maxfrequency; //default:8000,range[3000:8000]
int nlp_process_minfrequency; //default:0,range[0:1000]
float overdrive; //default:1,range[0:30]
/*ANS*/
float aggressfactor; //default:1.25,range[1:2]
float minsuppress; //default:0.04,range[0.01:0.1]
float init_noise_lvl; //default:-75db,range[-100:-30]
/*ENC*/
int enc_process_maxfreq; //default:8000,range[3000:8000]
int enc_process_minfreq; //default:0,range[0:1000]
int sir_maxfreq; //default:3000,range[1000:8000]
float mic_distance; //default:0.015,range[0.035:0.015]
float target_signal_degradation;//default:1,range[0:1]
float enc_aggressfactor; //default:4.f,range[0:4]
float enc_minsuppress; //default:0.09f,range[0:0.1]
/*BCS*/
int bone_process_maxfreq;
int bone_process_minfreq;
float bone_init_noise_lvl;
int Bone_AEC_Process_MaxFrequency;
int Bone_AEC_Process_MinFrequency;
/*common*/
float global_minsuppress; //default:0.0,range[0.0:0.09]
/*data handle*/
int (*cvp_advanced_options)(void *aec,
void *nlp,
void *ns,
void *enc,
void *agc,
void *wn,
void *mfdt);
int (*aec_probe)(short *mic0, short *mic2, short *mic3, short *ref, u16 len);
int (*aec_post)(s16 *dat, u16 len);
int (*aec_update)(u8 EnableBit);
int (*output_handle)(s16 *dat, u16 len);
/*flexible enc*/
int flexible_af_length; //default:512 range[128、256、512、1024]
int sir_minfreq; //default:100,range[0:8000]
int SIR_mean_MaxFrequency; //default:1000,range[0:8000]
int SIR_mean_MinFrequency; //default:100,range[0:8000]
float ENC_CoheFlgMax_gamma; //default:0.5f,range[0:1]
float coheXD_thr; //default:0.5f,range[0:1]
float Disconverge_ERLE_Thr; //default:-6.f,range[-20:5]
/*WN*/
float wn_detect_time; //in second
float wn_detect_time_ratio_thr; //0-1
float wn_detect_thr; //0-1
float wn_minsuppress; //0-1
/*Extended-Parameters*/
u32 ref_sr;
u16 ref_channel; /*参考数据声道数*/
u16 adc_ref_en; /*adc回采参考数据使能*/
u8 mic_bit_width; /*麦克风数据位宽*/
u8 ref_bit_width; /*参考数据位宽*/
/*DNS Parameters*/
float DNS_highGain; //EQ强度 range[1.0:3.5]
float DNS_rbRate; //混响强度 range[0:0.9];
/*MFDT Parameters*/
float detect_time; // // 检测时间s,影响状态切换的速度
float detect_eng_diff_thr; // 0~-90 dB 两个mic能量差异持续大于此阈值超过检测时间则会检测为故障
float detect_eng_lowerbound; // 0~-90 dB 当处于故障状态时,正常的mic能量大于此阈值才会检测能量差异,避免安静环境下误判切回正常状态
int MalfuncDet_MaxFrequency;// 检测信号的最大频率成分
int MalfuncDet_MinFrequency;// 检测信号的最小频率成分
int OnlyDetect;// 0 -> 故障切换到单mic模式, 1-> 只检测不切换
/*jlsp hybrid enc*/
float snr_db_T0;
float snr_db_T1;
float floor_noise_db_T;
float compen_db;
float *transfer_func;
/*jlsp hybrid dns*/
int dns_process_maxfrequency;
int dns_process_minfrequency;
/*jlsp hybrid agc*/
int min_mag_db_level;
int max_mag_db_level;
int addition_mag_db_level;
int clip_mag_db_level;
int floor_mag_db_level;
/*jlsp dms hybrid wn*/
float coh_val_T; //双麦非相关性阈值,范围:0 ~ 1,默认值:0.6
float eng_db_T; //麦增益能量阈值,范围:0 ~ 255 dB,默认值:80,单位:dB
};
s32 aec_dms_init(struct dms_attr *attr);
s32 aec_dms_exit();
s32 aec_dms_fill_in_data(void *dat, u16 len);
int aec_dms_fill_in_ref_data(void *dat, u16 len);
s32 aec_dms_fill_ref_data(void *data0, void *data1, u16 len);
void aec_dms_toggle(u8 toggle);
int aec_dms_cfg_update(AEC_DMS_CONFIG *cfg);
int aec_dms_reboot(u8 enablebit);
u8 get_cvp_dms_rebooting();
s32 aec_dms_flexible_init(struct dms_attr *attr);
s32 aec_dms_flexible_exit();
s32 aec_dms_flexible_fill_in_data(void *dat, u16 len);
int aec_dms_flexible_fill_in_ref_data(void *dat, u16 len);
s32 aec_dms_flexible_fill_ref_data(void *data0, void *data1, u16 len);
void aec_dms_flexible_toggle(u8 toggle);
int aec_dms_flexible_cfg_update(DMS_FLEXIBLE_CONFIG *cfg);
int aec_dms_flexible_reboot(u8 enablebit);
u8 get_cvp_dms_flexible_rebooting();
s32 aec_dms_hybrid_init(struct dms_attr *attr);
s32 aec_dms_hybrid_exit();
s32 aec_dms_hybrid_fill_in_data(void *dat, u16 len);
int aec_dms_hybrid_fill_in_ref_data(void *dat, u16 len);
s32 aec_dms_hybrid_fill_ref_data(void *data0, void *data1, u16 len);
int cvp_dms_hybrid_read_ref_data(void);
void aec_dms_hybrid_toggle(u8 toggle);
int aec_dms_hybrid_cfg_update(DMS_HYBRID_CONFIG *cfg);
int aec_dms_hybrid_reboot(u8 enablebit);
u8 get_cvp_dms_hybrid_rebooting();
s32 aec_dms_awn_init(struct dms_attr *attr);
s32 aec_dms_awn_exit();
s32 aec_dms_awn_fill_in_data(void *dat, u16 len);
int aec_dms_awn_fill_in_ref_data(void *dat, u16 len);
s32 aec_dms_awn_fill_ref_data(void *data0, void *data1, u16 len);
int cvp_dms_awn_read_ref_data(void);
void aec_dms_awn_toggle(u8 toggle);
int aec_dms_awn_cfg_update(DMS_AWN_CONFIG *cfg);
int aec_dms_awn_reboot(u8 enablebit);
u8 get_cvp_dms_awn_rebooting();
/*获取风噪的检测结果,1:有风噪,0:无风噪*/
int cvp_dms_get_wind_detect_state(void);
/*单双麦切换状态
* 0: 正常双麦 ;
* 1: 副麦坏了,触发故障
* -1: 主麦坏了,触发故障
*/
int cvp_dms_get_malfunc_state(void);
/*
* 获取mic的能量值,开了MFDT_EN才能用
* mic: 0 获取主麦能量
* mic1 获取副麦能量
* return:返回能量值,[0~90.3],返回-1表示错误
*/
float cvp_dms_get_mic_energy(u8 mic);
typedef enum {
DMS_FLEXIBLE_DUAL_MIC = 0, //双mic
DMS_FLEXIBLE_USE_TALK_MIC, //通话mic(主麦)
DMS_FLEXIBLE_USE_REF_MIC, //参考mic(副麦)
} DMS_FLEXIBLE_MIC;
/* 话务耳机切换使用的mic
* DMS_FLEXIBLE_DUAL_MIC :正常双麦话务耳机
* DMS_FLEXIBLE_USE_TALK_MIC :使用主麦
* DMS_FLEXIBLE_USE_REF_MIC :使用副麦
*/
int aec_dms_flexible_selete_mic(DMS_FLEXIBLE_MIC mic);
int cvp_dms_read_ref_data(void);
int cvp_dms_flexible_read_ref_data(void);
/*
* 获取风噪检测信息
* wd_flag: 0 没有风噪,1 有风噪
* 风噪强度r: 0~BIT(16)
* wd_lev: 风噪等级,0:弱风,1:中风,2:强风
* */
int jlsp_get_wind_detect_info(int *wd_flag, int *wd_val, int *wd_lev);
#endif/*_CVP_DMS_H_*/
+56
View File
@@ -0,0 +1,56 @@
#ifndef _CVP_NS_H_
#define _CVP_NS_H_
#include "generic/typedef.h"
/******************************* ANS ***************************/
/*ans参数*/
typedef struct {
char wideband;
char mode;
float AggressFactor;
float MinSuppress;
float NoiseLevel;
} noise_suppress_param;
int noise_suppress_frame_point_query(noise_suppress_param *param);
int noise_suppress_mem_query(noise_suppress_param *param);
int noise_suppress_open(noise_suppress_param *param);
int noise_suppress_close(void);
int noise_suppress_run(short *in, short *out, int npoint);
enum {
NS_CMD_NOISE_FLOOR = 1,
NS_CMD_LOWCUTTHR,
NS_CMD_AGGRESSFACTOR,
NS_CMD_MINSUPPRESS,
};
/*
* (1)NOISEFLOOR : 设定噪声估计的最小阈值,低于阈值的信号不会被估计。
* 主要为了应对手机处理过的信号中无声段的幅度很低,
* 语音段又抬高导致的噪声估计失效问题。
* (2)LOWCUTTHR : 设定经过降噪后的信号清0阈值,低于此阈值的信号会被清0。
* 主要为了应对硬件FFT精度不够,反变换太小的值时会出现噪声。
*/
int noise_suppress_config(u32 cmd, int arg, void *priv);
/******************************* DNS ***************************/
/*dns参数*/
typedef struct {
float DNS_OverDrive; //降噪强度 range[0:6.0]
float DNS_GainFloor; //最小压制 range[0:1.00]
float DNS_NoiseLevel;
float DNS_highGain; //EQ强度 range[1.0:3.5]
float DNS_rbRate; //混响强度 range[0:0.9]
int sample_rate;
} dns_param_t;
int audio_dns_run(void *hdl, short *in, short *out, int len);
void *audio_dns_open(dns_param_t *param);
int audio_dns_close(void *hdl);
/*在线更新参数*/
int audio_dns_updata_param(void *hdl, float DNS_GainFloor, float DNS_OverDrive);
#endif/*_CVP_NS_H_*/
+213
View File
@@ -0,0 +1,213 @@
#ifndef _CVP_SMS_H_
#define _CVP_SMS_H_
#include "generic/typedef.h"
#include "cvp_common.h"
/*降噪版本定义*/
#define ANS_V100 0xA1
#define ANS_V200 0xA2
//aec_cfg:
typedef struct __AEC_CONFIG {
u8 mic_again; //DAC增益,default:3(0~14)
u8 dac_again; //MIC增益,default:22(0~31)
u8 aec_mode; //AEC模式,default:advance(diable(0), reduce(1), advance(2))
u8 ul_eq_en; //上行EQ使能,default:enable(disable(0), enable(1))
/*AGC*/
float ndt_fade_in; //单端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float ndt_fade_out; //单端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float dt_fade_in; //双端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float dt_fade_out; //双端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float ndt_max_gain; //单端讲话放大上限,default: 12.f(0 ~ 24 dB)
float ndt_min_gain; //单端讲话放大下限,default: 0.f(-20 ~ 24 dB)
float ndt_speech_thr; //单端讲话放大阈值,default: -50.f(-70 ~ -40 dB)
float dt_max_gain; //双端讲话放大上限,default: 12.f(0 ~ 24 dB)
float dt_min_gain; //双端讲话放大下限,default: 0.f(-20 ~ 24 dB)
float dt_speech_thr; //双端讲话放大阈值,default: -40.f(-70 ~ -40 dB)
float echo_present_thr; //单端双端讲话阈值,default:-70.f(-70 ~ -40 dB)
/*AEC*/
float aec_dt_aggress; //原音回音追踪等级, default: 1.0f(1 ~ 5)
float aec_refengthr; //进入回音消除参考值, default: -70.0f(-90 ~ -60 dB)
/*ES*/
float es_aggress_factor;//回音前级动态压制,越小越强,default: -3.0f(-1 ~ -5)
float es_min_suppress; //回音后级静态压制,越大越强,default: 4.f(0 ~ 10)
/*ANS*/
float ans_aggress; //噪声前级动态压制,越大越强default: 1.25f(1 ~ 2)
float ans_suppress; //噪声后级静态压制,越小越强default: 0.04f(0 ~ 1)
/*回采*/
u16 adc_ref_en; //adc回采参考数据使能
float init_noise_lvl; //初始噪声水平,default:-75dB,range[-100:-30]
} AEC_CONFIG;
struct aec_s_attr {
u8 agc_en: 1; //AGC使能配置
u8 ul_eq_en: 1; //上行EQ使能配置
u8 wideband: 1; //宽带/窄带配置
u8 toggle: 1; //bypass配置
u8 wn_en: 1; //舒适噪声使能配置
u8 dly_est : 1; //延时估计使能
u8 reserved: 2; //保留位
u8 output_way; //输出方式配置,0:dac 1:fm_tx
u8 ANS_mode; //降噪等级配置
u8 fm_tx_start; //fm发射同步标志
u8 far_noise_gate; //参考数据噪声门限
u8 dst_delay; //延时估计目标延时
u8 EnableBit; //使能模块
u8 packet_dump; //数据丢掉配置
u8 SimplexTail; //单工模式连续清0帧数
u8 aec_tail_length; //AEC复杂等级:2~10,default5
u16 hw_delay_offset; //硬件延时补偿
u16 wn_gain; //舒适噪声增益
int SimplexThr; //单工模式单工阈值
/*AGC Parameters*/
int AGC_echo_look_ahead; //in ms
int AGC_echo_hold; //in ms
float AGC_NDT_fade_in_step; //in dB
float AGC_NDT_fade_out_step; //in dB
float AGC_NDT_max_gain; //in dB
float AGC_NDT_min_gain; //in dB
float AGC_NDT_speech_thr; //in dB
float AGC_DT_fade_in_step; //in dB
float AGC_DT_fade_out_step; //in dB
float AGC_DT_max_gain; //in dB
float AGC_DT_min_gain; //in dB
float AGC_DT_speech_thr; //in dB
float AGC_echo_present_thr; //In dB
/*AEC Parameters*/
float AEC_RefEngThr;
float AEC_DT_AggressiveFactor;
/*NLP Parameters*/
float ES_AggressFactor;
float ES_MinSuppress;
float ES_Unconverge_OverDrive;
float ES_OverSuppressThr;
float ES_OverSuppress;
/*ANS Parameters*/
float ANS_AggressFactor;
float ANS_MinSuppress;
float ANS_NoiseLevel;
/*Callback Functions*/
int (*cvp_advanced_options)(void *aec,
void *nlp,
void *ns,
void *tde,
void *agc);
int (*aec_probe)(short *mic0, short *mic2, short *mic3, short *ref, u16 len);
int (*aec_post)(s16 *dat, u16 len); //算法后处理回调函数
int (*aec_update)(u8 aec_mode); //动态参数调节回调函数
int (*output_handle)(s16 *dat, u16 len);//输出回调函数
/*Extended-Parameters*/
u32 ref_sr;
u16 ref_channel; /*参考数据声道数*/
u16 adc_ref_en; /*adc回采参考数据使能*/
u8 mic_bit_width; /*麦克风数据位宽*/
u8 ref_bit_width; /*参考数据位宽*/
/*DNS Parameters*/
float DNS_GainFloor; //最小压制 range[0:1.00]
float DNS_OverDrive; //降噪强度 range[0:6.0]
float DNS_highGain; //EQ强度 range[1.0:3.5]
float DNS_rbRate; //混响强度 range[0:0.9]
};
/*
*********************************************************************
* AEC Init
* Description: AEC模块初始化
* Arguments : attr AEC模块参数
* Return : 0 成功 其他 失败
* Note(s) : None.
*********************************************************************
*/
s32 aec_init(struct aec_s_attr *attr);
/*
*********************************************************************
* AEC Exit
* Description: AEC退出
* Arguments : None.
* Return : 0 成功 其他 失败
* Note(s) : None.
*********************************************************************
*/
s32 aec_exit(void);
/*
*********************************************************************
* AEC Input
* Description: AEC源数据输入
* Arguments : dat 参考数据
* len 参考数据长度
* Return : 0 成功 其他 失败
* Note(s) : None.
*********************************************************************
*/
s32 aec_fill_in_data(void *dat, u16 len);
/*
*********************************************************************
* AEC Reference
* Description: AEC参考数据输入
* Arguments : dat 参考数据
* len 参考数据长度
* Return : 0 成功 其他 失败
* Note(s) : None.
*********************************************************************
*/
s32 aec_fill_ref_data(void *data0, void *data1, u16 len);
/*
*********************************************************************
* AEC Toggle
* Description: AEC bypass设置
* Arguments : toggle bypass开关
* Return : None.
* Note(s) : 该接口用于切换算法开关,1为正常流程,0为bypass,数据
* 不经算法处理
*********************************************************************
*/
void aec_toggle(u8 toggle);
/*
*********************************************************************
* AEC CFG Updata
* Description: AEC模块配置动态更新
* Arguments : cfg AEC模块参数
* Return : 0 成功 其他 失败
* Note(s) : 该接口用于使用过程,动态修改模块参数
*********************************************************************
*/
int aec_cfg_update(AEC_CONFIG *cfg);
/*
*********************************************************************
* AEC Reboot
* Description: AEC模块重新启动
* Arguments : enablebit 重新启动使能的模块
* Return : 0 成功 其他 失败
* Note(s) : 该接口用于重新启动AEC模块
*********************************************************************
*/
int aec_reboot(u8 enablebit);
/*是否在重启*/
u8 get_aec_rebooting();
int sms_tde_init(struct aec_s_attr *attr);
int sms_tde_exit();
int sms_tde_fill_in_data(void *dat, u16 len);
int sms_tde_fill_ref_data(void *data0, void *data1, u16 len);
int sms_tde_reboot(u8 enablebit);
void sms_tde_toggle(u8 toggle);
/*获取是否在重启中*/
u8 get_sms_tde_rebooting();
int cvp_sms_read_ref_data(void);
int cvp_sms_tde_read_ref_data(void);
/*可写长度*/
int get_cvp_sms_output_way_writable_len();
int get_cvp_sms_tde_output_way_writable_len();
#endif/*_CVP_SMS_H_*/
+239
View File
@@ -0,0 +1,239 @@
#ifndef _COMMPROC_DMS_H_
#define _COMMPROC_DMS_H_
#include "generic/typedef.h"
#include "cvp_common.h"
//tms_cfg:
typedef struct {
u8 ver; //Ver:01
u8 mic_again; //MIC增益,default:3(0~14)
u8 fb_mic_again; //FB MIC增益,default:3(0~14)
u8 dac_again; //DAC增益,default:22(0~31)
u8 enable_module; //使能模块
u8 ul_eq_en; //上行EQ使能,default:enable(disable(0), enable(1))
u8 agc_type; //AGC类型选择,0AGC_EXTERNAL1AGC_INTERNAL
union {
/*AGC*/
struct {
float ndt_fade_in; //单端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float ndt_fade_out; //单端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float dt_fade_in; //双端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float dt_fade_out; //双端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float ndt_max_gain; //单端讲话放大上限,default: 12.f(-90 ~ 40 dB)
float ndt_min_gain; //单端讲话放大下限,default: 0.f(-90 ~ 40 dB)
float ndt_speech_thr; //单端讲话放大阈值,default: -50.f(-70 ~ -40 dB)
float dt_max_gain; //双端讲话放大上限,default: 12.f(-90 ~ 40 dB)
float dt_min_gain; //双端讲话放大下限,default: 0.f(-90 ~ 40 dB)
float dt_speech_thr; //双端讲话放大阈值,default: -40.f(-70 ~ -30 dB)
float echo_present_thr; //单端双端讲话阈值,default:-70.f(-70 ~ -30 dB)
} agc_ext;
/*JLSP AGC*/
struct {
int min_mag_db_level;//语音能量放大下限阈值,范围:-90 ~ -35 db,默认-50,单位:dB
int max_mag_db_level;//语音能量放大上限阈值,范围:-90 ~ 0 dB,默认-3 ,单位dB
int addition_mag_db_level;//语音补偿能量值,范围:0 ~ 20 dB,默认0 ,单位dB
int clip_mag_db_level;//语音最大截断能量值,范围:-10 ~ 0 dB,默认-3,单位dB
int floor_mag_db_level;//语音最小截断能量值,范围:-90 ~ -35 dB,默认-70,单位dB
} agc_int;
} agc;
/*aec*/
int aec_process_maxfrequency; //default:8000,range[3000:8000]
int aec_process_minfrequency; //default:0,range[0:1000]
int af_length; //default:128 range[128:256]
/*nlp*/
int nlp_process_maxfrequency; //default:8000,range[3000:8000]
int nlp_process_minfrequency; //default:0,range[0:1000]
float overdrive; //default:1,range[0:30]
/*dns*/
float aggressfactor; //default:1.25,range[1:2]
float minsuppress; //default:0.04,range[0.01:0.1]
float init_noise_lvl; //default:-75dB,range[-100:-30]
/*enc*/
int enc_process_maxfreq; //default:8000,range[3000:8000]
int enc_process_minfreq; //default:0,range[0:1000]
int sir_maxfreq; //default:3000,range[1000:8000]
float mic_distance; //default:0.015,range[0.035:0.015]
float target_signal_degradation;//default:1,range[0:1]
float enc_aggressfactor; //default:4.f,range[0:4]
float enc_minsuppress; //default:0.09f,range[0:0.1]
float Tri_SnrThreshold0; //sir设定阈值
float Tri_SnrThreshold1; //sir设定阈值
float Tri_CompenDb; //mic增益补偿, dB
/*wn*/
float wn_msc_th; //双麦非相关性阈值,范围:0 ~ 1,默认值:0.6
float ms_th; //麦增益能量阈值,范围:0 ~ 255 dB,默认值:80,单位:dB
float wn_gain_offset;//风噪能量增益偏移阈值,默认值:0,单位dB
/*回采*/
u16 adc_ref_en; /*adc回采参考数据使能*/
/*debug*/
u8 output_sel;/*dms output选择: 0:Default, 1:Master Raw, 2:Slave Raw, 3:Fbmic Raw*/
/*MFDT Parameters*/
float detect_time; // // 检测时间s,影响状态切换的速度
float detect_eng_diff_thr; // 0~-90 dB 两个mic能量差异持续大于此阈值超过检测时间则会检测为故障
float detect_eng_lowerbound; // 0~-90 dB 当处于故障状态时,正常的mic能量大于此阈值才会检测能量差异,避免安静环境下误判切回正常状态
int MalfuncDet_MaxFrequency;// 检测信号的最大频率成分
int MalfuncDet_MinFrequency;// 检测信号的最小频率成分
int OnlyDetect;// 0 -> 故障切换到单mic模式, 1-> 只检测不切换
} _GNU_PACKED_ AEC_TMS_CONFIG;
struct tms_attr {
u8 ul_eq_en: 1;
u8 wideband: 1;
u8 wn_en: 1;
u8 dly_est : 1;
u8 aptfilt_only: 1;
u8 reserved: 3;
u8 dst_delay;/*延时估计目标延时*/
u8 EnableBit;
u8 FB_EnableBit;
u8 packet_dump;
u8 SimplexTail;
u8 output_sel;/*dms output选择*/
u16 hw_delay_offset;/*dac hardware delay offset*/
u16 wn_gain;/*white_noise gain*/
u8 agc_type; /*agc类型*/
/*AGC*/
float AGC_NDT_fade_in_step; //in dB
float AGC_NDT_fade_out_step; //in dB
float AGC_NDT_max_gain; //in dB
float AGC_NDT_min_gain; //in dB
float AGC_NDT_speech_thr; //in dB
float AGC_DT_fade_in_step; //in dB
float AGC_DT_fade_out_step; //in dB
float AGC_DT_max_gain; //in dB
float AGC_DT_min_gain; //in dB
float AGC_DT_speech_thr; //in dB
float AGC_echo_present_thr; //In dB
int AGC_echo_look_ahead; //in ms
int AGC_echo_hold; // in ms
/*jlsp agc*/
int min_mag_db_level;
int max_mag_db_level;
int addition_mag_db_level;
int clip_mag_db_level;
int floor_mag_db_level;
/*AEC*/
int aec_process_maxfrequency; //default:8000,range[3000:8000]
int aec_process_minfrequency; //default:0,range[0:1000]
int af_length; //default:128 range[128:256]
/*NLP*/
int nlp_process_maxfrequency; //default:8000,range[3000:8000]
int nlp_process_minfrequency; //default:0,range[0:1000]
float overdrive; //default:1,range[0:30]
/*ANS*/
float aggressfactor; //default:1.25,range[1:2]
float minsuppress; //default:0.04,range[0.01:0.1]
float init_noise_lvl; //default:-75db,range[-100:-30]
/*DNS Parameters*/
float DNS_highGain; //EQ强度 range[1.0:3.5]
float DNS_rbRate; //混响强度 range[0:0.9];
int enhance_flag; //是否高频增强 range[0,1]
/*ENC*/
int Tri_CutTh; //fb麦统计截止频率
float Tri_SnrThreshold0; //sir设定阈值
float Tri_SnrThreshold1; //sir设定阈值
float *Tri_TransferFunc; //fb -> main传递函数
float Tri_FbAlignedDb; //fb和主副麦之间需要补偿增益
float Tri_FbCompenDb; //fb补偿增益
int Tri_TfEqSel; //eq,传递函数的选择:0选择eq,1选择传递函数,2选择传递函数和eq
int enc_process_maxfreq; //default:8000,range[3000:8000]
int enc_process_minfreq; //default:0,range[0:1000]
int sir_maxfreq; //default:3000,range[1000:8000]
float mic_distance; //default:0.015,range[0.035:0.015]
float target_signal_degradation;//default:1,range[0:1]
float enc_aggressfactor; //default:4.f,range[0:4]
float enc_minsuppress; //default:0.09f,range[0:0.1]
float Tri_CompenDb; //mic增益补偿, dB
int Tri_Bf_Enhance; //bf是否高频增强
int Tri_LowFreqHoldEn;
float Tri_SupressFactor;
/*wn*/
float wn_msc_th; //双麦非相关性阈值,default:0.6f(0 ~ 1)
float ms_th; //麦增益能量阈值, default:80.f(0-255)dB
int wn_gain_offset; //风噪能量增益偏移阈值
/*common*/
float global_minsuppress; //default:0.0,range[0.0:0.09]
/*data handle*/
int (*cvp_advanced_options)(void *aec,
void *nlp,
void *ns,
void *enc,
void *agc,
void *wn,
void *mfdt);
int (*aec_probe)(short *mic0, short *mic1, short *mic2, short *ref, u16 len);
int (*aec_post)(s16 *dat, u16 len);
int (*aec_update)(u8 EnableBit);
int (*output_handle)(s16 *dat, u16 len);
/*Extended-Parameters*/
u32 ref_sr;
u16 ref_channel; /*参考数据声道数*/
u16 adc_ref_en; /*adc回采参考数据使能*/
u8 mic_bit_width; /*麦克风数据位宽*/
u8 ref_bit_width; /*参考数据位宽*/
/*MFDT Parameters*/
float detect_time; // // 检测时间s,影响状态切换的速度
float detect_eng_diff_thr; // 0~-90 dB 两个mic能量差异持续大于此阈值超过检测时间则会检测为故障
float detect_eng_lowerbound; // 0~-90 dB 当处于故障状态时,正常的mic能量大于此阈值才会检测能量差异,避免安静环境下误判切回正常状态
int MalfuncDet_MaxFrequency;// 检测信号的最大频率成分
int MalfuncDet_MinFrequency;// 检测信号的最小频率成分
int OnlyDetect;// 0 -> 故障切换到单mic模式, 1-> 只检测不切换
};
s32 aec_tms_init(struct tms_attr *attr);
s32 aec_tms_exit();
s32 aec_tms_fill_in_data(void *dat, u16 len);
int aec_tms_fill_in_ref_data(void *dat, u16 len);
int aec_tms_fill_in_ref_1_data(void *dat, u16 len);
int aec_tms_fill_ref_data(void *data0, void *data1, u16 len);
void aec_tms_toggle(u8 toggle);
int aec_tms_cfg_update(AEC_TMS_CONFIG *cfg);
int aec_tms_reboot(u8 enablebit);
u8 get_cvp_tms_rebooting();
int cvp_tms_read_ref_data(void);
/*获取风噪的检测结果,1:有风噪,0:无风噪*/
int cvp_tms_get_wind_detect_state(void);
/*
* 获取风噪检测信息
* wd_flag: 0 没有风噪,1 有风噪
* 风噪强度r: 0~BIT(16)
* wd_lev: 风噪等级,0:弱风,1:中风,2:强风
* */
int jlsp_tms_get_wind_detect_info(int *wd_flag, int *wd_val, int *wd_lev);
enum cvp_tms_mode {
TMS_MODE_2MIC = 0, //跑双麦降噪,不使用FB MIC数据
TMS_MODE_3MIC, //跑3MIC降噪
};
/* 设置跑2mic/3mic降噪
* TMS_MODE_2MIC 跑双麦降噪,不使用FB MIC数据
* TMS_MODE_3MIC 跑3MIC降噪
* Notes : CONST_JLSP_3MIC_MODE != JLSP_3MIC_MODE0时设置才有效*/
int jlsp_tms_mode_choose(enum cvp_tms_mode mode);
/*单/三麦切换状态
* 0: 正常三麦 ;
* 1: 副麦坏了,触发故障
* -1: 主麦坏了,触发故障
*/
int cvp_tms_get_malfunc_state(void);
/*
* 获取mic的能量值,开了MFDT_EN才能用
* mic: 0 获取主麦能量
* mic1 获取副麦能量
* return:返回能量值,[0~90.3],返回-1表示错误
*/
float cvp_tms_get_mic_energy(u8 mic);
#endif/*_COMMPROC_DMS_H_*/
+283
View File
@@ -0,0 +1,283 @@
#ifndef __JLSP_NS_H__
#define __JLSP_NS_H__
//出现单个麦掩蔽参数
typedef struct {
float detect_time;//检测时间
float detect_eng_diff_thr; /*0~-90 dB 两个mic能量差异持续大于此阈值超过检测时间则会检测为故障*/
float detect_eng_lowerbound;// 0~-90 dB start detect when mic energy lower than this
int MalfuncDet_MaxFrequency;//检测频率上限
int MalfuncDet_MinFrequency;//检测频率下限
int OnlyDetect;// 0 -> 故障切换到单mic模式, 1-> 只检测不切换
} JLSP_dms_micsel_cfg;
//beamforming参数设置
typedef struct {
int UseExWeight; //挂空
int *ENC_WeightA; //挂空
int *ENC_WeightB; //挂空
int ENC_Weight_Q; //挂空
int ENC_Process_MaxFrequency; //设定enc处理的最大频率,设定范围(3000~8000),默认8000
int ENC_Process_MinFrequency; //设定enc处理的最小频率,设定范围(0~1000),默认为0
int SIR_MaxFrequency; //设定enc信噪比处理最大频率,设定范围(1000~8000),默认3000
float Mic_Distance; //设定主副mic的距离,单位(m),范围(0.015~35),默认0.015
float Target_Signal_Degradation; //根据主副麦能量的diff值,设定范围(0~1),默认1.0
float AggressFactor; //设置enc压制强度,设定范围(0~4),默认4
float minSuppress; //设定enc抑制的最小值,设定范围(0~0.1),默认0.09
float compen_db; //补偿增益控制,单位(db),具体调节配合麦的增益协同调节,一般设定范围为(0~20)
int bf_enhance; //该值默认设置为0,设为1时,高频成分会丰富些,但是低信噪比下高频噪声也会偏大
int lowFreqHoldEn;
float bfSupressFactor;
} JLSP_dms_bf_cfg;
/*3麦降噪参数*/
typedef struct {
int Tri_CutTh; //fb麦统计截止频率
float Tri_SnrThreshold0; //sir设定阈值
float Tri_SnrThreshold1; //sir设定阈值
float *Tri_TransferFunc; //fb -> main传递函数
float Tri_FbAlignedDb; //fb和主副麦之间需要补偿增益
float Tri_FbCompenDb; //fb补偿增益
int Tri_TfEqSel; //eq,传递函数的选择:0选择eq,1选择传递函数,2选择传递函数和eq
//int Tri_TransferMode; //传递函数模式选择,0:基于幅度的传递函数,1:基于幅度和相位的传递函数
int Tri_Process_MaxFrequency;
int Tri_Process_MinFrequency;
int Tri_SIR_MaxFrequency;
float Tri_Mic_Distance;
float Tri_Target_Signal_Degradation;
float Tri_AggressFactor;
float Tri_MinSuppress;
float Tri_CompenDb; //mic增益补偿
int Tri_Bf_Enhance;
int Tri_LowFreqHoldEn;
float Tri_SupressFactor;
} JLSP_tri_cfg;
//回声消除设置参数
typedef struct {
int AEC_Process_MaxFrequency; //设定回声消除处理的最大频率,设定范围(3000~8000),默认值为8000
int AEC_Process_MinFrequency; //设定回声消除处理的最小频率,设定范围(0~1000),默认值为0
int AF_Length; //挂空
float muf; //设定aec滤波器的学习速率,默认0.02,设定范围(0.0001~0.5
} JLSP_dms_aec_cfg;
//非线性回声压制设置参数
typedef struct {
int NLP_Process_MaxFrequency; //设定回声抑制的最大频率,设定范围(3000~8000),默认值为8000
int NLP_Process_MinFrequency; //设定回声抑制的最小频率,设定范围(0~1000),默认值为0
float OverDrive; //定设压制强度,越大压制越强,设定范围(0~5)默认为1.0
} JLSP_dms_nlp_cfg;
//dns参数设置
typedef struct {
float AggressFactor; //降噪强度,设置范围(0.3~6.0),默认值:1.0
float minSuppress; //增益最小值控制,越小降噪越强,设置范围(0.0~1.0),默认为0.1
float init_noise_lvl; //初始噪声水平
float high_gain; //单麦高频增强,默认设置为1.0,设置范围为(1.0~3.0)
float rb_rate; //单麦混响增强,默认设置为0.1,设置范围为(0~0.9)
int enhance_flag; //是否开启双麦高频增强,默认为1
} JLSP_dms_dns_cfg;
typedef struct {
int min_mag_db_level; //语音能量放大下限阈值(单位db,默认-50,范围(-90db~-35db))
int max_mag_db_level; //语音能量放大上限阈值(单位db,默认-3,范围(-90db~0db))
int addition_mag_db_level; //语音补偿能量值(单位db,默认0,范围(0db~20db))
int clip_mag_db_level; //语音最大截断能量值(单位db,默认-3,范围(-10db~db))
int floor_mag_db_level; //语音最小截断能量值(单位db,默认-70,范围(-90db~-35db
} JLSP_agc_cfg;
//风噪检测参数设置
typedef struct {
float wn_msc_th; //双麦非相关性阈值 (0-1)
float ms_th; //麦增益能量阈值(0-255)
int wn_inty1;
int wn_inty2;
float wn_gain1;
float wn_gain2;
int t1_bot; //低风噪等级能量下限阈值
int t1_top; //低风噪等级能量上限阈值
int t2_bot; //强风噪等级能量下限阈值
int t2_top; //强风噪等级能量上限阈值
int offset; //风噪能量增益偏移阈值
int t1_bot_cnt_limit; //风强变到弱风等级连续帧数计数,位宽16bit
int t1_top_cnt_limit; //风强由弱风变到中风等级连续帧数计数,位宽16bit
int t2_bot_cnt_limit; //风强由强风变到中风连续帧数计数,位宽16bit
int t2_top_cnt_limit; //风强变到强风连续帧数计数,位宽16bit
} JLSP_dms_wind_cfg;
/*
gain_floor: 增益的最小值控制,范围0~1,建议值(0~0.2)之间
over_drive: 控制降噪强度:
0 < over_drive < 1,越小降噪强度越轻,太小噪声会很大;
over_drive = 1,正常降噪
over_drive > 1,降噪强度加强,越大降噪强度越强,太大会吃音
建议调节范围0.3~3之间来控制降噪强度的强弱
high_gain: 控制声音的宏亮度,范围(1.0f~3.5f),越大声音越宏亮,太大可能会使噪声增加, 为1.0f表示不做增强, 建议设置2.0f左右
rb_rate: 混响强度,设置范围(0.0f~0.9f),越大混响越强, 为0.0f表示不增强, 建议默认设置0.5f
*/
void *JLSP_ns_init(char *private_buffer, char *shared_buffer, float gain_floor, float over_drive, float high_gain, float rb_rate, int samplerate, const int is_dual);
int JLSP_ns_get_heap_size(int *private_size, int *shared_size, int samplerate, int is_dual);
int JLSP_ns_reset(void *m);//单双麦共用
void JLSP_ns_update_shared_buffer(void *m, char *shared_buffer);//单双麦共用
int JLSP_ns_process(void *m, void *input, void *output, int *outsize);
int JLSP_ns_free(void *m);//单双麦共用
void JLSP_ns_set_noiselevel(void *m, float noise_level_init);//单双麦共用
void JLSP_ns_deep_params(void *m, float gain_floor, float over_drive);//在线更新参数
/*功能:初始化snr相关参数
* stop_freq: 高通滤波器的截止频率
* snr_th: 人声阈值设定,即大于该值才会进行snr压制处理, 采用db进行设置, 默认-25db
* commpress_params: 压制系数
* 0db一下分为了5个区间进行压缩,压缩系数范围(0~3),越大压制越强,建议范围(0~1.0f)
* snr < -10, 压制系数compress_params[4]
* snr < -8, 压制系数compress_params[3]
* snr < -5, 压制系数compress_params[2]
* snr < -3, 压制系数compress_params[1]
* snr < 0, 压制系数compress_params[0]
*/
void JLSP_init_snr(void *m, int stop_freq, int snr_th, float *compress_params);
/*功能: 获取当前帧snr
* 返回:当前帧snr值
*/
float JLSP_get_snr(void *m);
/*
* 双麦降噪接口
*/
void JLSP_wd_single(unsigned char wd_act);
/*
*wd_flag: 0: no wind 1: wind
*wd_val: wind strong bit(16)
*wd_lev: wind level 0:弱风,1:中风, 2:强风
*/
int JLSP_get_wd_info(void *handle, int *wd_flag, int *wd_val, int *wd_lev);
/*设置使用的模块*/
void JLSP_enable_module(int Enablebit);//仅双麦使用
/*初始化*/
void *JLSP_DualMicSystem_Init(char *private_buf,
char *share_buf,
void *aec_cfg,
void *nlp_cfg,
void *bf_cfg,
void *dns_cfg,
void *wn_cfg,
void *micsel_cfg,
int samplerate,
int EnableBit);
/*数据处理,返回风噪大小*/
int JLSP_DualMicSystem_Process(void *handle,
short *near,
short *near_ref,
short *far,
short *out,
int points);
//检测各个麦是否被堵住或者破坏相关信息
/*获取单双麦切换状态
* 0: 正常双麦 ;
* 1: 副麦坏了,触发故障
* -1: 主麦坏了,触发故障
*/
int JLSP_DualMicSystem_GetMicState(void *handle);
/*
* 获取mic的能量值,开了MFDT_EN才能用
* mic: 0 获取主麦能量
* mic1 获取副麦能量
* return:返回能量值,[0~90.3]
*/
float JLSP_DualMicSystem_GetMicEnergy(void *handle, unsigned char mic);
/*设置初始使用单双麦切换状态
* 0: 正常双麦 ;
* 1: 副麦坏了,触发故障
* -1: 主麦坏了,触发故障
*/
void JLSP_DualMicSystem_SetMicState(void *handle, int state);
//int JLSP_DualMicSystem_GetWdInfo(void* handle, int* wd_flag, int* wd_val, int* wd_lev);
//int JLSP_DualMicSystem_Get_Size(int* private_size, int* share_size, int samplerate, const int is_dual);
//int JLSP_DualMicSystem_Reset(void* m);
//void JLSP_DualMicSystem_Update_Shared_Buffer(void* m, char* shared_buffer);
//int JLSP_DualMicSystem_Free(void* m);
//void JLSP_DualMicSystem_Set_Noiselevel(void* m, float noise_level_init);
/*
* 三麦降噪接口
*/
/*设置使用的模块*/
void JLSP_TriMicSystem_EnableModule(int Enablebit, int Enablebit_Ex);
/*获取风噪信息*/
int JLSP_TriMicSystem_GetWdInfo(void *handle, int *wd_flag, int *wd_val, int *wd_lev);
/*获取buf大小*/
int JLSP_TriMicSystem_Get_Size(int *private_size, int *share_size, int samplerate, const int is_dual);
/*初始化*/
void *JLSP_TriMicSystem_Init(char *private_buf,
char *share_buf,
void *aec_cfg,
void *nlp_cfg,
void *tri_cfg,
void *dns_cfg,
void *wn_cfg,
void *agc_cfg,
void *micsel_cfg,
int samplerate,
int EnableBit);
/*数据处理,返回风噪大小*/
int JLSP_TriMicSystem_Process(void *handle,
short *near,
short *near_ref,
short *fb,
short *far,
short *out,
int InDataLen);
/*tri_en: 1 正常3MIC降噪
* 0 变成2MIC降噪,不使用 FB MIC数据*/
void JLSP_TriMicSystem_ModeChoose(void *handle, unsigned char tri_en);
//检测各个麦是否被堵住或者破坏相关信息
/*获取单/三麦切换状态
* 0: 正常三麦 ;
* 1: 副麦坏了,触发故障
* -1: 主麦坏了,触发故障
*/
int JLSP_TriMicSystem_GetMicState(void *handle);
/*
* 获取mic的能量值,开了MFDT_EN才能用
* mic: 0 获取主麦能量
* mic1 获取副麦能量
* return:返回能量值,[0~90.3]
*/
float JLSP_TriMicSystem_GetMicEnergy(void *handle, unsigned char mic);
/*设置初始使用单/三麦切换状态
* 0: 正常三麦 ;
* 1: 副麦坏了,触发故障
* -1: 主麦坏了,触发故障
*/
void JLSP_TriMicSystem_SetMicState(void *handle, char state);
#endif
@@ -0,0 +1,24 @@
#ifndef _AUDIOEFFECT_DATATYPE_
#define _AUDIOEFFECT_DATATYPE_
enum PCMDataType {
DATA_INT_16BIT = 0,
DATA_INT_32BIT,
DATA_FLOAT_32BIT
};
typedef struct _af_DataType_ {
unsigned char IndataBit;//输入数据bit类型
unsigned char OutdataBit;//输出数据bit类型
char IndataInc;//输入数据相同通道的下一个点间隔
char OutdataInc;//输出数据相同通道的下一个点间隔
char Qval;//位宽
} af_DataType;
enum {
af_DATABIT_NOTSUPPORT = 0x404 //不支持的PCM数据类型返回错误
};
#endif
@@ -0,0 +1,33 @@
#ifndef DYNAMICEQDETECTION_API_H
#define DYNAMICEQDETECTION_API_H
#include "effects/AudioEffect_DataType.h"
#ifdef WIN32
#define AT_DYNAMICEQ_DETECT(x)
#define AT_DYNAMICEQ_DETECT_CODE
#define AT_DYNAMICEQ_DETECT_CONST
#define AT_DYNAMICEQ_DETECT_SPARSE_CODE
#define AT_DYNAMICEQ_DETECT_SPARSE_CONST
#else
#define AT_DYNAMICEQ_DETECT(x) __attribute__((section(#x)))
#define AT_DYNAMICEQ_DETECT_CODE AT_DYNAMICEQ_DETECT(.dynamiceq_detect.text.cache.L2.code)
#define AT_DYNAMICEQ_DETECT_CONST AT_DYNAMICEQ_DETECT(.dynamiceq_detect.text.cache.L2.const)
#define AT_DYNAMICEQ_DETECT_SPARSE_CODE AT_DYNAMICEQ_DETECT(.dynamiceq_detect.text)
#define AT_DYNAMICEQ_DETECT_SPARSE_CONST AT_DYNAMICEQ_DETECT(.dynamiceq_detect.text.const)
#endif
typedef struct _DynamicEQDetectionParam {
int fc; //中心频率 与动态eq参数中的fc一致
} DynamicEQDetectionParam; //检测参数
int getDynamicEQDetectionBuf(int nSection, int channel);
int *getDynamicEQDetectionCoeff(void *WorkBuf);
void DynamicEQDetectionInit(void *WorkBuf, DynamicEQDetectionParam *pram, int nSection, int channel, int SampleRate);
void DynamicEQDetectionUpdate(void *WorkBuf, DynamicEQDetectionParam *pram);
int DynamicEQDetectionRun(void *WorkBuf, short *indata, int *outdata, int per_channel_npoint);
#endif // !DYNAMICEQDETECTION_API_H
@@ -0,0 +1,92 @@
#ifndef DYNAMICEQ_API_H
#define DYNAMICEQ_API_H
#include "AudioEffect_DataType.h"
#include "asm/hw_eq.h"
#ifdef WIN32
#define AT_DYNAMICEQ(x)
#define AT_DYNAMICEQ_CODE
#define AT_DYNAMICEQ_CONST
#define AT_DYNAMICEQ_SPARSE_CODE
#define AT_DYNAMICEQ_SPARSE_CONST
#else
#define AT_DYNAMICEQ(x) __attribute__((section(#x)))
#define AT_DYNAMICEQ_CODE AT_DYNAMICEQ(.dynamiceq.text.cache.L2.code)
#define AT_DYNAMICEQ_CONST AT_DYNAMICEQ(.dynamiceq.text.cache.L2.const)
#define AT_DYNAMICEQ_SPARSE_CODE AT_DYNAMICEQ(.dynamiceq.text)
#define AT_DYNAMICEQ_SPARSE_CONST AT_DYNAMICEQ(.dynamiceq.text.const)
#endif
typedef enum {
DYNAMIC_EQ_IIR_TYPE_BAND_PASS = EQ_IIR_TYPE_BAND_PASS,
//DYNAMIC_EQ_IIR_TYPE_HIGH_SHELF,
// DYNAMIC_EQ_IIR_TYPE_LOW_SHELF
} DYNAMIC_EQ_IIR_TYPE;
/* enum { */
// PEAK = 0,
// RMS
// };
/* enum { */
// PERPOINT = 0,
// TWOPOINT
/* }; */
#define EFFECT_MODE
typedef struct _DynamicEQEffectParam {
#ifndef EFFECT_MODE
int fc; //中心频率
float Q; // Q值
float gain; //衰减最大增益或者增强最大增益,当gain < 0时衰减模式,当gain > 0时增强模式
int type; //类型 只支持EQ_IIR_TYPE_BAND_PASS
int attackTime; //启动时间
int releaseTime; //释放时间
int rmsTime; // rmsTime algorithm为RMS时有效
float threshold; // 启动阈值 衰减模式为大于阈值启动 增强模式小于阈值启动
float ratio; // 比率 衰减模式ratio > 1[1,30] 增强模式 ratio < 1 [0.1,1]
float noisegate_threshold; //噪声门限阈值,低于噪声门限阈值不启动
float fixGain; // 在中心频率fc处的固定增益
unsigned char algorithm; //算法 PEAK或者RMS
#else
int fc; //中心频率
float Q; // Q值
float gain; //衰减最大增益或者增强最大增益,当gain < 0时衰减模式,当gain > 0时增强模式
int attackTime: 16; //启动时间
int releaseTime: 16; //释放时间
float threshold; // 启动阈值 衰减模式为大于阈值启动 增强模式小于阈值启动
float ratio; // 比率 衰减模式ratio > 1[1,30] 增强模式 ratio < 1 [0.1,1]
float noisegate_threshold; //噪声门限阈值,低于噪声门限阈值不启动
float fixGain; // 在中心频率fc处的固定增益
int type: 8; //类型 只支持EQ_IIR_TYPE_BAND_PASS
int rmsTime: 8; // rmsTime algorithm为RMS时有效
int algorithm: 8; //算法 PEAK或者RMS
int effect_mode: 8; //0:增强 1:衰减
#endif
} DynamicEQEffectParam;
typedef struct _DynamicEQParam {
int nSection; //段数
int channel; //通道
int SampleRate; //采样率
int detect_mode; //检测模式 PERPOINT或者TWOPOINT 对应工具的Precision+与Precision
int DetectdataInc; //检测数据相同通道下一点的步进 例如左右左右 为2
int DetectdataBit;
af_DataType pcm_info;
} DynamicEQParam;
int getDynamicEQBuf(DynamicEQEffectParam *effectParam, DynamicEQParam *param); //bufsize 与nSection rmsTime algorithm channel SampleRate 有关
int DynamicEQInit(void *WorkBuf, DynamicEQEffectParam *effectParam, DynamicEQParam *param);
int DynamicEQUpdate(void *WorkBuf, DynamicEQEffectParam *effectParam, DynamicEQParam *param);
int DynamicEQRun(void *WorkBuf, int *detectdata, int *indata, int *outdata, int per_channel_npoint);
#endif // !DYNAMICEQ_API_H
@@ -0,0 +1,40 @@
#ifndef VIRTUALBASS_API_H
#define VIRTUALBASS_API_H
#include "AudioEffect_DataType.h"
#ifdef WIN32
#define AT_VBSS(x)
#define AT_VBSS_CODE
#define AT_VBSS_CONST
#define AT_VBSS_SPARSE_CODE
#define AT_VBSS_SPARSE_CONST
#else
#define AT_VBSS(x) __attribute__((section(#x)))
#define AT_VBSS_CODE AT_VBSS(.vbss.text.cache.L2.code)
#define AT_VBSS_CONST AT_VBSS(.vbss.text.cache.L2.const)
#define AT_VBSS_SPARSE_CODE AT_VBSS(.vbss.text)
#define AT_VBSS_SPARSE_CONST AT_VBSS(.vbss.text.const)
#endif
typedef struct _VirtualBassParam {
int ratio;
int boost;
int fc;
int ReserveLowFreqEnable;
int Reserved[7];
int channel;
int SampleRate;
af_DataType pcm_info;
} VirtualBassParam;
int getVirtualBassBuf();
int VirtualBassInit(void *WorkBuf, VirtualBassParam *param);
void VirtualBassUpdate(void *WorkBuf, VirtualBassParam *param);
int VirtualBassRun(void *WorkBuf, int *tmpbuf, void *in, void *out, int per_channel_npoint);
#endif // !VIRTUALBASS_API_H
@@ -0,0 +1,62 @@
#ifndef _AUDIO_AUTOTUNE_API_H_
#define _AUDIO_AUTOTUNE_API_H_
#include "effects/voiceChanger_api.h"
// #include "media/audio_stream.h"
struct autotune_update_parm {
u32 mode; //调式
u32 speedv; //2到100
};
typedef struct _AUTOTUNE_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
struct autotune_update_parm parm;
} autotune_param_tool_set;
struct autotune_open_parm {
AUTOTUNE_PARM param;
u32 sample_rate;
};
typedef struct _autotune_hdl {
AUTOTUNE_FUNC_API *ops;
void *workbuf;
struct autotune_open_parm parm;
u8 update;
u8 status;
} autotune_hdl;
extern AUTOTUNE_FUNC_API *get_autotune_func_api();
/*
* 电子音打开
*/
autotune_hdl *audio_autotune_open(struct autotune_open_parm *param);
/*
* 电子音关闭
*/
void audio_autotune_close(autotune_hdl *hdl);
/*
* 电子音参数更新
*/
void audio_autotune_update_parm(autotune_hdl *hdl, struct autotune_update_parm *parm);
/*
* 电子音数据处理
*/
int audio_autotune_run(autotune_hdl *hdl, s16 *indata, s16 *outdata, int len, u8 ch_num);
/*
* 电子音暂停处理
*/
void audio_autotune_bypass(autotune_hdl *hdl, u8 bypass);
#endif
#ifndef RUN_NORMAL
#define RUN_NORMAL 0
#endif
#ifndef RUN_BYPASS
#define RUN_BYPASS 1
#endif
@@ -0,0 +1,72 @@
#ifndef _BASS_TREBLE_EQ_CONFIG_H_
#define _BASS_TREBLE_EQ_CONFIG_H_
#include "spinlock.h"
#include "math.h"
#include "effects/audio_eq.h"
struct bass_treble_gain_range {
int iir_type;
int center_frequency;
float Q;
float min_gain;
float max_gain;
float cur_gain;//在线调试时用于与工具交互显示,并控制当前增益。但存储效果文件内的值不用做当前gain
};
typedef struct bass_treble_tool_parm { //工具界面调音结构
u32 type;//默认0xaa:标识工具参数,
u32 fade_time;
float fade_step;
float global_gain;
struct bass_treble_gain_range range[3];
} bass_treble_param_tool_set;
struct seg_gain {
int index;
float gain;
};
struct bass_treble_parm { //旋钮调音结构
u32 type;//默认0xaa:标识工具参数
u32 fade_time;
float fade_step;
float global_gain;
struct seg_gain gain;
} ;
struct bass_treble_default_parm {
char name[16];
u32 type;
float global_gain;
float gain[3];//[0]:低音增益 [1]:中音增益 [2]:高音增益
char cfg_index;//如果使用配置项的序号,指定默认配置项
char mode_index;//节点与多模式关联时,该变量用于获取相应模式下的节点参数.模式序号(如,蓝牙模式下,无多子模式,mode_index 是0
};
#define BASS_TREBLE_PARM_INIT (1UL<<0)
#define BASS_TREBLE_PARM_GET (1UL<<2)
#define BASS_TREBLE_PARM_SET (1UL<<4)
#define BASS_TREBLE_PARM_SET_GLOBAL_GAIN (1UL<<6)
#define BASS_TREBLE_PARM_TOO_SET 0xaa
enum bass_treble_eff {
BASS_TREBLE_LOW = 0,
BASS_TREBLE_MID = 1,
BASS_TREBLE_HIGH = 2,
};
/*******************************************************************/
// 兼容旧接口
#define AUDIO_EQ_HIGH 2
#define AUDIO_EQ_BASS 3
struct high_bass {
int freq;
int gain; //增益范围 -48 ~ 48
};
void mix_out_high_bass(u32 cmd, struct high_bass *hb);
/*******************************************************************/
#endif
@@ -0,0 +1,54 @@
#ifndef _AUDIO_chorus_API_H_
#define _AUDIO_chorus_API_H_
#include "system/includes.h"
#include "media/audio_stream.h"
#include "effects/chorus_api.h"
typedef struct _ChorusUdateParam {//与CHORUS_PARM关联
int wetgain; //0-100
int drygain;
int mod_depth;
int mod_rate;
int feedback;
int delay_length;
} ChorusUdateParam;
typedef struct _Chorus_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
ChorusUdateParam parm;
} chorus_param_tool_set;
struct chorus_param {
CHORUS_PARM param;
u32 samplerate;
u32 ch_num;
};
struct audio_chorus {
void *workbuf; //chorus 运行句柄及buf
CHORUS_FUNC_API *ops;
struct chorus_param parm;
u8 status; //内部运行状态机
u8 update; //设置参数更新标志
};
int audio_chorus_run(struct audio_chorus *hdl, void *datain, void *dataout, u32 len);
struct audio_chorus *audio_chorus_open(struct chorus_param *parm);
int audio_chorus_close(struct audio_chorus *hdl);
void audio_chorus_set_bit_wide(struct audio_chorus *hdl, af_DataType dataTypeobj);
int audio_chorus_update_parm(struct audio_chorus *hdl, ChorusUdateParam *parm);
void audio_chorus_bypass(struct audio_chorus *hdl, u8 bypass);
#ifndef RUN_NORMAL
#define RUN_NORMAL 0
#endif
#ifndef RUN_BYPASS
#define RUN_BYPASS 1
#endif
#endif
@@ -0,0 +1,65 @@
#ifndef _DRC_API_H_
#define _DRC_API_H_
#include "typedef.h"
#include "system/init.h"
#include "media/audio_stream.h"
//分频器 crossover:
typedef struct _CrossOverParam_TOOL_SET {
int way_num; //段数
int N; //阶数
int low_freq; //低中分频点
int high_freq; //高中分频点
} CrossOverUpdateParam;
//分频器 crossover:
typedef struct _CrossOverParam_EFF_TOOL_SET {
CrossOverUpdateParam parm;
} crossover_param_tool_set;
struct audio_crossover_filter_info {
CrossOverUpdateParam *crossover;
};
typedef int (*audio_crossover_filter_cb)(void *drc, struct audio_crossover_filter_info *info);
struct audio_crossover_param {
u32 sample_rate; //数据采样率
u8 channel; //通道数
u8 run32bit; //是否支持32bit 的输入数据处理 1:使能 0:不使能
u8 core;
u8 Qval;
CrossOverUpdateParam *crossover;
void *priv;
int (*output[3])(void *priv, void *data, u32 len);
};
struct audio_crossover {
void *work_buf;
CrossOverUpdateParam *crossover_inside;//
CrossOverUpdateParam *crossover;//
void *hw_crossover[3];
void *priv;
int (*output[3])(void *priv, void *data, u32 len);
u32 sample_rate; //采样率
u8 channel; //通道数
u8 run32bit; //是否使能32bit位宽数据处理1:使能 0:不使能
u8 updata; //系数更标志
u8 core;
u8 Qval;
};
struct audio_crossover *audio_crossover_open(struct audio_crossover_param *param);
int audio_crossover_close(struct audio_crossover *hdl);
int audio_crossover_run(struct audio_crossover *hdl, s16 *indata, s16 *outdata0, s16 *outdata1, s16 *outdata2, u32 len);//每次处理多个频带
void audio_crossover_update_parm(struct audio_crossover *hdl, CrossOverUpdateParam *crossover_parm);
void audio_crossover_set_bit_wide(struct audio_crossover *hdl, u8 run32bit);
int audio_crossover_run_pro(struct audio_crossover *hdl, s16 *indata, s16 *outdata, u32 len, int band_tar);//每次处理一个频带
int audio_crossover_flush_out(struct audio_crossover *hdl);
#endif
@@ -0,0 +1,10 @@
#ifndef _AUDIO_DRC_COMMON_H_
#define _AUDIO_DRC_COMMON_H_
struct threshold_group {
float in_threshold;
float out_threshold;
};
#endif
+93
View File
@@ -0,0 +1,93 @@
#ifndef _audio_echo_h__
#define _audio_echo_h__
#include "effects/AudioEffect_DataType.h"
typedef struct _EF_ECHO__PARM_ {
unsigned int delay; //回声的延时时间 0-300ms
unsigned int decayval; // 0-70%
unsigned int filt_enable; //滤波器使能标志
unsigned int lpf_cutoff; //0-20k
unsigned int wetgain; //0-200%
unsigned int drygain; //0-100%
af_DataType dataTypeobj;
} ECHO_PARM_SET;
struct echo_update_parm {
unsigned int delay; //回声的延时时间 0-300ms
unsigned int decayval; // 0-70%
unsigned int filt_enable; //滤波器使能标志
unsigned int lpf_cutoff; //0-20k
unsigned int wetgain; //0-200%
unsigned int drygain; //0-100%
} ;
typedef struct _EF_REVERB_FIX_PARM {
unsigned int sr;
unsigned int max_ms;
} EF_REVERB_FIX_PARM;
/*open 跟 run 都是 成功 返回 RET_OK,错误返回 RET_ERR*/
/*魔音结构体*/
typedef struct __ECHO_FUNC_API_ {
unsigned int (*need_buf)(unsigned int *ptr, ECHO_PARM_SET *echo_parm, EF_REVERB_FIX_PARM *echo_fix_parm);
int (*open)(unsigned int *ptr, ECHO_PARM_SET *echo_parm, EF_REVERB_FIX_PARM *echo_fix_parm);
int (*init)(unsigned int *ptr, ECHO_PARM_SET *echo_parm);
int (*run)(unsigned int *ptr, short *inbuf, short *outdata, int len);
void (*reset_wetdry)(unsigned int *ptr, int wetgain, int drygain); //新增
} ECHO_FUNC_API;
typedef struct __EF_ECHO_TOOL_SET_ {
int is_bypass; // 1-> byass 0 -> no bypass
struct echo_update_parm parm;
u32 wet_bit_wide;
} echo_param_tool_set;
struct audio_echo_parm {
ECHO_PARM_SET echo_parm;
EF_REVERB_FIX_PARM fixparm;
u16 in_channel;
u16 wet_bit_wide;
};
struct audio_echo {
void *workbuf;
ECHO_FUNC_API *ops; //函数指针
struct audio_echo_parm parm;
u8 status;
u8 update;
};
extern ECHO_FUNC_API *get_echo24r16_func_api();
extern ECHO_FUNC_API *get_echo_func_api();
extern ECHO_FUNC_API *get_echo_func_api_mask();
/*
* 打开echo声卡混响模块
*/
struct audio_echo *audio_echo_open(struct audio_echo_parm *parm);
/*
* echo声卡混响处理
*/
int audio_echo_run(struct audio_echo *hdl, short *in, short *out, int len);
/*
* 关闭echo声卡混响模块
*/
void audio_echo_close(struct audio_echo *hdl);
/*
* plate声卡混响参数更新
*/
void audio_echo_update_parm(struct audio_echo *hdl, struct echo_update_parm *parm);
void audio_echo_bypass(struct audio_echo *hdl, u8 bypass);
#endif // reverb_echo_h__
+442
View File
@@ -0,0 +1,442 @@
#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"
#include "effects/effects_adj.h"
#define EQ_COEFF_NUM_PER_SECTION 5
/*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;
typedef enum {
HW_EQ_CORE_AUTO_SEL = 0,
HW_EQ_CORE_0 = 1,
HW_EQ_CORE_1 = 2,
} HW_EQ_CORE_SEL;
#define audio_eq_filter_info eq_coeff_info
typedef int (*audio_eq_filter_cb)(void *eq, int sr, struct audio_eq_filter_info *info);
//64位的位或处理
#define MASK_BIT(n) (u64)((u64)1 << (n))
struct audio_eq;
struct eq_parm {
u8 in_mode; //输入数据位宽 0:short 1:int 2:float
u8 out_mode; //输出数据位宽 0:short 1:int 2:float
u8 run_mode; //运行模式 0:normal 1:mono 2:stereo
u8 data_in_mode; //输入数据排放模式 0:block_in 1:sequence_in
u8 data_out_mode; //输出数据排放模式 0:block_out 1:sequenceo_out
};
struct audio_eq_param {
u8 no_wait; //异步eq处理使能, 1:使能异步eq(非阻塞) 0:使用同步阻塞方式eq处理
u8 max_nsection; //最大的eq段数,根据使用填写,要小于等于EQ_SECTION_MAX
u8 nsection; //实际需要的eq段数,需小于等于max_nsection
u8 out_32bit; //输入16bit时,输出位宽控制 0:16bit 1:32bit(如需输入其他位宽,请看结构体 struct eq_parm)
u8 channels; //通道数,1:单声道 2:立体声
u8 core; //多硬件支持选配,需芯片支持 0:自动选配, 1:使用eq core1 2:使用eq core2 (HW_EQ_CORE_SEL)
audio_eq_filter_cb cb;//获取eq系数的回调函数
u32 sr; //采样率,更根据当前数据实际采样率填写
float global_gain;
struct eq_seg_info *seg;
float global_gain_r;
struct eq_seg_info *seg_r;
void *parm; //struct eq_parm
void *priv; //私有指针
int (*output)(void *priv, void *data, u32 len);//异步eq输出回调
};
struct eq_fade_parm {
u8 fade_time; //系数更新是否需要淡入,淡入timer循环时间建议值(10~100ms)
u8 f_fade_step; //滤波器中心截止频率淡入步进(10~100Hz)
float fade_step; //滤波器增益淡入步进(0.01f~1.0f)
float q_fade_step; //滤波器q值淡入步进(0.01f~1.0f
float g_fade_step; //总增益淡入步进(0.01f~1.0f
void *priv;
int (*callback)(struct audio_eq *eq, void *priv);//淡出结束时的回调函数
};
struct audio_eq_fade {
u8 type_en;
u8 nsection;
u16 timer;
u32 cur_seg_size;
float cur_global_gain;
float use_global_gain;
struct eq_seg_info *cur_seg;
struct eq_seg_info *use_seg;
u8 *gain_flag;
void *priv;
int (*callback)(struct audio_eq *eq, void *priv);
} ;
#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;
u8 core; //多硬件支持选配,需芯片支持
u8 run_status;
u8 dma_ram; //是否使用外部配置的dma_ram 0:否, 1:是
u8 ext_seg_num[2];
u8 ext_coeff_lp_num[2];
u8 ext_coeff_hp_num[2];
u32 sr; //采样率
u64 mask[2];
float global_gain;
float global_gain_r;
s16 *eq_out_buf;//同步方式,32bit输出,当out为NULL时,内部申请eq_out_buf
int out_buf_size;
#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 audio_eq_fade *fade;
struct audio_eq_fade *fade_r;
struct eq_fade_parm fade_parm;
void (*resume)(void *priv); //非数据流节点方式,激活解码
void *resume_priv;
spinlock_t lock;
};
/*获取默认系数表EQ_MODE*/
struct eq_default_seg_tab {
float global_gain;
int seg_num;
struct eq_seg_info *seg;
};
struct eq_default_parm { //eq默认参数配置
char name[16]; //节点名字
char mode_index;//节点与多模式关联时,该变量用于获取相应模式下的节点参数.模式序号(如,蓝牙模式下,无多子模式,mode_index 是0
char cfg_index;//默认配置项序号(指定配置文件内的目标配置项)
char core;
struct eq_default_seg_tab default_tab;//发生过调用默认系数表切换(eq_mode_set, eq_mode_sw)的动作时,此处的获取才会有效,否则使用文件内cfg_name对应的参数
};
struct eq_tool {//配置项存储结构
float global_gain; //总增益
int is_bypass: 8; //0 关闭, 1:打开bypass
int seg_num: 8; //eq效果文件存储的段数 +2
int reserve: 16;
struct eq_seg_info seg[0]; //eq系数存储地址,高阶高通低通滤波器追加存储在尾部
};
struct eq_online { //在线调试临时存储的系数结构
int uuid;
char name[16];
int is_bypass; //1: 直通
float global_gain; //总增益
int seg_num; //eq效果文件存储的段数
struct eq_seg_info seg[0]; //eq系数存储地址
};
#define EQ_NAME_CMD 0x1
#define EQ_IS_BYPASS_CMD 0x2
#define EQ_SEG_NUM_CMD 0x3
#define EQ_SEG_CMD 0x7
#define EQ_GLOBAL_GAIN_CMD 0x8
/*
*特殊类型,用于工具同步所有节点参数下来时,提速使用
* */
#define EQ_SPECIAL_CMD 0x9//bypass 总增益 段数
#define EQ_SPECIAL_SEG_CMD 0xa//多滤波器同时更新
/*调音结构、eq节点参数更新结构*/
struct eq_adj {
/*****************************/
/*工具调音结构*/
int type;
union {
int is_bypass;//1: 直通
float global_gain;
int seg_num; //eq效果文件存储的段数
struct eq_seg_info seg;
} param;
/*****************************/
/*参数更新附带淡入配置结构*/
struct eq_fade_parm fade_parm;
};
struct eq_core_check {
struct list_head entry;
void *stream;
int core;
};
/*
*eq core自动选配,并添加到eq core链表
* */
int eq_core_auto_sel(struct eq_core_check *check, void *stream);
/*
* 从eq core链表内删除
* */
void eq_core_auto_del(struct eq_core_check *check);
/*----------------------------------------------------------------------------*/
/**@brief eq模块初始化
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void audio_eq_init(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:运行模式,0normal, 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, struct hw_eq_info *info);
/*----------------------------------------------------------------------------*/
/**@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);
/*
* audio_eq_open重新封装,简化使用
**/
/*----------------------------------------------------------------------------*/
struct audio_eq *audio_dec_eq_open(struct audio_eq_param *parm);
/*
*audio_eq_close重新封装,简化使用
* */
void audio_dec_eq_close(struct audio_eq *eq);
/*
*audio_eq_run重新疯转,支持输入输出不同地址,如使用异步处理,out配NULL
* */
int audio_dec_eq_run(struct audio_eq *eq, s16 *in, s16 *out, u16 len);
int audio_eq_flush_out(struct audio_eq *eq);
int check_eq_core(struct eq_core_check *check);
/*
*更新左声道总增益
* */
void audio_eq_update_global_gain(struct audio_eq *eq, struct eq_fade_parm fade_parm, float g_Gain);
/*
*更新右声道总增益
* */
void audio_eq_update_right_ch_global_gain(struct audio_eq *eq, struct eq_fade_parm fade_parm, float g_Gain);
/*
*更新左声某一段eq系数seg
*nsection:总的段数
* */
void audio_eq_update_seg_info(struct audio_eq *eq, struct eq_fade_parm fade_parm, struct eq_seg_info *seg, u32 nsection);
/*
*更新右声道某一段eq系数
*nsection:总的段数
* */
void audio_eq_update_right_ch_seg_info(struct audio_eq *eq, struct eq_fade_parm fade_parm, struct eq_seg_info *seg, u32 nsection);
/*
*段数发生改变,更新系数表地址
* */
void audio_eq_update_seg_ptr(struct audio_eq *eq, struct eq_seg_info *seg);
/*
*eq滤波器系数回调
* */
int eq_get_filter_info(void *_eq, int sr, struct audio_eq_filter_info *info);
/*
*初始化为直通系数
*nsection:总的段数
*coeff:目标系数首地址
* */
void eq_coeff_default_init(u32 nsection, void *coeff);
/*----------------------------------------------------------------------------*/
/**@brief 滤波器计算管理函数
@param *seg:提供给滤波器的基本信息
@param sample_rate:采样率
@param *coeff:计算后,系数输出地址
@return
@note
*/
/*----------------------------------------------------------------------------*/
int eq_seg_design(struct eq_seg_info *seg, int sample_rate, void *coeff);
int audio_eq_tab_check(struct eq_seg_info *seg, u16 seg_num);
int audio_eq_cal_hp_lp_filter_addr(struct audio_eq *eq, struct eq_seg_info *seg_tab, u8 i);
#endif
@@ -0,0 +1,53 @@
#ifndef _PITCH_SHIFT_HOWLING_API_H
#define _PITCH_SHIFT_HOWLING_API_H
#include "effects/howling_pitchshifter_api.h"
typedef struct _HOWLING_PITCHSHIFT_PARM_ {
s16 ps_parm;
s16 fe_parm;
s16 use_ps;
s16 use_fs;
} _HOWLING_PITCHSHIFT_PARM;
typedef struct _HowlingPs_PARM_TOOL_SET_ {
int is_bypass; // 1-> byass 0 -> no bypass
_HOWLING_PITCHSHIFT_PARM parm;
} howling_pitchshift_param_tool_set;
struct audio_frequency_shift_howling_parm {
HOWLING_PITCHSHIFT_PARM pitch_parm;
int sample_rate;
u16 channel;
};
struct audio_frequency_shift_howling {
void *workbuf;
HOWLING_PITCHSHIFT_FUNC_API *ops;
struct audio_frequency_shift_howling_parm parm;
u8 status;
u8 update;
};
/*
*移频啸叫抑制打开
* */
struct audio_frequency_shift_howling *audio_frequency_shift_howling_open(struct audio_frequency_shift_howling_parm *para);
/*
*移频啸叫抑制运行处理
* */
int audio_frequency_shift_howling_run(struct audio_frequency_shift_howling *hdl, short *in, short *out, int len);
/*
*移频啸叫抑制关闭
* */
void audio_frequency_shift_howling_close(struct audio_frequency_shift_howling *hdl);
/*
*移频啸叫抑制参数更新
* */
void audio_frequency_shift_howling_update_parm(struct audio_frequency_shift_howling *hdl, HOWLING_PITCHSHIFT_PARM *parm);
/*
*移频啸叫抑制直通设置
* */
void audio_frequency_shift_howling_bypass(struct audio_frequency_shift_howling *hdl, u8 bypass);
#endif
@@ -0,0 +1,91 @@
#ifndef __AUDIO_GAIN_PORCESS__H
#define __AUDIO_GAIN_PORCESS__H
#include "media/audio_stream.h"
#ifndef RUN_NORMAL
#define RUN_NORMAL 0
#endif
#ifndef RUN_BYPASS
#define RUN_BYPASS 1
#endif
struct _aud_gain_parm_update {
int revere_phase;
float gain;
};
typedef struct _gain_process_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
struct _aud_gain_parm_update parm;
} gain_param_tool_set;
struct aud_steromix_gain_parm_update {
float gain[4];
};
typedef struct _steromix_gain_process_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
struct aud_steromix_gain_parm_update parm;
} stereo_mix_gain_param_tool_set;
struct aud_gain_parm {
float gain[4];//增加多少dB
u8 channel;//通道数
u8 indata_inc;//channel ==1 ?1:2;
u8 outdata_inc;//channel ==1 ?1:2;
u8 bit_wide;//0:16bit 132bit
u8 divide;//左右声道是否需要独立的gain
};
struct aud_gain_parm_update {
float gain[4];//增加多少dB
};
struct aud_gain_process {
struct aud_gain_parm parm;
u8 status; //内部运行状态机
u8 update; //设置参数更新标志
};
struct aud_gain_process *audio_gain_process_open(struct aud_gain_parm *parm);
void audio_gain_process_run(struct aud_gain_process *hdl, s16 *data, int len);
void audio_gain_process_close(struct aud_gain_process *hdl);
void audio_gain_process_update_parm(struct aud_gain_process *hdl, struct aud_gain_parm_update *parm);
void audio_gain_process_bypass(struct aud_gain_process *hdl, u8 bypass);
struct aud_gain_process *get_cur_gain_hdl_by_name(u32 gain_name);
/*
* *in:输入数据地址
* *out:输出数据地址
* gain:dB值(powf(10, 界面值gain / 20.0f))
* channel:输入数据通道数
* Indatainc:同个声道相邻两点的差值 channel ==1 ?1:2
* OutdataInc:同个声道相邻两点的差值 channel ==1 ?1:2
* per_channel_npoint:一个声道的点数
* */
extern void GainProcess_16Bit(short *in, short *out, float gain, int channel, int IndataInc, int OutdataInc, int per_channel_npoint); //16位宽
/*
* *in:输入数据地址
* *out:输出数据地址
* gain:dB值powf(10, 界面值gain / 20.0f)
* channel:输入数据通道数
* Indatainc:同个声道相邻两点的差值 channel ==1 ?1:2
* OutdataInc:同个声道相邻两点的差值 channel ==1 ?1:2
* per_channel_npoint:一个声道的点数
* */
extern void GainProcess_32Bit(int *in, int *out, float gain, int channel, int IndataInc, int OutdataInc, int per_channel_npoint); //32位宽
void SplitGainProcess_16Bit(short *in, short *out, float *gain, int channel, int IndataInc, int OutdataInc, int per_channel_npoint); //16位宽
void SplitGainProcess_32Bit(int *in, int *out, float *gain, int channel, int IndataInc, int OutdataInc, int per_channel_npoint); //32位宽
//功能:包含增益调节、相位取反、左右声道混合、左右声道互换
/* 原理上是 */
// 左声道的数据 = 左声道的数据 * gain[0] + 右声道的数据 * gain[1]
/* 右声道的数据 = 左声道的数据 * gain[2] + 右声道的数据 * gain[3] */
//default: gain[0] = 1.0f gain[1] = 0.0f gain[2] = 0.0f ,gain[3] = 1.0f
void SteroMix_16bit(short *in, short *out, float *gain, int channel, int IndataInc, int OutdataInc, int per_channel_npoint);
void SteroMix_32bit(int *in, int *out, float *gain, int channel, int IndataInc, int OutdataInc, int per_channel_npoint);
#endif
@@ -0,0 +1,54 @@
#ifndef _AUDIO_HARMONIC_EXCITER_API_H_
#define _AUDIO_HARMONIC_EXCITER_API_H_
#include "system/includes.h"
#include "media/audio_stream.h"
#include "effects/excitor_api.h"
typedef struct _HarmonicExciterUdateParam {//与EXCITER_PARM关联
unsigned int wet_highpass_freq;
unsigned int wet_lowpass_freq;
int wetgain; //0-100
int drygain;
int excitType;
} HarmonicExciterUdateParam;
typedef struct _HarmonicExciter_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
HarmonicExciterUdateParam parm;
} harmonic_exciter_param_tool_set;
struct harmonic_exciter_param {
EXCITER_PARM param;
u32 samplerate;
u32 ch_num;
};
//谐波增强
struct audio_harmonic_exciter {
void *workbuf; //harmonic_exciter 运行句柄及buf
EXCITE_FUNC_API *ops;
struct harmonic_exciter_param parm;
u8 status; //内部运行状态机
u8 update; //设置参数更新标志
};
int audio_harmonic_exciter_run(struct audio_harmonic_exciter *hdl, void *datain, void *dataout, u32 len);
struct audio_harmonic_exciter *audio_harmonic_exciter_open(struct harmonic_exciter_param *parm);
int audio_harmonic_exciter_close(struct audio_harmonic_exciter *hdl);
void audio_harmonic_exciter_set_bit_wide(struct audio_harmonic_exciter *hdl, af_DataType dataTypeobj);
int audio_harmonic_exciter_update_parm(struct audio_harmonic_exciter *hdl, HarmonicExciterUdateParam *parm);
void audio_harmonic_exciter_bypass(struct audio_harmonic_exciter *hdl, u8 bypass);
#ifndef RUN_NORMAL
#define RUN_NORMAL 0
#endif
#ifndef RUN_BYPASS
#define RUN_BYPASS 1
#endif
#endif
@@ -0,0 +1,43 @@
#ifndef __AUDIO_NOISEGATE_API_H
#define __AUDIO_NOISEGATE_API_H
#include "media/audio_stream.h"
#include "effects/noisegate_api.h"
typedef struct __NoiseGate_update_Param {
int attackTime; //启动时间
int releaseTime; //释放时间
float threshold; //阈值 界面值
float low_th_gain; //低于阈值增益 界面值
} _noisegate_update_param;
typedef struct _NoiseGateParam_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
_noisegate_update_param parm;
} noisegate_param_tool_set;
typedef struct _NOISEGATE_API_STRUCT_ {
void *workbuf; //运算buf指针
NoiseGateParam parm; //参数
u8 status;
u8 update;
} NOISEGATE_API_STRUCT;
NOISEGATE_API_STRUCT *audio_noisegate_open(NoiseGateParam *noisegate_para);
void audio_noisegate_close(NOISEGATE_API_STRUCT *hdl);
void audio_noisegate_update_parm(NOISEGATE_API_STRUCT *hdl, noisegate_update_param *parm);
void audio_noisegate_bypass(NOISEGATE_API_STRUCT *hdl, u8 bypass);
int audio_noisegate_run(NOISEGATE_API_STRUCT *hdl, s16 *data, u16 len);
#ifndef RUN_NORMAL
#define RUN_NORMAL 0
#endif
#ifndef RUN_BYPASS
#define RUN_BYPASS 1
#endif
#endif
@@ -0,0 +1,54 @@
#ifndef __AUDIO_NOTCH_HOWLING_API_H
#define __AUDIO_NOTCH_HOWLING_API_H
#include "notch_howling_api.h"
//啸叫抑制 NotchHowling:
typedef struct _NotchHowlingUpdateParam {
float Q; //Q值
float gain; //增益
int fade_n; //启动释放时间
float threshold;
} NotchHowlingUpdateParam;
typedef struct _NotchHowlingParam_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
NotchHowlingUpdateParam parm;
} notch_howling_param_tool_set;
struct audio_notch_howling_parm {
NotchHowlingParam notch_parm;
u16 channel;
};
struct audio_notch_howling {
void *workbuf;
struct audio_notch_howling_parm parm;
u8 status;
u8 update;
};
/*
*陷波啸叫抑制打开
* */
struct audio_notch_howling *audio_notch_howling_open(struct audio_notch_howling_parm *para);
/*
*陷波啸叫抑制运行处理
* */
int audio_notch_howling_run(struct audio_notch_howling *hdl, short *in, short *out, int len);
/*
*陷波啸叫抑制关闭
* */
void audio_notch_howling_close(struct audio_notch_howling *hdl);
/*
*陷波啸叫抑制参数更新
* */
void audio_notch_howling_update_parm(struct audio_notch_howling *hdl, NotchHowlingUpdateParam *parm);
/*
*陷波啸叫抑制直通设置
* */
void audio_notch_howling_bypass(struct audio_notch_howling *hdl, u8 bypass);
#endif
+41
View File
@@ -0,0 +1,41 @@
#ifndef _AUDIO_PITCH_API_H_
#define _AUDIO_PITCH_API_H_
#include "effects/pitchshifter_api.h"
// #include "mono2stereo/reverb_mono2stero_api.h"
typedef struct _s_pitch_hdl {
PITCHSHIFT_FUNC_API *ops;
u8 *databuf;
PITCH_SHIFT_PARM parm;
u8 run_en;
u8 update;
} s_pitch_hdl;
/*
* 获取变声模块默认参数;open时不传默认参数会使用内部默认参数
* 仅用于获取初值。实时参数存放在open的返回句柄parm中
*/
PITCH_SHIFT_PARM *get_pitch_parm(void);
/*
* 变声模块打开
*/
s_pitch_hdl *open_pitch(PITCH_SHIFT_PARM *param);
/*
* 变声模块关闭
*/
void close_pitch(s_pitch_hdl *picth_hdl);
/*
* 变声模块参数更新
*/
void update_picth_parm(s_pitch_hdl *pitch_hdl, PITCH_SHIFT_PARM *p_pitch_parm);
/*
* 变声模块数据处理
*/
void pitch_run(s_pitch_hdl *picth_hdl, s16 *indata, s16 *outdata, int len, u8 ch_num);
/*
* 变声模块暂停处理
*/
void pause_pitch(s_pitch_hdl *pitch_hdl, u8 run_mark);
#endif
@@ -0,0 +1,42 @@
#ifndef _AUDIO_PITCHSPEED_API_H_
#define _AUDIO_PITCHSPEED_API_H_
#include "cpu/includes.h"
#include "media/includes.h"
#include "system/includes.h"
#include "effects/ps_cal_api.h"
typedef struct _pitch_speed_tool_set {
float pitch; //-12~12 半音阶
float speed; //0.5~3 速度倍数
} pitch_speed_param_tool_set;
struct pitch_speed_update_parm {
char name[16];
u16 speedV;//>80变快,<80 变慢,建议范围36-130
u16 pitchV;//32768 是原始音调 >32768是音调变高,<32768 音调变低,建议范围20000 - 50000
};
struct audio_pitchspeed_open_parm {
PS69_CONTEXT_CONF param;
int chn;
int sr;
};
struct pitch_speed {
PS69_API_CONTEXT *ops;
void *workbuf; //运算buf指针
struct audio_pitchspeed_open_parm param;
u8 updata;
u8 status;
};
struct pitch_speed *audio_pitchspeed_open(struct audio_pitchspeed_open_parm *param);
int audio_pitchspeed_run(struct pitch_speed *hdl, s16 *in_data, s16 *out_data, int len);
void audio_pitchspeed_close(struct pitch_speed *hdl);
void audio_pitchspeed_update_parm(struct pitch_speed *hdl, PS69_CONTEXT_CONF *param);
#endif //_AUDIO_PITCHSPEED_API_H_
@@ -0,0 +1,66 @@
#ifndef _audio_reverb_h__
#define _audio_reverb_h__
#include "effects/reverb_api.h"
struct plate_reverb_update_parm { /*与Plate_reverb_parm结构关联*/
int wet; //0-300%
int dry; //0-200%
int pre_delay; //0-40ms
int highcutoff; //0-20k 高频截止
int diffusion; //0-100%
int decayfactor; //0-100%
int highfrequencydamping; //0-100%
int modulate; // 0或1
int roomsize; //20%-100%
int wet_bit_wide; //016bit 1:24bit 24bit使用多70k ram
};
typedef struct _Plate_reverb_TOOL_SET_ {
int is_bypass; // 1-> byass 0 -> no bypass
struct plate_reverb_update_parm parm;
} plate_reverb_param_tool_set;
struct audio_plate_reverb_parm {
Plate_reverb_parm plate_parm;
EF_REVERB0_FIX_PARM fixparm;
u16 advance;
u16 wet_bit_wide;
};
struct audio_plate_reverb {
void *workbuf;
PLATE_REVERB0_FUNC_API *ops; //函数指针
struct audio_plate_reverb_parm parm;
u8 status;
u8 update;
};
/*
* 打开plate声卡混响模块
*/
struct audio_plate_reverb *audio_plate_reverb_open(struct audio_plate_reverb_parm *parm);
/*
* plate声卡混响处理
*/
int audio_plate_reverb_run(struct audio_plate_reverb *hdl, short *in, short *out, int len);
/*
* 关闭plate声卡混响模块
*/
void audio_plate_reverb_close(struct audio_plate_reverb *hdl);
/*
* plate声卡混响参数更新
*/
void audio_plate_reverb_update_parm(struct audio_plate_reverb *hdl, struct plate_reverb_update_parm *parm);
void audio_plate_reverb_bypass(struct audio_plate_reverb *hdl, u8 bypass);
#endif // reverb_echo_h__
@@ -0,0 +1,54 @@
#ifndef _AUDIO_SPK_EQ_H_
#define _AUDIO_SPK_EQ_H_
#include "spinlock.h"
#include "math.h"
#include "effects/audio_eq.h"
struct spk_eq_seg_parm {
u8 type;//0:seg 1:gain 2:获取系数表地址
u8 left_right;//0:left 1:right
struct eq_seg_info seg;
};
struct spk_eq_global_gain {
u8 type;//0:seg 1:gain
u8 left_right;//0:left 1:right
float global_gain;
};
struct spk_eq_get_seg_tab {
u8 type;//0:seg 1:gain 2:获取系数表地址 3:获取总增益
u16 tab_size;
struct eq_seg_info *seg;//包含左右声道
};
struct spk_eq_get_global_gain {
u8 type;//0:seg 1:gain 2:获取系数表地址 3:获取总增益
float global_gain[2]; //0:left 1:right
};
struct spk_eq_get_parm {
char name[16];
u8 type;// 2:获取系数表地址,4:获取vm数据
struct spk_eq_get_seg_tab seg_tab;
struct spk_eq_get_global_gain g_gain;
};
int spk_eq_read_from_vm(void *priv);
void spk_eq_set_send_data_handler(void (*handler)(u8 seq, u8 *packet, u8 size));
int spk_eq_app_online_parse(u8 *packet, u8 size, u8 *ext_data, u16 ext_size);
int spk_eq_spp_rx_packet(u8 *packet, u8 len);
int spk_eq_read_seg_l(u8 **buf);
int spk_eq_read_seg_r(u8 **buf);
#define UPDATE_SPK_EQ_SEG 0
#define UPDATE_SPK_EQ_GLOBAL_GAIN 1
#define GET_SPK_EQ_SEG_TAB 2
#define GET_SPK_EQ_GLOBAL_GAIN 3
#define GET_SPK_EQ_VM_DATA 4
#endif
@@ -0,0 +1,51 @@
#ifndef _AUDIO_STEREO_widener_API_H_
#define _AUDIO_STEREO_widener_API_H_
#include "system/includes.h"
#include "media/audio_stream.h"
#include "effects/stereo_widen_api.h"
typedef struct _StereowidenerUdateParam {//与stewiden_parm_context关联
int widenerval; //widener: 0 to 100
int intensity; //EhanceStere 0 to 100
} StereoWidenerUdateParam;
typedef struct _Stereowidener_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
StereoWidenerUdateParam parm;
} stereo_widener_param_tool_set;
struct stereo_widener_param {
stewiden_parm_context param;
u32 samplerate;
u32 ch_num;
};
//立体声增强
struct audio_stereo_widener {
void *workbuf; //stereo_widener 运行句柄及buf
STE_WIDEN_FUNC_API *ops;
struct stereo_widener_param parm;
u8 status; //内部运行状态机
u8 update; //设置参数更新标志
};
int audio_stereo_widener_run(struct audio_stereo_widener *hdl, void *datain, void *dataout, u32 len);
struct audio_stereo_widener *audio_stereo_widener_open(struct stereo_widener_param *parm);
int audio_stereo_widener_close(struct audio_stereo_widener *hdl);
void audio_stereo_widener_set_bit_wide(struct audio_stereo_widener *hdl, af_DataType dataTypeobj);
int audio_stereo_widener_update_parm(struct audio_stereo_widener *hdl, StereoWidenerUdateParam *parm);
void audio_stereo_widener_bypass(struct audio_stereo_widener *hdl, u8 bypass);
#ifndef RUN_NORMAL
#define RUN_NORMAL 0
#endif
#ifndef RUN_BYPASS
#define RUN_BYPASS 1
#endif
#endif
@@ -0,0 +1,86 @@
#ifndef _AUDIO_SURROUND_API_H_
#define _AUDIO_SURROUND_API_H_
#include "system/includes.h"
#include "media/includes.h"
#include "effects/effect_sur_api.h"
typedef struct _surround_update_parm {//与结构SurEFECT_PARM_SET 关联
int effectflag; //音效类型
int rotatestep; //旋转速度
int damping; //高频衰减速度
int feedback; //整体衰减速度
int roomsize; //空间大小
} surround_update_parm;
typedef struct _SurroundEffect_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
surround_update_parm parm;
} surround_effect_param_tool_set;
typedef struct _surround_open_parm {
SurEFECT_PARM_SET param;
u8 channel; //通道数立体声配2, 不支持单声道
} surround_open_parm;
typedef struct _surround_hdl {
SUR_FUNC_API *ops; //环绕音效底层io
void *work_buf; //底层模块运行的句柄及buf
surround_open_parm parm; //打开模块传入的参数
u8 status; //内部运行状态机
u8 update; //设置参数更新标志
} surround_hdl;
/*----------------------------------------------------------------------------*/
/**@brief audio_surround_open 环绕音效打开
@param *parm: 环绕音效始化参数,详见结构体surround_open_parm
@return 句柄
@note
*/
/*----------------------------------------------------------------------------*/
surround_hdl *audio_surround_open(surround_open_parm *parm);
/*----------------------------------------------------------------------------*/
/**@brief audio_surround_update_parm 环绕音效参数更新
@param *parm:传入自定义参数
@return 0:成功 -1: 失败
@note 对耳时,左右声道效果,须设置保持一致
*/
/*----------------------------------------------------------------------------*/
int audio_surround_update_parm(surround_hdl *hdl, surround_update_parm *parm);
/*----------------------------------------------------------------------------*/
/**@brief audio_surround_close 环绕音效关闭处理
@param _hdl:句柄
@return 0:成功 -1:失败
@note
*/
/*----------------------------------------------------------------------------*/
int audio_surround_close(surround_hdl *_hdl);
/*----------------------------------------------------------------------------*/
/**@brief audio_surround_run 环绕音效处理
@param _hdl:句柄
@param data:需要处理的数据
@param len:数据长度
@return 0:成功 -1:失败
@note 无数据流节点时,直接使用改接口进行环绕音效的处理
*/
/*----------------------------------------------------------------------------*/
int audio_surround_run(surround_hdl *hdl, void *indata, void *outdata, u32 len);
void audio_surround_bypass(surround_hdl *hdl, u8 bypass);
#ifndef RUN_NORMAL
#define RUN_NORMAL 0
#endif
#ifndef RUN_BYPASS
#define RUN_BYPASS 1
#endif
#endif
+55
View File
@@ -0,0 +1,55 @@
#ifndef _AUDIO_VBASS_API_H_
#define _AUDIO_VBASS_API_H_
#include "system/includes.h"
#include "media/audio_stream.h"
#include "effects/VirtualBass_api.h"
typedef struct _VirtualBassUdateParam {
int ratio;
int boost;
int fc;
int ReserveLowFreqEnable;
int Reserved[7];
} VirtualBassUdateParam;
//虚拟低音
typedef struct _VirtualBass_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
VirtualBassUdateParam parm;
} virtual_bass_param_tool_set;
typedef struct _vbass_hdl {
void *workbuf; //vbass 运行句柄及buf
VirtualBassParam parm;
u8 status; //内部运行状态机
u8 update; //设置参数更新标志
u8 out32bit;
u8 fade_en; //是否使能系数淡入
u8 fade_step; //ratio淡入步进
int fade_ratio; //淡入目标值
} vbass_hdl;
int audio_vbass_run(vbass_hdl *hdl, void *datain, void *dataout, u32 len);
vbass_hdl *audio_vbass_open(VirtualBassParam *parm);
int audio_vbass_close(vbass_hdl *hdl);
void audio_vbass_set_bit_wide(vbass_hdl *hdl, u32 out32bit);
int audio_vbass_update_parm(vbass_hdl *hdl, VirtualBassUdateParam *parm);
void audio_vbass_bypass(vbass_hdl *hdl, u8 bypass);
//vbass link volume
void user_virtual_bass_udpate_parm_demo();
int vbass_link_volume();
#ifndef RUN_NORMAL
#define RUN_NORMAL 0
#endif
#ifndef RUN_BYPASS
#define RUN_BYPASS 1
#endif
#endif
@@ -0,0 +1,64 @@
#ifndef _AUDIO_VOCAL_REMOVE_API_H_
#define _AUDIO_VOCAL_REMOVE_API_H_
#include "system/includes.h"
#include "media/includes.h"
#include "effects/audio_eq.h"
typedef struct _VOCAL_REMOVE_PARM {
u32 low_cut_freq;
u32 high_cut_freq;
u8 remove_ratio; //人声消除比例
} VOCAL_REMOVE_PARM;
typedef struct _vocal_remover_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
VOCAL_REMOVE_PARM parm;
} vocal_remover_param_tool_set;
typedef struct _vocal_remove_open_parm {
u8 channel;//输入音频声道数
u8 bit_wide;//0:16bit 1:32bit
} vocal_remove_open_parm;
typedef struct _vocal_remove_hdl {
u32 vocal_remove_dis: 1;
u8 vocal_remove_ratio;
vocal_remove_open_parm o_parm;
} vocal_remove_hdl;
/*----------------------------------------------------------------------------*/
/**@brief audio_vocal_remove_open 人声消除打开
@param *_parm: 始化参数,详见结构体vocal_remove_open_parm
@return 句柄
@note
*/
/*----------------------------------------------------------------------------*/
vocal_remove_hdl *audio_vocal_remove_open(vocal_remove_open_parm *_parm);
/*----------------------------------------------------------------------------*/
/**@brief audio_vocal_remove_close 人声关闭处理
@param _hdl:句柄
@return 0:成功 -1:失败
@note
*/
/*----------------------------------------------------------------------------*/
int audio_vocal_remove_close(vocal_remove_hdl *_hdl);
/*----------------------------------------------------------------------------*/
/**@brief audio_vocal_remove_sw 运行过程开关处理
@param _hdl:句柄
@param dis: 0:人声消除有效 1:人声消除无效
@return 0:成功 -1:失败
@note
*/
/*----------------------------------------------------------------------------*/
int audio_vocal_remove_sw(vocal_remove_hdl *_hdl, u32 dis);
int audio_vocal_remove_run(vocal_remove_hdl *_hdl, void *data, u32 len);
int audio_vocal_remove_ratio(vocal_remove_hdl *_hdl, u8 ratio);
int audio_vocal_remove_eq_run(struct audio_eq *vocal_remove_eq, s16 *in, u16 len, int is_bypass);
#endif
@@ -0,0 +1,72 @@
#ifndef _AUDIO_VOICE_CHANGER_API_H_
#define _AUDIO_VOICE_CHANGER_API_H_
#include "effects/voiceChanger_api.h"
#include "media/audio_stream.h"
enum {
V_CHANGER_ORINGIN_TYPE,
V_CHANGER_ADVANCE_TYPE,
};
struct voice_changer_update_parm { //与结构VOICECHANGER_PARM关联
u32 effect_v; //
u32 shiftv; //pitch rate: 40-250
u32 formant_shift; // 40-250
};
typedef struct _VoiceChangerParam_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
struct voice_changer_update_parm parm;
} voice_changer_param_tool_set;
struct voicechanger_open_parm {
VOICECHANGER_PARM param;
u32 sample_rate;
u8 type; //0 -> VoiceChanger1 -> VoiceChanger_adv
};
typedef struct _voice_changer_hdl {
VOICECHANGER_FUNC_API *ops;
void *workbuf;
struct voicechanger_open_parm parm;
u8 update;
u8 status;
} voice_changer_hdl;
/*
* 获取变声模块默认参数;open时不传默认参数会使用内部默认参数
* 仅用于获取初值。实时参数存放在open的返回句柄parm中
*/
extern VOICECHANGER_FUNC_API *get_voiceChanger_func_api();
extern VOICECHANGER_FUNC_API *get_voiceChanger_adv_func_api();
/*
* 变声模块打开
*/
voice_changer_hdl *audio_voice_changer_open(struct voicechanger_open_parm *param);
/*
* 变声模块关闭
*/
void audio_voice_changer_close(voice_changer_hdl *hdl);
/*
* 变声模块参数更新
*/
void audio_voice_changer_update_parm(voice_changer_hdl *hdl, struct voice_changer_update_parm *parm);
/*
* 变声模块数据处理
*/
int audio_voice_changer_run(voice_changer_hdl *hdl, s16 *indata, s16 *outdata, int len, u8 ch_num);
/*
* 变声模块暂停处理
*/
void audio_voice_changer_bypass(voice_changer_hdl *hdl, u32 bypass);
#endif
#ifndef RUN_NORMAL
#define RUN_NORMAL 0
#endif
#ifndef RUN_BYPASS
#define RUN_BYPASS 1
#endif
+70
View File
@@ -0,0 +1,70 @@
#ifndef _WDRC_API_H_
#define _WDRC_API_H_
#include "typedef.h"
#include "system/init.h"
#include "generic/list.h"
#include "effects/drc_api.h"
#include "effects/effects_adj.h"
#include "audio_drc_common.h"
struct wdrc_struct {
u16 attacktime; //启动时间
u16 releasetime; //释放时间
struct threshold_group threshold[6];
float inputgain; //wdrc输入数据放大或者缩小的db数(正数放大,负数缩小), 例如配2表示 总体增加2dB
float outputgain; //wdrc输出数据放大或者缩小的db数(正数放大,负数缩小)
float rms_time;
u8 threshold_num;
u8 old_rms_time;//无用
u8 algorithm;//0:PEAK 1:RMS
u8 mode;//0:PERPOINT 1:TWOPOINT
u16 holdtime; //预留位置
u8 reverved[2];//预留位置
};
//动态范围控制 DRC:
typedef struct _wdrc_struct_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
struct wdrc_struct parm;
} wdrc_param_tool_set;
struct audio_wdrc_filter_info {
wdrc_param_tool_set *wdrc;
};
typedef int (*audio_wdrc_filter_cb)(void *drc, struct audio_wdrc_filter_info *info);
struct audio_wdrc_param {
u32 sample_rate; //数据采样率
u8 channel; //通道数
u8 run32bit; //是否使能32bit的位宽数据处理 1:使能 0:不使能
u8 Qval;
wdrc_param_tool_set *wdrc;
};
struct audio_wdrc {
void *work_buf; //软件drc句柄
wdrc_param_tool_set *wdrc_inside;//内部使用
wdrc_param_tool_set *wdrc;//由输入参数指定
u32 sample_rate; //采样率
u8 channel; //通道数
u8 run32bit; //是否使能32bit位宽数据处理1:使能 0:不使能
u8 Qval;
u8 updata; //系数更标志
};
struct audio_wdrc *audio_wdrc_open(struct audio_wdrc_param *param);
int audio_wdrc_run(struct audio_wdrc *drc, s16 *indata, s16 *outdata, u32 len);
int audio_wdrc_close(struct audio_wdrc *drc);
void audio_wdrc_set_bit_wide(struct audio_wdrc *drc, u8 run32bit);
void audio_wdrc_update_parm(struct audio_wdrc *drc, void *wdrc_parm);
#endif
@@ -0,0 +1,31 @@
#ifndef _CHANNEL_EXPANDER__H
#define _CHANNEL_EXPANDER__H
#include "audio_splicing.h"
typedef struct _CH_EXPANDER_PARM {
u8 slience; //rl rr声道是否复制数据输出,1 不输出,0 输出
} CH_EXPANDER_PARM;
typedef struct __ChannelExpanderParam_TOOL_SET__ {
CH_EXPANDER_PARM parm;
} channel_expander_param_tool_set;
typedef struct _channel_expander_hdl_ {
CH_EXPANDER_PARM parm;
u8 update;
} channel_expander_hdl;
/*声道扩展打开*/
channel_expander_hdl *audio_channel_expander_open(CH_EXPANDER_PARM *parm);
/*声道扩展关闭*/
void audio_channel_expander_close(channel_expander_hdl *hdl);
/*声道扩展参数更新*/
void audio_channel_expander_update_parm(channel_expander_hdl *hdl, CH_EXPANDER_PARM *parm);
/*声道扩展数据处理*/
int audio_channel_adapter_run(channel_expander_hdl *hdl, short *out, short *in, int len, u8 out_ch_num, u8 in_ch_num, u8 bit_wide, u8 channel_mode);
#endif
+57
View File
@@ -0,0 +1,57 @@
#ifndef _CHOURS_API_H__
#define _CHOURS_API_H__
#include "AudioEffect_DataType.h"
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned short
#endif
#ifndef s16
#define s16 short
#endif
#ifndef u32
#define u32 unsigned int
#endif
#ifndef s32
#define s32 int
#endif
#ifndef s16
#define s16 signed short
#endif
typedef struct _CHORUS_PARM_ {
int wetgain; //0-100
int drygain;
int mod_depth;
int mod_rate;
int feedback;
int delay_length;
af_DataType dataTypeobj;
} CHORUS_PARM;
typedef struct _CHORUS_FUNC_API_ {
u32(*need_buf)(CHORUS_PARM *vc_parm);
int (*open)(void *ptr, u32 sr, u32 nch, CHORUS_PARM *vc_parm); //中途改变参数,可以调init
void (*run)(void *ptr, short *indata, short *outdata, int PointsPerChannel); //len是 每声道多少点
void (*init)(void *ptr, CHORUS_PARM *vc_parm); //中途改变参数,可以调init
} CHORUS_FUNC_API;
extern CHORUS_FUNC_API *get_chorus_ops();
#endif // reverb_api_h__
+111
View File
@@ -0,0 +1,111 @@
#ifndef __CONVERT_DATA_H
#define __CONVERT_DATA_H
#include "system/includes.h"
#include "media/audio_stream.h"
#include "effects/effects_adj.h"
struct convert_data {
u16 dat_len;
u16 dat_total;
u16 buf_len;
u16 *buf;
u8 type;
u8 channel;
};
struct convert_data *convet_data_open(int type, u32 buf_len);
void convet_data_close(struct convert_data *hdl);
void audio_convert_data_run(struct convert_data *hdl, void *in, void *out, u16 len);
void user_sat16(s32 *in, s16 *out, u32 npoint);
void audio_DatacConvert_LS_16to32bit(short *in, int *out, int npoint, int Nbit);
/* note: 32BIT转16bit位宽处理
* *indata:32bit位宽输入地址
* *outdata:16bit位宽输出地址
* npoint:总的输入点数(位移方式处理)
* */
void audio_convert_data_32bit_to_16bit_round(s32 *in, s16 *out, u32 npoint);
/* note: 16BIT转32bit位宽处理
* *indata:16bit位宽输入地址
* *outdata:32bit位宽输出地址
* npoint:总的输入点数(位移方式处理)
* */
void audio_convert_data_16bit_to_32bit_round(s16 *indata, s32 *outdata, int npoint);
/* note: 32BIT转16bit位宽处理
* *indata:32bit位宽输入地址
* *outdata:16bit位宽输出地址
* npoint:总的输入点数(溢出饱和方式处理)
* */
void audio_convert_data_32bit_to_16bit(s32 *inata, s16 *outdata, u32 npoint);
/* note: 16BIT转32bit位宽处理
* *indata:16bit位宽输入地址
* *outdata:32bit位宽输出地址
* npoint:总的输入点数(16bit 位宽数据赋值给32bit位宽数据,不做放大)
* */
void audio_convert_data_16bit_to_32bit(s16 *indata, s32 *outdata, int npoint);
/* note: 16BIT转32bit位宽处理接口2
* *indata:16bit位宽输入地址
* *outdata:32bit位宽输出地址
* channel:输入输出通道数
* IndataInc: 输入数据同个通道下个点的步进 例如左右左右 步进为2,单声道是1
* OutdataInc:输出数据同个通道下个点的步进 例如左右左右 步进为2,单声道是1
* per_channel_npoint:单个通道的输入点数
* */
void audio_convert_data_16bit_to_32bit_api2(short *indata, int *outdata, int channel, int IndataInc, int OutdataInc, int per_channel_npoint);
/* note: 32BIT转16bit位宽处理接口2
* *indata:32bit位宽输入地址
* *outdata:16bit位宽输出地址
* channel:输入输出通道数
* IndataInc: 输入数据同个通道下个点的步进 例如左右左右 步进为2,单声道是1
* OutdataInc:输出数据同个通道下个点的步进 例如左右左右 步进为2,单声道是1
* per_channel_npoint:单个通道的输入点数
* */
void audio_convrt_data_32bit_to_16bit_api2(int *indata, short *outdata, int channel, int IndataInc, int OutdataInc, int pre_channel_npoint);
/* note: 3byte_24bit转16bit位宽处理
* *in:3byte_24bit位宽输入地址
* *out:16bit位宽输出地址
* total_point:总的输入点数
* */
void audio_convert_data_3byte24bit_to_16bit(int *in, short *out, unsigned int total_point);
/* note: 3byte_24bit转4byte_24bit位宽处理
* *in:3byte_24bit位宽输入地址
* *out:4byte_24bit位宽输出地址
* total_point:总的输入点数
* */
void audio_convert_data_3byte24bit_to_4byte24bit(int *in, int *out, unsigned int total_point);
/* note: 4byte_24bit转3byte_24bit位宽处理
* *in:4byte_24bit位宽输入地址
* *out:3byte_24bit位宽输出地址
* total_point:总的输入点数
* */
void audio_convert_data_4byte24bit_to_3byte24bit(int *in, int *out, unsigned int total_point);
/* note: 16bit转3byte_24bit位宽处理
* *in:16bit位宽输入地址
* *out:3byte_24bit位宽输出地址
* total_point:总的输入点数
* */
void audio_convert_data_16bit_to_3byte24bit(short *in, int *out, unsigned int total_point);
extern int data_sat_s24(int ind);
extern void audio_data_sat_s24(s32 *data, u32 len);
//type
#define CONVERT_32_TO_16 0
#define CONVERT_16_TO_32 1
extern const int config_media_24bit_enable;
#endif/*__CONVERT_DATA_H*/
+147
View File
@@ -0,0 +1,147 @@
#ifndef DRC_API_H
#define DRC_API_H
#include "AudioEffect_DataType.h"
#ifdef WIN32
#define AT_DRC(x)
#define AT_DRC_CODE
#define AT_DRC_CONST
#define AT_DRC_SPARSE_CODE
#define AT_DRC_SPARSE_CONST
#else
#define AT_DRC(x) __attribute((section(#x)))
#define AT_DRC_CODE AT_DRC(.drc.text.cache.L2.code)
#define AT_DRC_CONST AT_DRC(.drc.text.cache.L2.const)
#define AT_DRC_SPARSE_CODE AT_DRC(.drc.text)
#define AT_DRC_SPARSE_CONST AT_DRC(.drc.text.const)
#endif
enum {
DATA_IN_SHORT = 0, //输入数据类型,输入short时,输出不能为int
DATA_IN_INT,
};
enum {
DATA_OUT_SHORT = 0, //输出数据类型,输入short时,输出不能为int
DATA_OUT_INT
};
enum {
PEAK = 0, //算法类型
RMS
};
enum {
PERPOINT = 0, //mode 模式
TWOPOINT
};
typedef struct _DrcParam {
/*
int *attackTime; //启动时间
int *releaseTime; //释放时间
float *threshold; //阈值{x1y1,x2,y2} 最多5组十个数据
int *ThresholdNum; //阈值的组数
int *rmsTime; // rms时间 algorithm为RMS有效
float *InputGain; // 输入增益(db
float *OutputGain; // 输出数据增益(db)
unsigned char algorithm; // PEAK或者RMS
unsigned char mode; // 模式
unsigned char intype; // 输入数据类型
unsigned char outtype; // 输出数据类型
*/
int channel;
int sampleRate;
int attackTime; //启动时间
int releaseTime; //释放时间
float *threshold; //阈值{x1y1,x2,y2} 最多5组十个数据
int ThresholdNum; //阈值的组数
float rmsTime; // rms时间 algorithm为RMS有效
float InputGain; // 输入增益(db
float OutputGain; // 输出数据增益(db)
unsigned char algorithm; // PEAK或者RMS
unsigned char mode; // 模式
unsigned char intype; // 输入数据类型
unsigned char outtype; // 输出数据类型
int IndataInc; // 输入数据同个通道下个点的步进 例如左右左右 步进为2
int OutdataInc; // 输出数据同个通道下个点的步进 例如左右左右 步进为2
af_DataType pcm_info;
} DrcParam;
//int GetDrcBuf(int algorithm, int *rmsTime, int channel, int sampleRate);
int GetDrcBuf(DrcParam *param); // bufsize 与 algorithmrmsTime channel、 sampleRate有关
//void DrcInit(void *WorkBuf, DrcParam *param, int channel, int sampleRate);
int DrcInit(void *WorkBuf, DrcParam *param);
void DrcUpdate(void *WorkBuf, DrcParam *param);
int DrcRun(void *WorkBuf, void *indata, void *outdata, int per_channel_npoint);
int GetDrcBuf_mask(DrcParam *param); // bufsize 与 algorithmrmsTime channel、 sampleRate有关
void DrcInit_mask(void *WorkBuf, DrcParam *param);
void DrcUpdate_mask(void *WorkBuf, DrcParam *param);
int DrcRun_mask(void *WorkBuf, void *indata, void *outdata, int per_channel_npoint);
/* InputGain 输入数据放大或者缩小的db数(正数放大,负数缩小) */
// inputgain 配2,表示总体增加2dB
/* OutputGain 输出数据放大或者缩小的db数(正数放大,负数缩小) */
#if 0
int GetDrcBuf(int algorithm, int *rmsTime, int channel, int sampleRate);
获取buf大小
参数说明:
algorithm:算法类型,PEAK或者RMS
rmsTime:
rms时间ms,算法类型为RMS时有效
channel 通道数
sampleRate:
采样率
void DrcInit(void *WorkBuf, int *attackTime, int *releaseTime, float *threshold, int *ThresholdNum, int *rmsTime, int channel, int sampleRate, int algorithm, int mode, int intype, int outtype);
初始化
参数说明:
WorkBuf:
运行buf
attackTime:
启动时间ms
releaseTime:
释放时间ms
threshold:
信号输入与对应的输出[in1, out1, in2, out2 ***排列] 最多5组数据, 3个阈值,4段
ThresholdNum:
信号输入与对应的输出组数
rmsTime:
rms时间ms
channel:
通道
sampleRate:采样率
algorithm:算法类型
mode:模式
intype:输入数据类型,DATA_IN_SHORT或者DATA_IN_INT
outtype:
输出数据类型,DATA_OUT_SHOR或者DATA_OUT_INT;若输入数据类型为DATA_IN_SHORT,输出类型只能设置为DATA_OUT_SHOR
void DrcUpdate(void *WorkBuf, int *attackTime, int *releaseTime, float *threshold, int *ThresholdNum, int channel, int sampleRate);
更新参数:使用rms算法时,当rmsTime fs变化时因为buf会产生变化,只能初始化更新
参数说明:
WorkBuf:
运行buf
attackTime:
启动时间ms
releaseTime:
释放时间ms
threshold:
信号输入与对应的输出[in1, out1, in2, out2 ***排列] 最多5组数据, 3个阈值,4段
ThresholdNum:
信号输入与对应的输出组数
int DrcRun(void *WorkBuf, void *indata, void *outdata, int per_channel_npoint);
运行:输入输出数据类型,要跟初始化配置的数据类型对应
WorkBuf:
运行buf
indata:输入数据
outdata:输出数据
per_channel_npoint:每个通道的样点数
#endif
#endif // !DRC_API_H
+213
View File
@@ -0,0 +1,213 @@
#ifndef __DYNAMIC_EQ_H__
#define __DYNAMIC_EQ_H__
#include "system/includes.h"
#include "media/audio_stream.h"
#include "effects/DynamicEQ_api.h"
#include "effects/DynamicEQ_Detection_api.h"
#include "effects/audio_eq.h"
#include "effects/drc_api.h"
#include "effects/convert_data.h"
#define RUN_NORMAL 0
#define RUN_BYPASS 1
//动态EQ DynamicEQ:
typedef struct _DynamicEQParam_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
int follow; //运算精度
int nSection; //段数
DynamicEQEffectParam effect_param[4];
} dynamic_eq_param_tool_set; //实际发送这个结构体
struct dynamic_eq_detection {
void *workbuf; //算法运行buf
int *out_buf; //模块运行输出的buf 32bit位宽
int out_len; //输出buf的长度
int len; //输出buf的长度
DynamicEQDetectionParam parm[4]; //算法相关配置参数
struct audio_eq *eq[4];
u32 sample_rate; //采样率
u8 nsection; //eq段数
u8 channel; //通道数
u8 status; //内部运行状态机
u8 update; //设置参数更新标志
u8 core; //eq 核
u8 in_32bit; //
s16 *in_buf;
u16 in_len;
};
/*
*********************************************************************
* dynamic_eq_detection_open
* Description: 动态eq检测模块打开
* Arguments :*parm 检测模块相关参数(中心截止频率)、若有2段,则parm[0], parm[1],参数连续存方
* nesection:动态eq检测模块支持的段数
* channel:输入数据通道数
* sample_rate:输入数据采样率
* Return : 模块句柄.
* Note(s) : None.
*********************************************************************
*/
struct dynamic_eq_detection *dynamic_eq_detection_open(DynamicEQDetectionParam *parm, u8 nsection, u8 channel, u32 sample_rate);
/*
*********************************************************************
* dynamic_eq_detection_run
* Description: 动态eq检测模块数据处理,不改变源数据
* Arguments :*hdl:模块句柄
* data:输入数据地址,16bit位宽
* len:输入数据长度,byte
* Return : None.
* Note(s) : None.
*********************************************************************
*/
int dynamic_eq_detection_run(struct dynamic_eq_detection *hdl, short *data, int len);
/*
*********************************************************************
* get_dynamic_eq_detection_parm
* Description: 获取动态eq检测模块的结果
* Arguments :*hdl:模块句柄
* **out:检测模块的结果输出地址,32bit位宽
* *out_len:检测模块结果数据长度byte
* Return : None.
* Note(s) : None.
*********************************************************************
*/
int get_dynamic_eq_detection_parm(struct dynamic_eq_detection *hdl, int **out, int *out_len);
/*
*********************************************************************
* dynamic_eq_detection_bypass
* Description: 动态eq检测模块设置直通、正常处理
* Arguments :*hdl:模块句柄
* bypass:设置直通(RUN_BYPASS)、正常处理(RUN_NORMAL)
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void dynamic_eq_detection_bypass(struct dynamic_eq_detection *hdl, u8 bypass);
/*
*********************************************************************
* dynamic_eq_detection_update_parm
* Description: 动态eq检测模块设置直通、正常处理
* Arguments :*hdl:模块句柄
* bypass:设置直通(RUN_BYPASS)、正常处理(RUN_NORMAL)
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void dynamic_eq_detection_update_parm(struct dynamic_eq_detection *hdl, DynamicEQDetectionParam *param);
/*
*********************************************************************
* dynamic_eq_detection_close
* Description: 动态eq检测模块关闭
* Arguments :*hdl:模块句柄
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void dynamic_eq_detection_close(struct dynamic_eq_detection *hdl);
struct dynamic_eq {
void *workbuf; //算法运行buf
DynamicEQEffectParam *effectParam;
DynamicEQParam parm; //算法相关配置参数
u8 status; //内部运行状态机
u8 update; //设置参数更新标志
struct dynamic_eq_detection *priv; //私有指针
int (*get_detect_parm)(struct dynamic_eq_detection *priv, int **out_data, int *out_len);//该回调,由dynamic_eq_detection 模块实现
void *det_hdl;
};
/*
*********************************************************************
* dynamic_eq_open
* Description: 动态eq打开
* Arguments :*parm 检测模块相关参数、若有2段,则parm[0], parm[1],参数连续存方
* nesection:动态eq检测模块支持的段数
* channel:输入数据通道数
* sample_rate:输入数据采样率
* Return : 模块句柄.
* Note(s) : None.
*********************************************************************
*/
// struct dynamic_eq *dynamic_eq_open(DynamicEQParam *parm, u8 nsection, u8 channel,u32 sample_rate);
struct dynamic_eq *dynamic_eq_open(DynamicEQEffectParam *effectParam, DynamicEQParam *parm);//, u8 nsection, u8 channel, u32 sample_rate)
/*
*********************************************************************
* dynamic_eq_set_detection_callback
* Description: 动态eq 设置检测模块的结果回调
* Arguments :*hdl:模块句柄
* priv:私有指针
* get_detect_parm:检测模块的输出回调
* Return : 模块句柄.
* Note(s) : None.
*********************************************************************
*/
void dynamic_eq_set_detection_callback(struct dynamic_eq *hdl, void *priv, int (*get_detect_parm)(struct dynamic_eq_detection *priv, int **out_data, int *out_len));
/*
*********************************************************************
* dynamic_eq_run
* Description: 动态eq模块数据处理
* Arguments :*hdl:模块句柄
* data:输入数据地址,32bit位宽
* len:输入数据长度,byte
* Return : None.
* Note(s) : None.
*********************************************************************
*/
int dynamic_eq_run(struct dynamic_eq *hdl, int *data, int len);
/*
*********************************************************************
* dynamic_eq_bypass
* Description: 动态eq模块设置直通、正常处理
* Arguments :*hdl:模块句柄
* bypass:设置直通(RUN_BYPASS)、正常处理(RUN_NORMAL)
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void dynamic_eq_bypass(struct dynamic_eq *hdl, u8 bypass);
/*
*********************************************************************
* dynamic_eq_bypass
* Description: 动态eq模块设置直通、正常处理
* Arguments :*hdl:模块句柄
* bypass:设置直通(RUN_BYPASS)、正常处理(RUN_NORMAL)
* Return : None.
* Note(s) : None.
*********************************************************************
*/
// void dynamic_eq_update(struct dynamic_eq *hdl, DynamicEQParam *param);
void dynamic_eq_update(struct dynamic_eq *hdl, DynamicEQEffectParam *effectParam, DynamicEQParam *param);
/*
*********************************************************************
* dynamic_eq_close
* Description: 动态eq检块关闭
* Arguments :*hdl:模块句柄
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void dynamic_eq_close(struct dynamic_eq *hdl);
#endif/*__DYNAMIC_EQ_H__*/
@@ -0,0 +1,49 @@
#ifndef effectSUR_api_h__
#define effectSUR_api_h__
#include "AudioEffect_DataType.h"
/* enum */
// {
// EFFECT_CH_L = 0x10, //单声道输入,输出左声道
// EFFECT_CH_R = 0x20, //单声道输入,输出右声道
// EFFECT_CH2_L= 0x30, //双声道输入,输出2个左声道
// EFFECT_CH2_R = 0x40, //双声道输入,输出2个右声道
/* }; */
enum {
EFFECT_3D_TYPE0 = 0x01,
EFFECT_3D_TYPE1 = 0x02, //这2个2选1 :如果都置上,优先用EFFECT_3D_TYPE1
EFFECT_3D_LRDRIFT = 0x04,
EFFECT_3D_ROTATE = 0X08, //这2个2选1 : 如果都置上,优先用EFFECT_3D_ROTATE
EFFECT_3D_TYPE2 = 0x10,
EFFECT_3D_LRDRIFT2 = 0x20
};
typedef struct SurEFECT_PARM_SET {
int effectflag; //下拉框:可选项上面的enum
int rotatestep; //范围0到1000,文本框填值
int damping; //0到4096,文本框填值
int feedback; //0到128,文本框填值
int roomsize; //0到128 ,文本框填值
af_DataType dataTypeobj;
} SurEFECT_PARM_SET;
typedef struct __SUR_FUNC_API_ {
unsigned int (*need_buf)(SurEFECT_PARM_SET *surparm);
unsigned int (*open)(unsigned int *ptr, int nch, SurEFECT_PARM_SET *surparm);
unsigned int (*init)(unsigned int *ptr, SurEFECT_PARM_SET *surparm);
unsigned int (*run)(unsigned int *ptr, short *inbuf, short *outbuf, int len); // len是输入数据的总长byte
} SUR_FUNC_API;
extern SUR_FUNC_API *get_sur_func_api();
#endif // reverb_api_h__
+211
View File
@@ -0,0 +1,211 @@
#ifndef __EFFECTS_ADJ__H
#define __EFFECTS_ADJ__H
#include "system/includes.h"
#include "config/config_interface.h"
#include "asm/crc16.h"
#include "fs/resfile.h"
#include "AudioEffect_DataType.h"
#include "media/framework/include/jlstream.h"
struct node_param {//单节点名称
char name[16];
};
struct eff_default_parm {
char name[16];
char cfg_index;//使用配置项的序号,指定默认配置项
char mode_index;//节点与多模式关联时,该变量用于获取相应模式下的节点参数,模式序号(如,蓝牙模式下,无多子模式,mode_index 是0
};
struct cfg_info {
u16 offset;
u16 size;
u16 uuid;
u8 subid;
};
#define indicator_check_points 4
#define indicator_read_points 40
struct indicator_upload_data {
u8 len;
u8 type;
u8 index;
u8 reserve;
float min;
float max;
int nbit;//16bit、32bit
int peak[indicator_read_points];
} __attribute__((packed));
// 配置文件格式
//文件头+节点配置头+节点数据区
struct node_file_head {
u16 version;
char reserved[14];
} __attribute__((packed));
#define EQ_NODE_CFG_TYPE 0x1//EQ节点配置
#define DRC_NODE_CFG_TYPE 0x2//DRC节点配置
#define FORM_NODE_CFG_TYPE 0x3//表单节点配置
#define PIPELINE_CFG_TYPE 0x4//参数组数据
#define UUID_MAP_CFG_TYPE 0x5//uuid映射表
#define DRC_ADVANCE_NODE_CFG_TYPE 0x6//drc advance 节点配置
struct node_cfg_format {
u8 type; //0x1 EQ配置 0x2 DRC配置 0x3 表单配置 0x4 参数组数据 0x5 uuid映射表
u16 uuid;
u8 subid;
u8 mode_index; //模式序号
u16 node_name_uuid; //节点名称的crc16
u16 config_name_uuid;//配置名称的crc16
u8 config_index; //配置序号
u32 offset; //参数偏移位置
u16 size; //参数大小
char reserved[16]; //保留位
} __attribute__((packed));
struct group_param {
u16 uuid; //流模块uuid
u8 num; //参数组个数
u8 reserve;
u8 data[0]; //参数组名称的uuid
} __attribute__((packed));
#define EFF_CONFIG_ID (0x21) //调音注册的cmd
#define REPLY_TO_TOOL (0) //应答工具使用的标识
#define EFF_ADJ_CMD (0x500)//调音命令
#define EFF_UPLOAD_CMD (0x501)//数据上报命令,用于发送数据给上位机
#define EFF_MODE_CMD (0x502)//模式切换命令,上位机发送当前模式序号给小机
#define EFF_INDICATOR_CMD (0x503)//指示器主动来获取数据
#define EFF_CRC_CMD (0x504)//stream.bin crc校验命令
#define EFF_FORM_CMD (0x506)//表单节点获取当前值命令
#define EFF_ONLINE_CMD (0x507)//检查需要在线调试的节点
#define EFF_NODE_MERGE_UPDATE BIT(0)
#define EFF_MANUAL_ADJ_NODE BIT(1)
enum {
ERR_NONE = 1, //处理成功,返回"OK"
ERR_COMM = 0, //通用错误,例如模块未打开,返回"ER"
ERR_ACCEPTABLE = -1, //可接受的错误,由case内部处理,返回内部数据
EFF_ERR_TYPE_PTR_NULL = -2,//模块打开失败,返回"ER_FLOW_OPEN_BUF"
EFF_ERR_TYPE_ALGORITHM_NULL = -3,//算法返回错误,返回"ER_FLOW_OPEN_ALGORITHM"
EFF_ERR_CRC = -4,//CRC校验失败
EFF_ERR_RUN = -5,//音效run失败
};
struct effects_online_adjust {
u16 uuid;
} __attribute__((packed));
//支持调音的节点,需使用该操作注册
#define REGISTER_ONLINE_ADJUST_TARGET(online) \
static struct effects_online_adjust online sec(.effects_online_adjust)
extern struct effects_online_adjust effects_online_adjust_begin[];
extern struct effects_online_adjust effects_online_adjust_end[];
#define list_for_online_adjust_target(p) \
for (p = effects_online_adjust_begin; p < effects_online_adjust_end; p++)
/*
*节点通过uuid 与name获取在线调试音效的参数
* */
int get_eff_online_param(u32 uuid, char *name, void *packet);
/*
*获取需要指定得默认配置
* */
int get_eff_default_param(int arg);
/*
*表单节点参数信息获取(获取目标参数存储地址,与大小)
*mode_index:参数组序号(模式序号)
*name:音效节点名字(节点内用户自定义)
*cfg_index:目标配置项(0,1,2....
*info:音效节点的配置项信息(存储的目标地址,配置项大小)
*return: 0 返回成功, 非0:返回失败
* */
int jlstream_read_form_node_info_base(char mode_index, const char *name, char cfg_index, struct cfg_info *info);
/*
*根据文件内偏移,获取目标配置参数
*return: 实际长度: 返回成功, 0:返回失败
* */
int jlstream_read_form_cfg_data(struct cfg_info *info, void *data);
/*
*表单节点参数获取
*mode_index:参数组序号(模式序号)
*name:音效节点名字(节点内用户自定义)
*cft_index:目标配置项(0,1,2....
*data:目标参数返回地址
*return: 实际长度: 返回成功, 0:返回失败
* */
int jlstream_read_form_data(char mode_index, const char *name, char cfg_index, void *data);
/*
*通过uuid与subid直接获取节点参数,节点内如有多份参数,需通过STREAM_EVENT_GET_NODE_PARM case内指定目标参数序号
*uuid:节点uuid
*subid:节点subid
*data:目标参数返回地址
*node_name:节点配置名称返回地址
*return: 实际长度: 返回成功, 0:返回失败
* */
int jlstream_read_node_data_new(u16 uuid, u8 subid, void *data, char *node_name);
/*
*通过uuid与subid、cfg_index直接获取节点参数
*uuid:节点uuid
*subid:节点subid
*cfg_index:节点内的配置序号
*data:目标参数返回地址
*node_name:节点配置名称返回地址
*return: 实际长度: 返回成功, 0:返回失败
* */
int jlstream_read_node_data_by_cfg_index(u16 uuid, u8 subid, char cfg_index, void *data, char *node_name);
/*
*通过uuid与subid直接获取节点info信息,节点内如有多份参数,需通过STREAM_EVENT_GET_NODE_PARM case内指定目标参数序号
*uuid:节点uuid
*subid:节点subid
*data:目标参数返回地址
*node_name:节点配置名称返回地址
*info:节点信息保存的地址
*return: 1:读取info信息成功,0:读取info信息失败
* */
int jlstream_read_node_info_data(u16 uuid, u8 subid, char *node_name, struct cfg_info *info);
/*
*节点info参数获取
*mode_index:参数组序号(模式序号)
*name:音效节点名字(节点内用户自定义)
*cft_index:目标配置项(0,1,2....
*return: 1:读取info信息成功,0:读取info信息失败
* */
int jlstream_read_info_data(char mode_index, const char *name, char cfg_index, struct cfg_info *info);
/*
*通过uuid获取参数组个数
*pipeline_uuid:流模块uuid
*group_param_num:返回参数组个数
*return 0:成功, 非0:失败
* */
int jlstream_read_pipeline_param_group_num(u16 pipeline_uuid, u8 *group_param_num);
/*
*通过uuid和name获取长度为len的在线调试参数param
* */
int jlstream_read_effects_online_param(u32 uuid, char *name, void *param, u16 len);
/*
*小机主动往上位机发数据接口
* */
void eff_node_send_packet(u32 id, u8 sq, u8 *packet, int size);
int jlstream_read_indicator_node_data(u16 uuid, u8 subid, u8 *param);
#endif/*__EFFECTS_ADJ__H*/
+119
View File
@@ -0,0 +1,119 @@
#ifndef _EQ_CONFIG_H_
#define _EQ_CONFIG_H_
#include "spinlock.h"
#include "math.h"
#include "effects/audio_eq.h"
#include "effects/effects_adj.h"
/*----------------------------------------------------------------------------*/
/**@brief 用默认eq系数表的eq效果模式设置(设置模式,更新系数)
@param mode:EQ_MODE_NORMAL, EQ_MODE_ROCK,EQ_MODE_POP,EQ_MODE_CLASSIC,EQ_MODE_JAZZ,EQ_MODE_COUNTRY, EQ_MODE_CUSTOM
@return
@note 外部使用
*/
/*----------------------------------------------------------------------------*/
int eq_mode_set(EQ_MODE mode);
/*----------------------------------------------------------------------------*/
/**@brief eq模式切换
@param
@return
@note 外部使用
*/
/*----------------------------------------------------------------------------*/
int eq_mode_sw(void);
/*----------------------------------------------------------------------------*/
/**@brief 设置custom系数表的某一段系数
@param seg->index:第几段(从0开始)
@param seg->iir_type:滤波器类型(EQ_IIR_TYPE_HIGH_PASS, EQ_IIR_TYPE_LOW_PASS, EQ_IIR_TYPE_BAND_PASS, EQ_IIR_TYPE_HIGH_SHELF,EQ_IIR_TYPE_LOW_SHELF)
@param seg->freq:中心截止频率(20~22kHz)
@param seg->gain:总增益(-18~18)
@param seg->q : q值(0.3~30
@return
@note 外部使用
*/
/*----------------------------------------------------------------------------*/
int eq_mode_set_custom_seg(struct eq_seg_info *seg);
/*----------------------------------------------------------------------------*/
/**@brief 获取custom系数表的增益、频率
@param index:哪一段
@param freq:中心截止频率
@param gain:增益
@return
@note 外部使用
*/
/*----------------------------------------------------------------------------*/
int eq_mode_set_custom_info(u16 index, int freq, float gain);
/*----------------------------------------------------------------------------*/
/**@brief 获取某eq系数表一段eq的增益
@param mode:哪个模式
@param index:哪一段
@return 增益
@note 外部使用
*/
/*----------------------------------------------------------------------------*/
s8 eq_mode_get_gain(EQ_MODE mode, u16 index);
/*----------------------------------------------------------------------------*/
/**@brief 获取某eq系数表一段eq的中心截止频率
@param mode:EQ_MODE_NORMAL, EQ_MODE_ROCK,EQ_MODE_POP,EQ_MODE_CLASSIC,EQ_MODE_JAZZ,EQ_MODE_COUNTRY, EQ_MODE_CUSTOM
@param index:哪一段
@return 中心截止频率
@note 外部使用
*/
/*----------------------------------------------------------------------------*/
int eq_mode_get_freq(EQ_MODE mode, u16 index);
/*----------------------------------------------------------------------------*/
/**@brief 设置用custom系数表一段eq的增益
@param index:哪一段
@param gain:增益
@return
@note 外部使用
*/
/*----------------------------------------------------------------------------*/
int eq_mode_set_custom_param(u16 index, int gain);
/*----------------------------------------------------------------------------*/
/**@brief 设置播歌用的eq系数表的总增益
@param global_gain:总增益
@return
@note
*/
/*----------------------------------------------------------------------------*/
void set_global_gain(EQ_MODE mode, float global_gain);
/*
*获取当前默认系数表地址
* */
int get_cur_eq_tab(float *global_gain, struct eq_seg_info **seg);
/*
*调用本接口,可切换到eq节点内指定的配置项
*name:eq节点定义的名字
*cfg_index:eq配置项的序号
* */
void eq_file_cfg_switch(char *name, char cfg_index);
// 使用过eq_file_cfg_switch接口时,本接口可获取musicEq的当前配置项序号
int get_cur_eq_num(char *tar_cfg_eq);
//返回某个eq效果模式标号
EQ_MODE eq_mode_get_cur(void);
/*
*mode:枚举型EQ_MODE
*return 返回对应系数表的段数
* */
u8 eq_get_table_nsection(EQ_MODE mode);
extern const int AUDIO_EQ_MAX_SECTION;
#endif
@@ -0,0 +1,72 @@
#ifndef _EQ_FUNC_DEFINE_H
#define _EQ_FUNC_DEFINE_H
#include "generic/typedef.h"
extern u32 EQ_PRIV_SECTION_NUM;
extern u32 EQ_SECTION_NUM;
extern const int const_eq_debug;
extern const int config_audio_drc_en;
extern const int config_audio_eq_en;
enum {
EQ_EN = BIT(0),//eq模式使能
EQ_SUPPORT_OLD_VER_EN = BIT(1),//ac700N,使能该bit可版本0.7.1.0 0.7.1.1
EQ_LITE_VER_EN = BIT(2),//精简版版本eq驱动,不支持异步,不支持默认效果切换接口,仅支持文件解析
EQ_ONLINE_EN = BIT(3), //在线调试模块使能
EQ_FILE_EN = BIT(4),//打开支持文件解析,关闭则只能使用默认效果表做eq
EQ_FILE_SWITCH_EN = BIT(5),//打开支持eq_cfg_hw.bin文件切换更新效果
EQ_HIGH_BASS_EN = BIT(6),//eq内部集成的高低音接口使能
EQ_HIGH_BASS_FADE_EN = BIT(7),//eq内部集成高低音淡入淡出效果方式使能,配合config_audio_eq_fade_step使用
EQ_FILTER_COEFF_FADE_EN = BIT(8),//eq默认系数表效果切换,或者在线调试效果更新,使用淡入淡出方式,避免增益跳跃引起的杂音问题
EQ_FILTER_COEFF_LIMITER_ZERO_EN = BIT(9),//
EQ_HW_UPDATE_COEFF_ONLY_EN = BIT(10),// 有空闲的段可以使用,就不需要切换系数 */
EQ_HW_LR_ALONE = BIT(11),//// 左右声道分开处理与bit(10),同时使能或关闭
EQ_SUPPORT_32BIT_SYNC_EN = BIT(12),//// 支持同步方式32biteq
EQ_SUPPORT_MULIT_CHANNEL_EN = BIT(13),//AC699N、AC700N eq是否支持多声道(3~8) 打开:支持 关闭:仅支持1~2声道
EQ_HW_CROSSOVER_TYPE0_EN = BIT(14),//支持硬件分频器,且分频器使用序列进序列出,需使能BIT(13)
EQ_HW_CROSSOVER_TYPE1_EN = BIT(15),//硬件分频器使用使用块出方式,会增加mem(该方式仅支持单声道处理)
EQ_LR_DIVIDE_EN = BIT(16),//eq左右声道效果拆分,四声道时可能会使用
EQ_ONLINE_FILE_SAVE = BIT(17),//eq在线调试保存到vm使能
EQ_DRC_PROCESS_SPLIT = BIT(18),//eq/drc节点处理,支持拆分
EQ_FADE_TACTICS_SEL = BIT(19),//eq系数淡入策略选择,使能时淡入策略耗时较长
};
#define config_audio_eq_online_en (config_audio_eq_en & EQ_ONLINE_EN)
#define config_audio_eq_file_en (config_audio_eq_en & EQ_FILE_EN)
#define config_audio_eq_file_sw_en (config_audio_eq_en & EQ_FILE_SWITCH_EN)
#define config_filter_coeff_fade_en (config_audio_eq_en & EQ_FILTER_COEFF_FADE_EN)
#define config_high_bass_en (config_audio_eq_en & EQ_HIGH_BASS_EN)
#define config_audio_eq_fade_en (config_audio_eq_en & EQ_HIGH_BASS_FADE_EN)
#define config_filter_coeff_limit_zero (config_audio_eq_en & EQ_FILTER_COEFF_LIMITER_ZERO_EN)
#define HW_EQ_UPDATE_COEFF_ONLY_EN (config_audio_eq_en & EQ_HW_UPDATE_COEFF_ONLY_EN)
#define HW_EQ_LR_ALONE (config_audio_eq_en & EQ_HW_LR_ALONE)
#define SUPPORT_32BIT_SYNC_EQ (config_audio_eq_en & EQ_SUPPORT_32BIT_SYNC_EN)
#define hw_eq_support_multi_channels (config_audio_eq_en & EQ_SUPPORT_MULIT_CHANNEL_EN)
#define hw_crossover_type0 (config_audio_eq_en & EQ_HW_CROSSOVER_TYPE0_EN)
#define hw_crossover_type1 (config_audio_eq_en & EQ_HW_CROSSOVER_TYPE1_EN)
#define config_eq_lite_en (config_audio_eq_en & EQ_LITE_VER_EN)
#define config_eq_support_old_ver_en (config_audio_eq_en & EQ_SUPPORT_OLD_VER_EN)
#define config_divide_en (config_audio_eq_en & EQ_LR_DIVIDE_EN)
#define config_eq_online_file_save (config_audio_eq_en & EQ_ONLINE_FILE_SAVE)
#define config_eq_drc_process_split (config_audio_eq_en & EQ_DRC_PROCESS_SPLIT)
#define config_eq_fade_tactics ((config_audio_eq_en & EQ_FADE_TACTICS_SEL))
extern const int config_audio_drc_en;
enum {
DRC_EN = BIT(0), //drc 使能
DRC_NBAND_MERGING_ASM_EN = BIT(1),//drc 多带处理完后,多带合并使用汇编加速
DRC_NBAND_DIS = BIT(2),//关闭drc多带
DRC_LIMITER_DIS = BIT(3),//关闭drc限幅器
DRC_COMPRESSOF_DIS = BIT(4),//关闭drc压缩器
WDRC_TYPE_EN = BIT(5),//wdrc使能
};
#define config_drc_limiter_en (!(config_audio_drc_en & DRC_LIMITER_DIS))
#define config_drc_compressor_en (!(config_audio_drc_en & DRC_COMPRESSOF_DIS))
#define config_drc_nband_en (!(config_audio_drc_en & DRC_NBAND_DIS))
#define config_drc_nband_merg_asm_en (!(config_audio_drc_en & DRC_NBAND_MERGING_ASM_EN))
#define config_wdrc_en (config_audio_drc_en & WDRC_TYPE_EN)
#endif
+56
View File
@@ -0,0 +1,56 @@
#ifndef _EXCITOR_H__
#define _EXCITOR_H__
#include "AudioEffect_DataType.h"
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned short
#endif
#ifndef s16
#define s16 short
#endif
#ifndef u32
#define u32 unsigned int
#endif
#ifndef s32
#define s32 int
#endif
#ifndef s16
#define s16 signed short
#endif
typedef struct _EXCITER_PARM_ {
unsigned int wet_highpass_freq;
unsigned int wet_lowpass_freq;
int wetgain; //0-100
int drygain;
int excitType;
af_DataType dataTypeobj;
} EXCITER_PARM;
typedef struct _EXCITER_FUNC_API_ {
u32(*need_buf)(EXCITER_PARM *vc_parm);
int (*open)(void *ptr, u32 sr, u32 nch, EXCITER_PARM *vc_parm); //中途改变参数,可以调init
void (*run)(void *ptr, short *indata, short *outdata, int PointsPerChannel); //len是 每声道多少点
void (*init)(void *ptr, EXCITER_PARM *vc_parm); //中途改变参数,可以调init
} EXCITE_FUNC_API;
extern EXCITE_FUNC_API *get_excitor_ops();
#endif // reverb_api_h__
@@ -0,0 +1,66 @@
#ifndef HOWLING_pitchshifer_api_h__
#define HOWLING_pitchshifer_api_h__
#include "AudioEffect_DataType.h"
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned short
#endif
#ifndef s16
#define s16 short
#endif
#ifndef u32
#define u32 unsigned int
#endif
#ifndef s32
#define s32 int
#endif
#ifndef s16
#define s16 signed short
#endif
/*#define EFFECT_OLD_RECORD 0x01
#define EFFECT_MOYIN 0x0*/
//#define EFFECT_ROBORT_FLAG 0X04
enum {
EFFECT_HOWLING_PS = 0x01, //1.5《=》12 ms
EFFECT_HOWLING_HE = 0x02,
EFFECT_HOWLING_FS = 0x04,
};
enum {
PLATFORM_BR30 = 0,
PLATFORM_BR36 = 1
};
typedef struct HOWLING_PITCHSHIFT_PARM_ {
s16 ps_parm;
s16 fe_parm;
u32 effect_v;
af_DataType dataTypeobj;
} HOWLING_PITCHSHIFT_PARM;
typedef struct _HOWLING_PITCHSHIFT_FUNC_API_ {
u32(*need_buf)(int flag);
int (*open)(void *ptr, u32 sr, HOWLING_PITCHSHIFT_PARM *pitchshift_obj); //中途改变参数,可以调init
void (*run)(void *ptr, short *indata, short *outdata, int len); //len是多少个点
} HOWLING_PITCHSHIFT_FUNC_API;
extern HOWLING_PITCHSHIFT_FUNC_API *get_howling_ps_func_api();
extern HOWLING_PITCHSHIFT_FUNC_API *get_howling_ps_func_api_mask();
#endif // reverb_api_h__
@@ -0,0 +1,45 @@
#ifndef _MULTI_CH_MIX_H
#define _MULTI_CH_MIX_H
struct mulit_mix_gain {
float gain0;
float gain1;
float gain2;
};
typedef struct _MULIT_MIX_TOOL_SET {
int is_bypass; // 1-> byass 0 -> no bypass
struct mulit_mix_gain gain;
} multi_mix_param_tool_set;
typedef struct _MixParam {
void *data; //每路数据
float gain; //增益
} MixParam;
void Mix16to16(MixParam *mix1, MixParam *mix2, MixParam *mix3, short *out, int channel, int way_num, int per_channel_npoint);
//功能:输入数据16bit mix ,输出数据16bit
//way_num 为2或者3 way_num = 2 取 mix1 mix2的数据,mix3无效
//out 数据输出 带16bit饱和
//per_channel_npoint 每个通道的样点数
void Mix32to32(MixParam *mix1, MixParam *mix2, MixParam *mix3, int *out, int channel, int way_num, int per_channel_npoint);
//功能: 输入数据32bit mix ,输出数据32bit
//way_num 为2或者3 way_num = 2 取 mix1 mix2的数据,mix3无效
//out 数据输出 不带16bit饱和
//per_channel_npoint 每个通道的样点数
void Mix32to16(MixParam *mix1, MixParam *mix2, MixParam *mix3, short *out, int channel, int way_num, int per_channel_npoint);
//功能: 输入数据32bit mix ,输出数据16bit
//way_num 为2或者3 way_num = 2 取 mix1 mix2的数据,mix3无效
//out 数据输出 带16bit饱和
//per_channel_npoint 每个通道的样点数
void Mix16to32(MixParam *mix1, MixParam *mix2, MixParam *mix3, int *out, int channel, int way_num, int per_channel_npoint);
//功能: 输入数据16bit mix ,输出数据32bit
//way_num 为2或者3 way_num = 2 取 mix1 mix2的数据,mix3无效
//out 数据输出 不带16bit饱和
//per_channel_npoint 每个通道的样点数
#endif
@@ -0,0 +1,45 @@
#ifndef NOISEGATE_API_H
#define NOISEGATE_API_H
#include "effects/AudioEffect_DataType.h"
#ifdef WIN32
#define AT_NOISEGATE(x)
#define AT_NOISEGATE_CODE
#define AT_NOISEGATE_CONST
#define AT_NOISEGATE_SPARSE_CODE
#define AT_NOISEGATE_SPARSE_CONST
#else
#define AT_NOISEGATE(x) __attribute__((section(#x)))
#define AT_NOISEGATE_CODE AT_NOISEGATE(.noisegate.text.cache.L2.code)
#define AT_NOISEGATE_CONST AT_NOISEGATE(.noisegate.text.cache.L2.const)
#define AT_NOISEGATE_SPARSE_CODE AT_NOISEGATE(.noisegate.text)
#define AT_NOISEGATE_SPARSE_CONST AT_NOISEGATE(.noisegate.text.const)
#endif
typedef struct _NoiseGateParam {
int attackTime;
int releaseTime;
int threshold;
int low_th_gain;
int sampleRate;
int channel;
af_DataType pcm_info;
} NoiseGateParam;
typedef struct _NoiseGate_update_Param {
int attackTime; //启动时间
int releaseTime; //释放时间
int threshold; //阈值mdb 例如-65.5db 例如传下来应是-65500
int low_th_gain; //低于阈值增益 放大30bit 例如(int)(0.1 * (1 << 30))
} noisegate_update_param;
int noiseGate_buf();
int noiseGate_init(void *workbuf, NoiseGateParam *param);
int noiseGate_update(void *work_buf, NoiseGateParam *param);
int noiseGate_run(void *work_buf, short *in_buf, short *out_buf, int per_channel_npoint);
#endif // NOISEGATE_API_H
@@ -0,0 +1,38 @@
#ifndef __NOTCH_HOWLING_API_H
#define __NOTCH_HOWLING_API_H
#include "effects/AudioEffect_DataType.h"
#ifdef WIN32
#define AT_NOTCHHOWLING(x)
#define AT_NOTCHHOWLING_CODE
#define AT_NOTCHHOWLING_CONST
#define AT_NOTCHHOWLING_SPARSE_CODE
#define AT_NOTCHHOWLING_SPARSE_CONST
#else
#define AT_NOTCHHOWLING(x) __attribute__((section(#x)))
#define AT_NOTCHHOWLING_CODE AT_NOTCHHOWLING(.notchhowling.text.cache.L2.code)
#define AT_NOTCHHOWLING_CONST AT_NOTCHHOWLING(.notchhowling.text.cache.L2.const)
#define AT_NOTCHHOWLING_SPARSE_CODE AT_NOTCHHOWLING(.notchhowling.text)
#define AT_NOTCHHOWLING_SPARSE_CONST AT_NOTCHHOWLING(.notchhowling.text.const)
#endif
typedef struct _NotchHowlingParam {
int fade_time;
float notch_gain;
float notch_Q;
float threshold;
int SampleRate;
af_DataType pcm_info;
} NotchHowlingParam;
int get_howling_buf(NotchHowlingParam *param);
int howling_init(void *workbuf, NotchHowlingParam *param);
int howling_run(void *workbuf, short *in, short *out, int len);
void SetHowlingDetection(void *workbuf, int OnlyDetection);
float *getHowlingFreq(void *workbuf, int *num);
#endif // !NOTCH_HOWLING_API_H
@@ -0,0 +1,92 @@
#ifndef pitchshifer_api_h__
#define pitchshifer_api_h__
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned short
#endif
#ifndef s16
#define s16 short
#endif
#ifndef u32
#define u32 unsigned int
#endif
#ifndef s32
#define s32 int
#endif
#ifndef s16
#define s16 signed short
#endif
/*#define EFFECT_OLD_RECORD 0x01
#define EFFECT_MOYIN 0x0*/
//#define EFFECT_ROBORT_FLAG 0X04
enum {
EFFECT_PITCH_SHIFT = 0x00,
EFFECT_VOICECHANGE_KIN0,
EFFECT_VOICECHANGE_KIN1,
EFFECT_VOICECHANGE_KIN2,
EFFECT_ROBORT,
EFFECT_AUTOTUNE = 0xfe,
EFFECT_FUNC_NULL = 0xff,
};
typedef struct PITCH_SHIFT_PARM_ {
u32 sr; //input audio samplerate
u32 shiftv; //pitch rate: <100(pitch up), >100(pitch down)
u32 effect_v;
u32 formant_shift;
} PITCH_SHIFT_PARM;
/******
效果配置说明:
1.EFFECT_PITCH_SHIFT 移频,变调不变速,init_parm.shiftv调节有效,init_parm.formant_shift调节无效
2.EFFECT_VOICECHANGE_KIN0 变声,可以调节不同的 init_parm.shiftv 跟 init_parm.formant_shift ,调出更多的声音效果
3.EFFECT_VOICECHANGE_KIN1 变声,同EFFECT_VOICECHANGE_KIN0类似的,但是2者由于运算的不同,会有区别。
4.EFFECT_ROBORT 机器音效果,类似 喜马拉雅那样的
5.EFFECT_AUTOTUNE 电音效果
*******/
typedef struct _PITCHSHIFTER_DSP_RUNFUNP_ {
int *buf;
int *inlen;
} PITCHSHIFTER_RUNFUNP;
#define C_MAJOR 8192 //c大调
#define Cshop_MAJOR 8875//升c大调
#define D_MAJOR 9557
#define Dshop_MAJOR 10240
#define E_MAJOR 10923
#define F_MAJOR 11605
#define Fshop_MAJOR 12288
#define G_MAJOR 12971
#define Gshop_MAJOR 13653
#define A_MAJOR 14336
#define Ashop_MAJOR 15019
#define B_MAJOR 15701
typedef struct _PITCHSHIFT_FUNC_API_ {
u32(*need_buf)(void *ptr, PITCH_SHIFT_PARM *pitchshift_obj);
void (*open)(void *ptr, PITCH_SHIFT_PARM *pitchshift_obj); //中途改变参数,可以调init
void (*run)(void *ptr, short *indata, short *outdata, int len); //len是多少个byte
void (*init)(void *ptr, PITCH_SHIFT_PARM *pitchshift_obj); //中途改变参数,可以调init
} PITCHSHIFT_FUNC_API;
extern PITCHSHIFT_FUNC_API *get_pitchshift_func_api();
#endif // reverb_api_h__
+84
View File
@@ -0,0 +1,84 @@
#ifndef ps_cal_api_h__
#define ps_cal_api_h__
#include "AudioEffect_DataType.h"
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned short
#endif
#ifndef s16
#define s16 short
#endif
#ifndef u32
#define u32 unsigned int
#endif
#ifndef s16
#define s16 signed short
#endif
enum {
PS69_SPEED_UP = 1,
PS69_SPEED_DOWN = 2
};
typedef struct _PS69_CONTEXT_CONF_ {
u16 speedV;
u16 pitchV;
af_DataType dataTypeobj;
} PS69_CONTEXT_CONF;
typedef struct _PS69_API_CONTEXT_ {
u32(*need_size)(PS69_CONTEXT_CONF *conf_obj);
u32(*open)(u8 *ptr, u32 chn, u32 sr, PS69_CONTEXT_CONF *conf_obj);
u32(*dconfig)(u8 *ptr, PS69_CONTEXT_CONF *conf_obj);
u32(*run)(u8 *ptr, s16 *inbuf, s16 *outdata, u32 len); // len is how many bytes
} PS69_API_CONTEXT;
#define ABS_LEN_FLAG 0x100
extern PS69_API_CONTEXT *get_ps_cal_api();
#endif // syn_ps_api_h__
#if 0
{
PS69_API_CONTEXT *testops = get_ps_cal_api();
PS69_CONTEXT_CONF test_config_obj;
test_config_obj.pitchV = 32768;
test_config_obj.sr = 44100;
test_config_obj.chn = 2;
test_config_obj.speedV = 80;
bufsize = syn_ops->need_size();
ptr = malloc(bufsize);
testops->open(ptr, &testIO);
testops->dconfig(ptr, &test_config_obj);
while (1) {
if (feof(fp1)) {
break;
}
fread(test_buf, 1, TEST_LEN, fp1);
testops->run(ptr, test_buf, TEST_LEN, out_buf); //返回的是输出了多少个byte,放在out_buf里面。注意变速输出可能比输入多的,跟变速参数相关
}
free(ptr);
}
#endif
+37
View File
@@ -0,0 +1,37 @@
#ifndef reverb_api_h__
#define reverb_api_h__
#include "AudioEffect_DataType.h"
typedef struct _Plate_reverb_parm_ {
int wet; //0-300%
int dry; //0-200%
int pre_delay; //0-40ms
int highcutoff; //0-20k 高频截止
int diffusion; //0-100%
int decayfactor; //0-100%
int highfrequencydamping; //0-100%
int modulate; // 0或1
int roomsize; //20%-100%
af_DataType dataTypeobj;
} Plate_reverb_parm;
typedef struct _EF_REVERB0_FIX_PARM {
unsigned int sr;
unsigned int nch;//输入通道数
} EF_REVERB0_FIX_PARM;
typedef struct __PLATE_REVERB_FUNC_API_ {
unsigned int (*need_buf)(Plate_reverb_parm *preverb_parm);
int (*open)(unsigned int *ptr, Plate_reverb_parm *preverb_parm, EF_REVERB0_FIX_PARM *echo_fix_parm);
int (*init)(unsigned int *ptr, Plate_reverb_parm *preverb_parm);
int (*run)(unsigned int *ptr, short *inbuf, short *outdata, int len);
} PLATE_REVERB0_FUNC_API;
extern PLATE_REVERB0_FUNC_API *get_plate_reverb_func_api();
extern PLATE_REVERB0_FUNC_API *get_plate_reverb_func_api_mask();
extern PLATE_REVERB0_FUNC_API *get_plate_reverb_adv_func_api();
extern PLATE_REVERB0_FUNC_API *get_plate_reverb_adv24_16_func_api(); //24bit的时候,湿声精度只有16bit的 buf比实际24bit少
#endif // reverb_api_h__
@@ -0,0 +1,38 @@
#ifndef SPECTRUMSHOW_API_H
#define SPECTRUMSHOW_API_H
#include "effects/AudioEffect_DataType.h"
#ifdef WIN32
#define AT_SPECTRUMSHOW(x)
#define AT_SPECTRUMSHOW_CODE
#define AT_SPECTRUMSHOW_CONST
#define AT_SPECTRUMSHOW_SPARSE_CODE
#define AT_SPECTRUMSHOW_SPARSE_CONST
#else
#define AT_SPECTRUMSHOW(x) __attribute__((section(#x)))
#define AT_SPECTRUMSHOW_CODE AT_SPECTRUMSHOW(.specshow.text.cache.L1)
#define AT_SPECTRUMSHOW_CONST AT_SPECTRUMSHOW(.specshow.text.cache.L2.const)
#define AT_SPECTRUMSHOW_SPARSE_CODE AT_SPECTRUMSHOW(.specshow.text)
#define AT_SPECTRUMSHOW_SPARSE_CONST AT_SPECTRUMSHOW(.specshow.text.const)
#endif
typedef struct _SpectrumShowParam {
float attackFactor;//下降因子[0,1)
float releaseFactor;//上升因子[0,1) */
int SampleRate;
int channel;
int mode;//模式,双声道起作用,0 计算的是第一声道的频谱值,//1计算的是第二声道频谱值,2为第一声道与第二声道相加除2的频谱值
af_DataType pcm_info;
} SpectrumShowParam;
int getSpectrumShowBuf();
int SpectrumShowInit(void *workBuf, SpectrumShowParam *param);
int SpectrumShowRun(void *workBuf, short *in, int len);
int getSpectrumNum(void *workBuf);
float *getCentreFreq(void *workBuf);
short *getSpectrumValue(void *workBuf);
#endif // !SPECTRUMSHOW_API_H
@@ -0,0 +1,110 @@
#ifndef SPECTRUM_FFT_API_H
#define SPECTRUM_FFT_API_H
#include "effects/spectrum/SpectrumShow_api.h"
#include "media/audio_stream.h"
typedef struct _spectrumEffect_TOOL_SET {
int mode;
float attackFactor;
float releaseFactor;
} spectrum_effect_param_tool_set;
struct spectrum_parm {
u16 db_num;//频点个数
s16 *db_data;//频点相对的能量值
float *center_freq;//频点相对应的中心截止频率
};
//该模块 mips 消耗5M
//RAM 单声道时:4.4Kbyte
//RAM 双声道时:5.4Kbyte
typedef struct _spectrum_fft_open_parm {
SpectrumShowParam param;
} spectrum_fft_open_parm;
typedef struct _spectrum_fft_hdl {
void *work_buf;
u32 run_en: 1;
s16 *out_buf;
u32 out_buf_size;
u32 offset;
spectrum_fft_open_parm parm;
u8 quad;
u8 update;
} spectrum_fft_hdl;
/*----------------------------------------------------------------------------*/
/**@brief 打开
@param *_parm: 始化参数,详见结构体spectrum_fft_open_parm
@return 句柄
@note
*/
/*----------------------------------------------------------------------------*/
spectrum_fft_hdl *audio_spectrum_fft_open(spectrum_fft_open_parm *parm);
/*----------------------------------------------------------------------------*/
/**@brief audio_spectrum_fft_close 关闭处理
@param _hdl:句柄
@return 0:成功 -1:失败
@note
*/
/*----------------------------------------------------------------------------*/
int audio_spectrum_fft_close(spectrum_fft_hdl *hdl);
/*----------------------------------------------------------------------------*/
/**@brief audio_spectrum_fft_run 同步处理,每次run都会把输入buf消耗完,才会往下走
@param _hdl:句柄
@param data:输入数据
@param len:输入数据长度
@return len
@note 频谱计算处理,只获取输入的数据,不改变输入的数据
*/
/*----------------------------------------------------------------------------*/
int audio_spectrum_fft_run(spectrum_fft_hdl *hdl, s16 *data, int len);
/*----------------------------------------------------------------------------*/
/**@brief audio_spectrum_fft_switch 运行过程做开关处理
@param hdl:句柄
@param en:0 关闭频响运算 1 打开频响运算 (通话模式,不支持频谱计算.通话模式已经使用fft, 需关闭频谱计算)
@return
@note
*/
/*----------------------------------------------------------------------------*/
void audio_spectrum_fft_switch(spectrum_fft_hdl *hdl, u8 en);
/*
* 频谱计算参数更新
*/
void audio_spectrum_update_parm(spectrum_fft_hdl *hdl, spectrum_effect_param_tool_set *parm);
/*----------------------------------------------------------------------------*/
/**@brief audio_spectrum_fft_get_num 获取频谱个数
@param _hdl:句柄
@return 返回频谱的个数
@note
*/
/*----------------------------------------------------------------------------*/
int audio_spectrum_fft_get_num(spectrum_fft_hdl *hdl);
/*----------------------------------------------------------------------------*/
/**@brief audio_spectrum_fft_get_val 获取频谱值
@param _hdl:句柄
@return 返回存储频谱值的地址
@note
*/
/*----------------------------------------------------------------------------*/
short *audio_spectrum_fft_get_val(spectrum_fft_hdl *hdl);
/*
*获取频点对应的中心截止频率
* */
float *audio_spectrum_get_centerfreq(spectrum_fft_hdl *hdl);
#endif
@@ -0,0 +1,23 @@
#ifndef _STEREO_WINDEN_API_H_
#define _STEREO_WINDEN_API_H_
#include "AudioEffect_DataType.h"
typedef struct _stewiden_parm_context_ {
int widenval; //Widen: 0 to 100
int intensity; //EhanceStere 0 to 100
af_DataType dataTypeobj;
} stewiden_parm_context;
typedef struct __STE_WIDEN_FUNC_API_ {
unsigned int (*need_buf)(stewiden_parm_context *parm);
unsigned int (*open)(unsigned int *ptr, int sr, int nch, stewiden_parm_context *parm);
unsigned int (*init)(unsigned int *ptr, stewiden_parm_context *parm);
unsigned int (*run)(unsigned int *ptr, short *inbuf, short *outbuf, int len); // len是datapontsPerChannel
} STE_WIDEN_FUNC_API;
extern STE_WIDEN_FUNC_API *get_stewiden_func_api();
#endif
@@ -0,0 +1,116 @@
#ifndef pitchshifer_api_h__
#define pitchshifer_api_h__
#include "AudioEffect_DataType.h"
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned short
#endif
#ifndef s16
#define s16 short
#endif
#ifndef u32
#define u32 unsigned int
#endif
#ifndef s32
#define s32 int
#endif
#ifndef s16
#define s16 signed short
#endif
/*#define EFFECT_OLD_RECORD 0x01
#define EFFECT_MOYIN 0x0*/
//#define EFFECT_ROBORT_FLAG 0X04
enum {
EFFECT_VOICECHANGE_PITCHSHIFT = 0x00,
EFFECT_VOICECHANGE_CARTOON = 0x01,
EFFECT_VOICECHANGE_SPECTRUM = 0x02,
EFFECT_VOICECHANGE_ROBORT = 0x03,
EFFECT_VOICECHANGE_MELODY = 0x04,
EFFECT_VOICECHANGE_WHISPER = 0x05,
EFFECT_VOICECHANGE_F0_DOMAIN = 0x06,
EFFECT_VOICECHANGE_F0_TD = 0x07,
EFFECT_VOICECHANGE_FEEDBACK = 0x08,
EFFECT_VOICECHANGE_NULL = 0xff,
};
enum {
MODE_C_MAJOR = 0x0,
MODE_Csharp_MAJOR,
MODE_D_MAJOR,
MODE_Dsharp_MAJOR,
MODE_E_MAJOR,
MODE_F_MAJOR,
MODE_Fsharp_MAJOR,
MODE_G_MAJOR,
MODE_Gsharp_MAJOR,
MODE_A_MAJOR,
MODE_Asharp_MAJOR,
MODE_B_MAJOR,
MODE_KEY // 按12个key来趋近,不确定用的是哪个调式的时候配这个,工具默认值用这个
};
enum {
PLATFORM_VOICECHANGE_CORDIC = 0,
PLATFORM_VOICECHANGE_CORDICV2 = 1
};
enum {
FFT_V3 = 3, //br23/br25__br30/br34/br36__WL80.
FFT_EXT = 4, //br27/br28__WL82. 扩展模式.FFT硬件模块支持非2的指数次幂点数.
};
enum {
PLATFORM_VOICECHANGE_FFT = 0,
PLATFORM_VOICECHANGE_FFTV2 = 1
};
typedef struct _VOICECHANGER_PARM {
u32 effect_v; //
u32 shiftv; //pitch rate: 40-250
u32 formant_shift; // 40-250
af_DataType dataTypeobj;
} VOICECHANGER_PARM;
typedef struct _AUTOTUNE_PARM {
u32 mode; //调式
u32 speedv; //2到100
af_DataType dataTypeobj;
} AUTOTUNE_PARM;
typedef struct _AUTOTUNE_FUNC_API_ {
u32(*need_buf)(void *ptr, AUTOTUNE_PARM *vc_parm);
int (*open)(void *ptr, u32 sr, AUTOTUNE_PARM *vc_parm); //中途改变参数,可以调init
void (*run)(void *ptr, short *indata, short *outdata, int len); //len是多少点数
void (*init)(void *ptr, AUTOTUNE_PARM *vc_parm); //中途改变参数,可以调init
} AUTOTUNE_FUNC_API;
typedef struct _VOICECHANGER_FUNC_API_ {
u32(*need_buf)(void *ptr, VOICECHANGER_PARM *vc_parm);
int (*open)(void *ptr, u32 sr, VOICECHANGER_PARM *vc_parm); //中途改变参数,可以调init
void (*run)(void *ptr, short *indata, short *outdata, int len); //len是多少个点数
void (*init)(void *ptr, VOICECHANGER_PARM *vc_parm); //中途改变参数,可以调init
} VOICECHANGER_FUNC_API;
extern VOICECHANGER_FUNC_API *get_voiceChanger_func_api();
extern VOICECHANGER_FUNC_API *get_voiceChanger_adv_func_api();
extern AUTOTUNE_FUNC_API *get_autotune_func_api();
#endif // reverb_api_h__
+71
View File
@@ -0,0 +1,71 @@
#ifndef FILE_DECODER_H
#define FILE_DECODER_H
#include "media/includes.h"
enum {
FILE_DEC_STATUS_STOP = 0, // 解码停止
FILE_DEC_STATUS_PLAY, // 正在解码
FILE_DEC_STATUS_PAUSE, // 解码暂停
FILE_DEC_STATUS_WAIT_PAUSE,
FILE_DEC_STATUS_WAIT_PLAY,
FILE_DEC_STATUS_PAUSE_SUCCESS,
};
struct file_decoder {
u8 ch_num; // 声道数
u8 output_ch_num; // 输出声道数
u8 status; // 解码状态
u8 dec_no_out_sound; // 解码不直接输出声音(用于TWS转发)
u8 tmp_pause; // 被其他解码打断,临时暂停
u32 wait_pause;
u8 remain;
u16 resume_tmr_id;
u16 sample_rate;
u32 coding_type;
u32 dec_total_time; // 总共能播放多长时间
u32 dec_cur_time; // 当前播放时间
u32 once_out_cnt; // 解码一次的输出统计
enum audio_channel ch_type; // 输出类型
struct audio_decoder decoder; // 解码句柄
int (*output_handler)(struct file_decoder *dec, s16 *data, int len);
void *tws_sync;
s16 fade_step;
s16 fade_value;
};
int file_decoder_open(struct file_decoder *dec,
const struct audio_dec_input *input,
struct audio_decoder_task *decode_task,
struct audio_dec_breakpoint *bp,
u8 pick);
int frame_decoder_open(struct file_decoder *dec,
const struct audio_dec_input *input,
struct audio_decoder_task *decode_task);
void file_decoder_close(struct file_decoder *dec);
void file_decoder_set_output_channel(struct file_decoder *dec);
void file_decoder_set_event_handler(struct file_decoder *dec,
void (*handler)(struct audio_decoder *, int, int *), u32 maigc);
bool file_decoder_is_stop(struct file_decoder *file_dec);
bool file_decoder_is_play(struct file_decoder *file_dec);
bool file_decoder_is_pause(struct file_decoder *file_dec);
int file_decoder_pp(struct file_decoder *file_dec);
int file_decoder_FF(struct file_decoder *file_dec, int step);
int file_decoder_FR(struct file_decoder *file_dec, int step);
int file_decoder_get_breakpoint(struct file_decoder *file_dec, struct audio_dec_breakpoint *bp);
int file_decoder_get_total_time(struct file_decoder *file_dec);
int file_decoder_get_cur_time(struct file_decoder *file_dec);
int file_decoder_get_decoder_type(struct file_decoder *file_dec);
void file_decoder_set_tws_sync_enable(struct file_decoder *dec, void *sync);
void file_decoder_mark_tws_sync_data(struct file_decoder *dec, u16 seqn);
void file_decoder_tws_sync_restart(struct file_decoder *dec);
#endif /*FILE_DECODER_H*/
@@ -0,0 +1,103 @@
#ifndef DECODER_NODE_MGR_H
#define DECODER_NODE_MGR_H
#include "jlstream.h"
#include "media/audio_base.h"
#include "media/audio_splicing.h"
#include "system/task.h"
#include "effects/effects_adj.h"
struct decoder_hdl;
struct decoder_file_ops {
void *file;
int (*fread)(void *file, u8 *buf, int len);
int (*fseek)(void *file, u32 fpos);
};
struct decoder_get_fmt {
struct decoder_file_ops fops;
struct stream_fmt *fmt;
};
struct decoder_plug_ops {
int coding_type;
void *(*init)(struct decoder_hdl *dec_hdl);
int (*run)(void *);
int (*ioctl)(void *, int, int);
void (*release)(void *);
};
struct convert_bit_wide {
u8 *buf;//解码器位宽转换buf
u16 len;
u16 offset;
};
struct decoder_flow_ctrl {
u16 max_sleep;
u16 frame_min_len;
u16 frame_max_len;
struct list_head frames;
struct stream_frame *frame;
};
struct decoder_dec_task {
u8 frame_cnt;
struct stream_thread *wakup_thread;
OS_SEM dec_sem;
const char *task_name;
struct list_head file_frames;
};
struct decoder_hdl {
struct stream_node *node;
void *decoder;
int (*run)(void *);
enum stream_scene scene;
u8 start;
u8 output_frame_cnt;
u8 timestamp_flag;
u8 frame_time;
u8 pause;
u8 dec_end;
u8 no_data;
u8 stop_dec;
u8 channel_mode;
u8 decoder_out_bit_wide;//0:16bit, 1:24bit 解码器实际输出位宽,如与decoder_node的oport_data_wide不一致时,decoder_node需做位宽转换
u16 coding_type;
u32 cur_time;
u32 timestamp;
u32 file_len; //解码文件的长度
u32 fpos;
struct decoder_file_ops fops;
OS_MUTEX mutex;
OS_MUTEX file_mutex;
OS_SEM file_sem;
struct jlstream_fade fade;
struct audio_dec_breakpoint *breakpoint;
struct decoder_flow_ctrl *flow_ctrl;
struct decoder_dec_task *task;
const struct decoder_plug_ops *plug;
struct node_port_data_wide data_wide;
struct convert_bit_wide convert;
};
#define REGISTER_DECODER_PLUG(plug) \
const struct decoder_plug_ops plug sec(.decoder_plug)
int decoder_plug_output_data(void *_hdl, u8 *data, u16 len, u8 channel_mode, void *priv);
int decoder_plug_read_data(void *_hdl, u32 fpos, u8 *data, u16 len);
int decoder_plug_get_data_len(void *_hdl);
struct stream_frame *decoder_plug_pull_frame(void *_hdl);
void decoder_plug_free_frame(void *_hdl, struct stream_frame *frame);
#endif
@@ -0,0 +1,64 @@
#ifndef ENCODER_NODE_MGR_H
#define ENCODER_NODE_MGR_H
#include "jlstream.h"
#include "media/audio_base.h"
struct encoder_plug_ops {
int coding_type;
void *(*init)(void *priv);
int (*run)(void *);
int (*ioctl)(void *, int, int);
void (*release)(void *);
};
struct encoder_fmt {
u8 quality;
u8 complexity;
u8 sw_hw_option;
u8 ch_num;
u8 format;
u8 bit_width;
u16 frame_dms;
u32 bit_rate;
u32 sample_rate;
};
enum change_file_step {
SEAMLESS_OPEN_FILE,
SEAMLESS_CHANGE_FILE,
};
/*
* 无缝录音配置, 支持配置录制多长时间(秒)后切换文件
* advance_time: 提前多少秒调用change_file(priv, SEAMLESS_OPEN_FILE), 用于提前创建新文件
* time: 单个文件录音时长(秒)
*/
struct seamless_recording {
u8 advance_time;
u16 time;
void *priv;
/*
* 此回调函数在音频流任务中调用,不能执行耗时长的操作,否则可能导致音频播放卡顿
*/
int (*change_file)(void *priv, enum change_file_step step);
};
#define REGISTER_ENCODER_PLUG(plug) \
const struct encoder_plug_ops plug sec(.encoder_plug)
int encoder_plug_output_data(void *_hdl, u8 *data, u16 len);
int encoder_plug_read_data(void *_hdl, u8 *data, u16 len);
struct stream_frame *encoder_plug_pull_frame(void *_hdl);
struct stream_frame *encoder_plug_get_output_frame(void *_hdl, u16);
void encoder_plug_put_output_frame(void *_hdl, struct stream_frame *);
void encoder_plug_free_frame(void *_hdl, struct stream_frame *);
#endif
@@ -0,0 +1,13 @@
#ifndef JLDEMUXER_H
#define JLDEMUXER_H
#include "jlstream.h"
int jldemuxer_get_tone_file_fmt(struct stream_file_info *info, struct stream_fmt *fmt);
int jldemuxer_file_coding_type_filter(u8 *data, int len, int types[]);
#endif
@@ -0,0 +1,734 @@
#ifndef JLSTREAM_H
#define JLSTREAM_H
#include "generic/typedef.h"
#include "generic/list.h"
#include "node_uuid.h"
#include "media/audio_base.h"
#include "media/audio_def.h"
#include "media/media_config.h"
#include "system/task.h"
#include "system/spinlock.h"
#include "fs/resfile.h"
#define __STREAM_CACHE_CODE __attribute__((section(".stream.text.cache.L2")))
#define STREAM_NODE_RUN_TIMER_DEBUG_EN 0
typedef void *jlstream_breaker_t;
struct stream_oport;
struct stream_node;
struct stream_snode;
struct stream_note;
struct jlstream;
#ifndef SEEK_SET
#define SEEK_SET 0 /* Seek from beginning of file. */
#define SEEK_CUR 1 /* Seek from current position. */
#define SEEK_END 2 /* Seek from end of file. */
#endif
#define NODE_IOC_OPEN_IPORT 0x00010000
#define NODE_IOC_CLOSE_IPORT 0x00010001
#define NODE_IOC_OPEN_OPORT 0x00010002
#define NODE_IOC_CLOSE_OPORT 0x00010003
#define NODE_IOC_SET_FILE 0x00020000
#define NODE_IOC_OPEN_FILE 0x00020001
#define NODE_IOC_GET_FMT 0x00020002
#define NODE_IOC_SET_FMT 0x00020003
#define NODE_IOC_CLR_FMT 0x00020004
#define NODE_IOC_GET_DELAY 0x00020005 // 获取缓存数据的延时
#define NODE_IOC_SET_SCENE 0x00020006 // 设置数据流的场景
#define NODE_IOC_SET_CHANNEL 0x00020007
#define NODE_IOC_NEGOTIATE 0x00020008 // 各个节点参数协商
#define NODE_IOC_FLUSH_OUT 0x00020009
#define NODE_IOC_SET_TIME_STAMP 0x0002000a
#define NODE_IOC_SYNCTS 0x0002000b
#define NODE_IOC_NODE_CONFIG 0x0002000c
#define NODE_IOC_SET_PRIV_FMT 0x0002000d //设置节点私有参数
#define NODE_IOC_NAME_MATCH 0x0002000e
#define NODE_IOC_SET_PARAM 0x0002000f
#define NODE_IOC_GET_PARAM 0x00020010
#define NODE_IOC_DECODER_PP 0x00020011 //解码暂停再重开
#define NODE_IOC_DECODER_FF 0x00020012 //快进
#define NODE_IOC_DECODER_FR 0x00020013 //快退
#define NODE_IOC_DECODER_REPEAT 0x00020014 //无缝循环播放
#define NODE_IOC_DECODER_DEST_PLAY 0x00020015 //跳到指定位置播放
#define NODE_IOC_GET_CUR_TIME 0x00020016 //获取音乐播放当前时间
#define NODE_IOC_GET_TOTAL_TIME 0x00020017 //获取音乐播放总时间
#define NODE_IOC_GET_BP 0x00020018 //获取解码断点信息
#define NODE_IOC_SET_BP 0x00020019 //设置解码断点信息
#define NODE_IOC_SET_FILE_LEN 0x0002001a //设置解码文件长度信息
#define NODE_IOC_SET_BP_A 0x0002001b //设置复读A点
#define NODE_IOC_SET_BP_B 0x0002001c //设置复读B点
#define NODE_IOC_SET_AB_REPEAT 0x0002001d //设置AB点复读模式
#define NODE_IOC_GET_ODEV_CACHE 0x0002001e //获取输出设备的缓存采样数
#define NODE_IOC_SET_BTADDR 0x0002001f
#define NODE_IOC_SET_ENC_FMT 0x00020020
#define NODE_IOC_GET_ENC_FMT 0x00020021
#define NODE_IOC_GET_HEAD_INFO 0x00020022 //获取编码的头文件信息
#define NODE_IOC_SET_TASK 0x00020023
#define NODE_IOC_FSEEK 0x00020024
#define NODE_IOC_SET_BIT_WIDE 0x00020025
#define NODE_IOC_FLOW_CTRL_ENABLE 0x00020026
#define NODE_IOC_GET_BTADDR 0x00020027
#define NODE_IOC_GET_FRAME_SIZE 0x00020028
#define NODE_IOC_SET_FRAME_SIZE 0x00020029
#define NODE_IOC_SET_TS_PARM 0x0002002a
#define NODE_IOC_SET_SLEEP 0x0002002b
#define NODE_IOC_SET_SEAMLESS 0x0002002c
#define NODE_IOC_ENC_RESET 0x0002002d
#define NODE_IOC_FORCE_DUMP_PACKET 0x0002002e
#define NODE_IOC_GET_MIXER_INFO 0x0002002f
#define NODE_IOC_TWS_TX_SWITCH 0x00020030
#define NODE_IOC_GET_ID3 0x00020031
#define NODE_IOC_GET_ENC_TIME 0x00020032 //获取编码时间
#define NODE_IOC_SET_SYNC_NETWORK 0x0002003b
#define NODE_IOC_GET_PRIV_FMT 0x0002003c
#define NODE_IOC_START (0x00040000 | NODE_STA_RUN)
#define NODE_IOC_PAUSE (0x00040000 | NODE_STA_PAUSE)
#define NODE_IOC_STOP (0x00040000 | NODE_STA_STOP)
#define NODE_IOC_SUSPEND (0x00040000 | NODE_STA_SUSPEND)
#define TIMESTAMP_US_DENOMINATOR 32
enum stream_event {
STREAM_EVENT_NONE,
STREAM_EVENT_INIT,
STREAM_EVENT_LOAD_DECODER,
STREAM_EVENT_LOAD_ENCODER,
STREAM_EVENT_UNLOAD_DECODER,
STREAM_EVENT_UNLOAD_ENCODER,
STREAM_EVENT_SUSPEND,
STREAM_EVENT_READY,
STREAM_EVENT_START,
STREAM_EVENT_PAUSE,
STREAM_EVENT_STOP,
STREAM_EVENT_CLOSE_PLAYER,
STREAM_EVENT_CLOSE_RECODER,
STREAM_EVENT_PREEMPTED,
STREAM_EVENT_NEGOTIATE_FAILD,
STREAM_EVENT_GET_PIPELINE_UUID,
STREAM_EVENT_GET_COEXIST_POLICY,
STREAM_EVENT_INC_SYS_CLOCK,
STREAM_EVENT_GET_NODE_PARM,
STREAM_EVENT_GET_EFF_ONLINE_PARM,
STREAM_EVENT_A2DP_ENERGY,
STREAM_EVENT_GET_SWITCH_CALLBACK,
STREAM_EVENT_GET_CVP_MODE,
};
enum stream_scene : u8 {
STREAM_SCENE_A2DP,
STREAM_SCENE_ESCO,
STREAM_SCENE_TWS_MUSIC, // TWS转发本地音频文件
STREAM_SCENE_AI_VOICE,
STREAM_SCENE_LINEIN, //linein 模式
STREAM_SCENE_FM, //FM 模式
STREAM_SCENE_TDM, //TDM 模式
STREAM_SCENE_MUSIC, //本地音乐
STREAM_SCENE_RECODER, //录音
STREAM_SCENE_SPDIF,
STREAM_SCENE_PC_SPK,
STREAM_SCENE_PC_MIC,
STREAM_SCENE_IIS,
STREAM_SCENE_MUTI_CH_IIS,
STREAM_SCENE_MIC, //mic 模式
STREAM_SCENE_MIC_EFFECT,
STREAM_SCENE_MIC_EFFECT2,
STREAM_SCENE_HEARING_AID,
STREAM_SCENE_DEV_FLOW,
STREAM_SCENE_LE_AUDIO,//LE Audio Media
STREAM_SCENE_LEA_CALL,//LE Audio CALL
STREAM_SCENE_ADDA_LOOP,
STREAM_SCENE_OPUS,
STREAM_SCENE_WIRELESS_MIC, //16 wireless mic
STREAM_SCENE_LOCAL_TWS,
STREAM_SCENE_MIDI, //MIDI 琴解码
STREAM_SCENE_LOUDSPEAKER_IIS, //扩音器IIS
STREAM_SCENE_LOUDSPEAKER_MIC, //扩音器MIC
//最大32个场景,如果大于32个场景,需要把tone、ring、ket_tone场景号往后挪
STREAM_SCENE_TONE = 0x20,
STREAM_SCENE_RING = 0x60,
STREAM_SCENE_KEY_TONE = 0xa0,
STREAM_SCENE_NONE = 0xff,
};
enum stream_coexist : u8 {
STREAM_COEXIST_AUTO,
STREAM_COEXIST_DISABLE,
};
enum stream_state : u8 {
STREAM_STA_INIT,
STREAM_STA_NEGOTIATE,
STREAM_STA_READY,
STREAM_STA_START,
STREAM_STA_STOP,
STREAM_STA_PLAY,
STREAM_STA_PAUSE = 0x10,
STREAM_STA_PREEMPTED = 0x20,
STREAM_STA_SUSPEND = 0x30,
};
enum stream_node_state : u16 {
NODE_STA_RUN = 0x0001,
NODE_STA_PAUSE = 0x0002,
NODE_STA_SUSPEND = 0x0004,
NODE_STA_STOP = 0x0008,
NODE_STA_PEND = 0x0010,
NODE_STA_DEC_NO_DATA = 0x0020,
NODE_STA_DEC_END = 0x0040,
NODE_STA_DEC_PAUSE = 0x0080,
NODE_STA_DEC_ERR = 0x00c0,
NODE_STA_SOURCE_NO_DATA = 0x0100,
NODE_STA_DEV_ERR = 0x0200,
NODE_STA_ENC_END = 0x0400,
NODE_STA_OUTPUT_TO_FAST = 0x0800, //解码输出太多主动挂起
NODE_STA_OUTPUT_BLOCKED = 0x1000, //终端节点缓存满,数据写不进去
NODE_STA_OUTPUT_SPLIT = 0x2000,
};
enum stream_node_type : u8 {
NODE_TYPE_SYNC = 0x01,
NODE_TYPE_BYPASS = 0x03,
NODE_TYPE_FLOW_CTRL = 0x04,
NODE_TYPE_ASYNC = 0x10,
NODE_TYPE_IRQ = 0x20,
NODE_TYPE_SWITCH = 0x40,
};
enum negotiation_state : u8 {
NEGO_STA_CONTINUE = 0x01,
NEGO_STA_ACCPTED = 0x02,
NEGO_STA_SUSPEND = 0x04,
NEGO_STA_DELAY = 0x08,
NEGO_STA_ABORT = 0x10,
NEGO_STA_SAMPLE_RATE_LOCK = 0x20,
};
enum pcm_24bit_data_type : u8 {
PCM_24BIT_DATA_4BYTE = 0,
PCM_24BIT_DATA_3BYTE,
};
struct stream_fmt {
u8 Qval;
u8 bit_wide; //数据流中数据的位宽。
u8 dec_bit_wide; //解码需要配置的位宽。
u8 pcm_24bit_type; //用于判断3byte_24bit数据或4byte_24bit数据
u8 channel_mode;
u8 chconfig_id; //声道Id, LDAC解码需要配置的参数,通过这个解析出声道类型。
u16 frame_dms; //帧长时间,单位 deci-ms (ms/10)
u16 codec_version; //数据编码类型的版本,同一种coding_type,可能存在不同的版本,LHDC 解码需要配置的参数。
u32 bit_rate;
u32 sample_rate;
u32 coding_type;
};
struct stream_enc_fmt {
u8 channel;
u8 bit_width;
u16 frame_dms; //帧长时间,单位 deci-ms (ms/10)
u32 sample_rate;
u32 bit_rate;
u32 coding_type;
};
struct stream_file_ops {
int (*read)(void *file, u8 *buf, int len);
int (*seek)(void *file, int offset, int fromwhere);
int (*write)(void *file, u8 *data, int len);
int (*close)(void *file);
int (*get_fmt)(void *file, struct stream_fmt *fmt);
int (*get_name)(void *file, u8 *name, int len);
};
struct stream_file_info {
void *file;
const char *fname;
const struct stream_file_ops *ops;
struct audio_dec_breakpoint *dbp;
enum stream_scene scene;
u32 coding_type;
};
struct stream_dec_file {
void *file;
int (*fread)(void *file, u8 *buf, u32 fpos, int len, OS_SEM *sem);
};
struct stream_get_fmt {
struct stream_file_info *file_info;
struct stream_fmt *fmt;
};
struct stream_decoder_info {
enum stream_scene scene;
u8 frame_time;
u32 coding_type;
const char *task_name;
};
struct stream_encoder_info {
enum stream_scene scene;
u32 coding_type;
const char *task_name;
};
/*
* scene_a和scene_b指定的格式有冲突,scene_a抢占scene_b
*/
struct stream_coexist_policy {
enum stream_scene scene_a;
enum stream_scene scene_b;
u32 coding_a;
u32 coding_b;
};
enum frame_flags : u16 {
FRAME_FLAG_FLUSH_OUT = 0x01,
FRAME_FLAG_FILL_ZERO = 0x03, //补0包
FRAME_FLAG_FILL_PACKET = 0x05, //补数据包
FRAME_FLAG_TIMESTAMP_ENABLE = 0x08, //时间戳有效
FRAME_FLAG_RESET_TIMESTAMP_BIT = 0x10,
FRAME_FLAG_RESET_TIMESTAMP = 0x11, //重设各节点的时间戳
FRAME_FLAG_SET_DRIFT_BIT = 0x20,
FRAME_FLAG_SET_D_SAMPLE_RATE = 0x21, //设置sampte_rate的delta
FRAME_FLAG_UPDATE_TIMESTAMP = 0x40, //更新时间戳,驱动节点重设
FRAME_FLAG_UPDATE_DRIFT_SAMPLE_RATE = 0x80,
FRAME_FLAG_SYS_TIMESTAMP_ENABLE = 0x100, //数据帧使用系统时间戳
FRAME_FLAG_PERIOD_SAMPLE = 0x200,
FRAME_FLAG_UPDATE_INFO = FRAME_FLAG_UPDATE_TIMESTAMP | FRAME_FLAG_UPDATE_DRIFT_SAMPLE_RATE,
FRAME_FLAG_PULL_AGAIN = 0x1000 //frame被pull过之后被重新加回iport->frame
};
enum audio_Qval : u8 {
AUDIO_QVAL_16BIT = 15,
AUDIO_QVAL_24BIT = 23,
};
struct node_port_data_wide {
u8 iport_data_wide;//DATA_BIT_WIDE_16BIT,DATA_BIT_WIDE_24BIT
u8 oport_data_wide;//DATA_BIT_WIDE_16BIT,DATA_BIT_WIDE_24BIT
} __attribute__((packed));
struct stream_bit_width {
u8 bit_width;
} __attribute__((packed));
struct stream_frame {
struct list_head entry;
u8 bit_wide;
u16 delay;
u16 offset;
u16 len;
u16 size;
s16 d_sample_rate;
enum frame_flags flags;
u32 timestamp;
u32 fpos;
u8 data[0];
};
struct stream_thread {
u8 id;
u8 debug;
u8 start;
u8 runing;
u32 start_usec;
char name[16];
OS_SEM sem;
OS_MUTEX mutex;
struct jlstream *stream;
struct stream_thread *next;
};
struct stream_iport {
struct list_head frames;
u8 id;
u16 max_len;
enum stream_node_state state;
#if STREAM_NODE_RUN_TIMER_DEBUG_EN
u32 run_time; //usec
#endif
void *private_data;
struct stream_node *node;
struct stream_oport *prev;
struct stream_iport *sibling;
void (*handle_frame)(struct stream_iport *, struct stream_note *note);
};
struct stream_oport {
s16 d_sample_rate;
enum frame_flags flags;
u8 id;
u16 buffered_pcms;
struct stream_fmt fmt;
u32 offset;
u32 timestamp;
struct stream_node *node;
struct stream_iport *next;
struct stream_oport *sibling;
};
struct stream_node_adapter {
const char *name;
u16 uuid;
u8 ability_channel_in;
u8 ability_channel_out;
u8 ability_channel_convert;
u8 ability_resample;
u8 ability_bit_wide;
int (*bind)(struct stream_node *, u16 uuid);
int (*ioctl)(struct stream_iport *iport, int cmd, int arg);
void (*release)(struct stream_node *node);
};
struct stream_node {
u8 subid;
u16 uuid;
u16 pipeline;
enum stream_node_type type;
enum stream_node_state state;
void *private_data;
struct stream_iport *iport;
struct stream_oport *oport;
OS_MUTEX mutex;
const struct stream_node_adapter *adapter;
};
struct stream_snode {
struct stream_node node;
struct jlstream *stream;
};
enum {
THREAD_TYPE_SOURCE = 0x01,
THREAD_TYPE_DEC = 0x02,
THREAD_TYPE_ENC = 0x04,
THREAD_TYPE_OUTPUT = 0x08,
};
struct stream_note {
u8 output_time;
u8 output_start;
enum stream_node_state state;
int delay;
int sleep;
u32 jiffies;
struct jlstream *stream;
struct stream_thread *thread;
};
struct stream_ctrl {
enum stream_state state;
u16 fade_msec;
u32 fade_timeout;
OS_SEM sem;
};
struct jlstream {
struct list_head entry;
u8 id;
u8 ref;
u8 run_cnt;
u8 delay;
u8 incr_sys_clk;
u8 thread_num;
u8 output_time;
u8 thread_policy_step;
enum stream_state state;
enum stream_state pp_state;
enum stream_coexist coexist;
u16 max_delay;
u16 dest_delay; // 目标缓存大小
u16 timer;
u16 thread_timer;
enum stream_scene scene;
u32 end_jiffies;
u32 coding_type;
#if STREAM_NODE_RUN_TIMER_DEBUG_EN
u32 run_usec;
#endif
struct stream_snode *snode;
struct stream_ctrl ctrl;
struct stream_thread *thread;
struct stream_thread *last_thread;
jlstream_breaker_t breaker;
void *callback_arg;
const char *callback_task;
void (*callback_func)(void *, int);
};
#define REGISTER_STREAM_NODE_ADAPTER(adapter) \
const struct stream_node_adapter adapter sec(.stream_node_adapter)
#define PCM_SAMPLE_ONE_SECOND (1000000 * TIMESTAMP_US_DENOMINATOR)
#define PCM_SAMPLE_TO_TIMESTAMP(frames, sample_rate) \
((u64)(frames) * PCM_SAMPLE_ONE_SECOND / ((u32)sample_rate))
#define TIME_TO_PCM_SAMPLES(time, sample_rate) \
(((u64)time * sample_rate / PCM_SAMPLE_ONE_SECOND) + (((u64)time * sample_rate) % PCM_SAMPLE_ONE_SECOND == 0 ? 0 : 1))
void jlstream_lock();
void jlstream_unlock();
int jlstream_event_notify(enum stream_event, int arg);
/*
* 申请一个指定长度的frame
*/
struct stream_frame *jlstream_get_frame(struct stream_oport *, u16 len);
/*
* 将frame推送给后级节点
*/
void jlstream_push_frame(struct stream_oport *, struct stream_frame *);
/*
* 获取一个前级推送的frame
*/
struct stream_frame *jlstream_pull_frame(struct stream_iport *, struct stream_note *);
/*
* 从前级推送的frame中读取指定长度数据
*/
int jlstream_pull_data(struct stream_iport *iport, u32 fpos, u8 *buf, int len);
/*
* 释放已经处理完数据的frame
*/
void jlstream_free_frame(struct stream_frame *frame);
/*
* 释放所有缓存的frame
*/
void jlstream_free_iport_frames(struct stream_iport *iport);
void jlstream_frame_bypass(struct stream_iport *iport, struct stream_note *note);
int jlstream_get_iport_data_len(struct stream_iport *iport);
int jlstream_get_iport_delay(struct stream_iport *iport);
int jlstream_get_iport_frame_num(struct stream_iport *iport);
void jlstream_wakeup_thread(struct jlstream *stream, struct stream_node *node, struct stream_thread *thread);
int stream_node_ioctl(struct stream_node *node, u16 uuid, int cmd, int arg);
int jlstream_node_ioctl(struct jlstream *stream, u16 uuid, int cmd, int arg);
int jlstream_ioctl(struct jlstream *jlstream, int cmd, int arg);
int jlstream_iport_ioctl(struct stream_iport *iport, int cmd, int arg);
struct jlstream *jlstream_for_node(struct stream_node *node);
int jlstream_read_node_data(u16 uuid, u8 subid, u8 *buf);
int jlstream_read_node_port_data_wide(u16 uuid, u8 subid, u8 *buf);
int jlstream_read_stream_crc();
int jlstream_get_delay(struct jlstream *stream);
/*
* 数据流创建和控制接口
*/
struct jlstream *jlstream_pipeline_parse(u16 pipeline, u16 source_uuid);
struct jlstream *jlstream_pipeline_parse_by_node_name(u16 pipeline, const char *node_name);
void jlstream_set_scene(struct jlstream *stream, enum stream_scene scene);
void jlstream_set_coexist(struct jlstream *stream, enum stream_coexist coexist);
void jlstream_set_callback(struct jlstream *stream, void *arg,
void (*callback)(void *, int));
/*
* 设置文件句柄和文件操作接口
*/
int jlstream_set_dec_file(struct jlstream *stream, void *file_hdl,
const struct stream_file_ops *ops);
int jlstream_set_enc_file(struct jlstream *stream, void *file_hdl,
const struct stream_file_ops *ops);
int jlstream_add_thread(struct jlstream *stream, const char *thread_name);
/*
* 启动数据流
*/
int jlstream_start(struct jlstream *stream);
/*
* 播放/暂停切换接口,fade_msec 为淡入/淡出时间
*/
int jlstream_pp_toggle(struct jlstream *stream, u16 fade_msec);
/*
*停止数据流,fade_msec 为淡出时间
*/
void jlstream_stop(struct jlstream *stream, u16 fade_msec);
/*
*释放数据流
*/
void jlstream_release(struct jlstream *stream);
int jlstream_fade_out_32bit(int value, s16 step, s32 *data, int len, u8 channel);
int jlstream_fade_out(int value, s16 step, s16 *data, int len, u8 channel);
int jlstream_fade_in(int value, s16 step, s16 *data, int len, u8 channel);
int jlstream_fade_in_32bit(int value, s16 step, s32 *data, int len, u8 channel);
/*
* 获取节点和设置节点参数接口
*/
void *jlstream_get_node(u16 node_uuid, const char *name);
int jlstream_set_node_param_s(void *node, void *param, u16 param_len);
int jlstream_get_node_param_s(void *node, void *param, u16 param_len);
void jlstream_put_node(void *);
int jlstream_set_node_param(u16 node_uuid, const char *name, void *param, u16 param_len);
int jlstream_get_node_param(u16 node_uuid, const char *name, void *param, u16 param_len);
int jlstream_read_bit_width(u16 uuid, u8 *buf);
int jlstream_is_contains_node_from(struct stream_node *node, u16 node_uuid);
/*
* 数据淡入淡出接口
*
*/
struct jlstream_fade {
u8 in;
u8 out;
u8 channel;
u8 bit_wide;
s16 step;
s16 value;
};
/*
* dir 0:淡出, 1:淡入
*/
void jlstream_fade_init(struct jlstream_fade *fade, int dir, u32 sample_rate,
u8 channel, u16 msec);
enum stream_fade_result {
STREAM_FADE_IN,
STREAM_FADE_OUT,
STREAM_FADE_IN_END,
STREAM_FADE_OUT_END,
STREAM_FADE_END,
};
enum stream_fade_result jlstream_fade_data(struct jlstream_fade *fade, u8 *data, int len);
void jlstream_del_node_from_thread(struct stream_node *node);
int jlstream_add_node_2_thread(struct stream_node *node, const char *task_name);
void jlstream_global_lock();
void jlstream_global_unlock();
bool jlstream_global_locked();
int jlstream_global_pause();
int jlstream_global_resume();
jlstream_breaker_t jlstream_insert_breaker(struct jlstream *stream,
u16 uuid_a, const char *name_a,
u16 uuid_b, const char *name_b);
int jlstream_delete_breaker(jlstream_breaker_t breaker, bool restore);
#endif
@@ -0,0 +1,156 @@
#ifndef NODE_UUID_H
#define NODE_UUID_H
#define NODE_UUID_SOURCE 0x1100
#define NODE_UUID_DEMUXER 0x1200
#define NODE_UUID_DECODER 0x1A85
#define NODE_UUID_ENCODER 0x0A2C
#define NODE_UUID_TONE 0x768A
#define NODE_UUID_RING 0xCADC
#define NODE_UUID_KEY_TONE 0x8346
#define NODE_UUID_EQ 0x737B
#define NODE_UUID_SRC 0x1ECD
#define NODE_UUID_MIXER 0xE62A
#define NODE_UUID_DAC 0xDCCD
#define NODE_UUID_CLASSD 0x5D98
#define NODE_UUID_IIS0_TX 0x69A5
#define NODE_UUID_IIS1_TX 0xF606
#define NODE_UUID_IIS0_RX 0x6963
#define NODE_UUID_IIS1_RX 0xF5C4
#define NODE_UUID_ADC 0xD06D
#define NODE_UUID_A2DP_RX 0xF975
#define NODE_UUID_A2DP_TX 0xF9B7
#define NODE_UUID_ESCO_RX 0x8458
#define NODE_UUID_ESCO_TX 0x849A
#define NODE_UUID_BT_AUDIO_SYNC 0xA576
#define NODE_UUID_VOLUME_CTRLER 0x74E3
#define NODE_UUID_MULTIPLEX 0x2C15
#define NODE_UUID_UART_DUMP 0xE76E
#define NODE_UUID_MUTE 0xD5E0
#define NODE_UUID_PLC 0xED7F
#define NODE_UUID_CVP_SMS_ANS 0xD0BC
#define NODE_UUID_CVP_SMS_DNS 0xDBF5
#define NODE_UUID_CVP_DMS_ANS 0x2115
#define NODE_UUID_CVP_DMS_DNS 0x420E
#define NODE_UUID_CVP_DMS_FLEXIBLE_ANS 0x90F9
#define NODE_UUID_CVP_DMS_FLEXIBLE_DNS 0x68F2
#define NODE_UUID_CVP_3MIC 0X0048
#define NODE_UUID_CVP_DMS_HYBRID_DNS 0X5DF0
#define NODE_UUID_CVP_DEVELOP 0X76EF
#define NODE_UUID_AI_TX 0xDFDA
#define NODE_UUID_AI_RX 0xDF98
#define NODE_UUID_VIDEO_DEC 0X1E07
#define NODE_UUID_NOISE_SUPPRESSOR 0x3BC9
#define NODE_UUID_SURROUND_DEMO 0x3F20
#define NODE_UUID_AUTOMUTE 0X86B9
#define NODE_UUID_LINEIN 0X0624
#define NODE_UUID_SPDIF 0XFB3B
#define NODE_UUID_PC_SPK 0XD186
#define NODE_UUID_PC_MIC 0XB711
#define NODE_UUID_MUSIC 0x6FEC
#define NODE_UUID_PDM_MIC 0XA09F
#define NODE_UUID_CHANNLE_SWAP 0X36D7
#define NODE_UUID_FM 0X7398
#define NODE_UUID_SPATIAL_EFFECTS 0X83E1
#define NODE_UUID_WRITE_FILE 0x23C1
#define NODE_UUID_FILE_PACKAGE 0xE2CB
#define NODE_UUID_LE_AUDIO_PCM 0xC4B7
#define NODE_UUID_LE_AUDIO_TX 0xDEF2
#define NODE_UUID_LE_AUDIO_RX 0xDEB0
#define NODE_UUID_CAPTURE_SYNC 0xFF09
#define NODE_UUID_SPDIF_MASTER 0x9412
#define NODE_UUID_SWITCH 0x2357
/*通话CVP子模块UUID*/
#define NODE_UUID_AEC 0xA9CE
#define NODE_UUID_NLP 0xD3C9
#define NODE_UUID_ANS 0x69BD
#define NODE_UUID_DNS 0xBC6F
#define NODE_UUID_AGC 0xD0D0
#define NODE_UUID_ENC 0xE2BB
#define NODE_UUID_DMS_AEC 0x1EB2
#define NODE_UUID_DMS_NLP 0xF4CA
#define NODE_UUID_DMS_ANS 0x5721
#define NODE_UUID_DMS_DNS 0x4C53
#define NODE_UUID_DMS_GLOABL 0x62B2
#define NODE_UUID_SOUND_SPLITTER 0xD911//音频分流器
#define NODE_UUID_VOCAL_TRACK_SYNTHESIS 0x503d//声道组合器
#define NODE_UUID_VOCAL_TRACK_SEPARATION 0xA724//声道拆分器
#define NODE_UUID_CROSSOVER 0xBF28//分频器3段
#define NODE_UUID_CROSSOVER_2BAND 0x8D63//分频器2段
#define NODE_UUID_WDRC 0xDEFE//WDRC
#define NODE_UUID_GAIN 0xA904//16bit位宽增益控制
#define NODE_UUID_VBASS 0xB0D5//虚拟低音
#define NODE_UUID_STEROMIX 0xfb00//立体声左右声道按不同比例混合
#define NODE_UUID_DYNAMIC_EQ 0x87A0//动态eq
#define NODE_UUID_DYNAMIC_EQ_EXT_DETECTOR 0XA60B//动态eq,支持det使用不同的源头
#define NODE_UUID_DYNAMIC_EQ_PRO 0x4731//动态eq pro
#define NODE_UUID_DYNAMIC_EQ_PRO_EXT_DETECTOR 0x793c//动态eq pro ext
#define NODE_UUID_SURROUND 0x8934//环绕声
#define NODE_UUID_VOICE_CHANGER 0x7293//变声器,针对人声处理
#define NODE_UUID_VOICE_CHANGER_ADV 0x320E//优化了某些场景的变声效果,相应资源消耗更多
#define NODE_UUID_NOISEGATE 0xB7C4//门限噪声
#define NODE_UUID_FREQUENCY_SHIFT 0x6195//移频啸叫抑制
#define NODE_UUID_HOWLING_SUPPRESS 0xC482//陷波啸叫抑制
#define NODE_UUID_PLATE_REVERB_ADVANCE 0x753 //高阶混响
#define NODE_UUID_PLATE_REVERB 0x5101//混响
#define NODE_UUID_ECHO 0x98a4//回声
#define NODE_UUID_SPECTRUM 0xF538//频谱计算
#define NODE_UUID_AUTOTUNE 0xc07a//电子音
#define NODE_UUID_VOCAL_REMOVER 0x2F7A//人声消除,只支持立体声
#define NODE_UUID_SPEAKER_EQ 0x3BE6//喇叭频响矫正
#define NODE_UUID_BASS_TREBLE 0xcc8c//高低音
#define NODE_UUID_ZERO_ACTIVE 0x2FE1//零数据产生器
#define NODE_UUID_3BAND_MERGE 0x1B9D//3带合并
#define NODE_UUID_2BAND_MERGE 0x665c//2带合并
#define NODE_UUID_PITCH_SPEED 0x540e//变速变调,针对歌曲处理
#define NODE_UUID_CONVERT 0x1aa6//饱和溢出位宽转换
#define NODE_UUID_BIT_WIDTH_CONVERT 0x7DE5//位移方式位宽转换
#define NODE_UUID_ENERGY_DETECT 0xA248//能量检测
#define NODE_UUID_STEREO_WIDENER 0x88E5//立体声增强
#define NODE_UUID_PLAY_SYNC 0x9B3B//播放同步
#define NODE_UUID_HARMONIC_EXCITER 0x1B2A//谐波增强
#define NODE_UUID_INDICATOR 0x48E2//分贝指示器
#define NODE_UUID_CHORUS 0x6DD9//合唱
#define NODE_UUID_CHANNEL_EXPANDER 0xDA15//声道扩展
#define NODE_UUID_CHANNEL_MERGE 0xBF8E//声道合并
#define NODE_UUID_WDRC_DETECTOR 0x9A58//支持外部数据源检测的wdrc
#define NODE_UUID_WDRC_ADVANCE 0x4250//drc_advance
#define NODE_UUID_PCM_DELAY 0xA8F4//延时模块,支持各声道独立设置
#define NODE_UUID_AUTODUCK 0x6CE5//自动闪避<响应器>
#define NODE_UUID_AUTODUCK_TRIGGER 0x7099//自动闪避<触发器>
#define NODE_UUID_EFFECT_DEV0 0xA4E1//第三方算法0
#define NODE_UUID_EFFECT_DEV1 0xA4E2//第三方算法1
#define NODE_UUID_EFFECT_DEV2 0xA4E3//第三方算法2
#define NODE_UUID_EFFECT_DEV3 0xA4E4//第三方算法3
#define NODE_UUID_EFFECT_DEV4 0xA4E5//第三方算法4
#define NODE_UUID_DATA_SATURATION 0x6B29//位宽饱和处理 24bit或16bit
#define NODE_UUID_AUTOWAH 0x2F5E//自动哇
#define NODE_UUID_PINGPONG_PCM_DELAY 0xF936//pingpong延时
#define NODE_UUID_THREE_D 0x8c21 //three d
#define NODE_UUID_LLNS 0x9FE //低延时降噪
#define NODE_UUID_FADE 0x1BF5
#define NODE_UUID_SOURCE_DEV0 0x8FC4//自定义源节点0
#define NODE_UUID_SOURCE_DEV1 0x8FC5//自定义源节点1
#define NODE_UUID_SINK_DEV0 0xB328//自定义输出节点0
#define NODE_UUID_SINK_DEV1 0xB329//自定义输出节点1
#define NODE_UUID_ANC_DYNAMIC_GAIN 0x4A0E//ANC音乐动态增益
#define NODE_UUID_DNS_NOISE_SUPPRESSOR 0xAE
#define NODE_UUID_MDRC 0x74CB//多带DRC
#define NODE_UUID_SOF_EQ 0x3845
#define NODE_UUID_LIMITER 0x4E5B//limiter
#define NODE_UUID_MULTIBAND_LIMITER 0xF58A//多带limiter
#define NODE_UUID_DATA_EXPORT 0xDE61//数据导出节点
#endif
@@ -0,0 +1,43 @@
#ifndef SOURCE_NODE_MGR_H
#define SOURCE_NODE_MGR_H
#include "jlstream.h"
#include "media/audio_base.h"
enum {
SRC_NODE_ERR_FILE_END = 1,
};
struct source_node_plug {
u16 uuid;
u16 frame_size;
void *(*init)(void *, struct stream_node *node);
int (*read)(void *, u8 *buf, int len);
int (*seek)(void *, u32 pos);
enum stream_node_state(*get_frame)(void *, struct stream_frame **);
int (*ioctl)(void *, int cmd, int arg);
void (*release)(void *);
};
#define REGISTER_SOURCE_NODE_PLUG(plug) \
const struct source_node_plug plug sec(.source_node_plug)
struct stream_frame *source_plug_get_output_frame(void *, int len);
void source_plug_put_output_frame(void *, struct stream_frame *);
void source_plug_free_frame(void *, struct stream_frame *);
u16 get_source_node_plug_uuid(void *source_node);
#endif

Some files were not shown because too many files have changed in this diff Show More