109 lines
2.8 KiB
C
109 lines
2.8 KiB
C
|
#ifndef SPECTRUM_API_H
|
|||
|
#define SPECTRUM_API_H
|
|||
|
|
|||
|
#include "media/spectrum/coeff_calculate_api.h"
|
|||
|
#include "media/spectrum/rms_api.h"
|
|||
|
#include "application/audio_eq.h"
|
|||
|
#include "media/audio_stream.h"
|
|||
|
|
|||
|
|
|||
|
typedef struct _spectrum_open_parm {
|
|||
|
u32 sr;
|
|||
|
u32 channel: 4;
|
|||
|
u32 section: 6;
|
|||
|
|
|||
|
u32 rms_en: 1;
|
|||
|
u32 time_ms: 4;
|
|||
|
u32 d_time: 16; //50ms~500ms
|
|||
|
float alpha;//(0~1)
|
|||
|
float attackFactor;
|
|||
|
float releaseFactor;
|
|||
|
|
|||
|
int *freq_center;
|
|||
|
int *quality_factor;
|
|||
|
|
|||
|
void *priv;
|
|||
|
int (*output)(void *priv, float *db, u32 len);//user define
|
|||
|
} spectrum_open_parm;
|
|||
|
|
|||
|
|
|||
|
typedef struct _spectrum_hdl {
|
|||
|
void *rms_hdl;//算db值
|
|||
|
int *coeff; //存放系数的地址
|
|||
|
struct audio_eq *eq[10];
|
|||
|
u32 data_len;
|
|||
|
s16 *data;//输出数据地址
|
|||
|
|
|||
|
spectrum_open_parm parm;
|
|||
|
struct audio_stream_entry entry; // 音频流入口
|
|||
|
} spectrum_hdl;
|
|||
|
|
|||
|
|
|||
|
spectrum_hdl *audio_spectrum_open(spectrum_open_parm *parm);
|
|||
|
int audio_spectrum_close(spectrum_hdl *hdl);
|
|||
|
#if 0
|
|||
|
//例子
|
|||
|
|
|||
|
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief 频响输出回调
|
|||
|
@param data:db值存放的首地址,连续存放 len 个 float型的db值
|
|||
|
@return len
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
int spectrum_output(void *priv, float *data, u32 len)
|
|||
|
{
|
|||
|
u8 db_num = len;
|
|||
|
float *tar_data = data;
|
|||
|
for (int i = 0; i < db_num; i++) {
|
|||
|
//输出10个 浮点db值
|
|||
|
/* printf("tar_data db 0x%x\n", *(int *)&tar_data[i]); */
|
|||
|
//printf("tar_data db %d.%d\n", (int )tar_data[i],(int)((int)(tar_data[i]*100)%100));
|
|||
|
}
|
|||
|
return len;
|
|||
|
}
|
|||
|
|
|||
|
static u32 freq[] = {31, 62, 125, 250, 500, 1000, 2000, 4000, 8000, 16000};
|
|||
|
static u32 quality[] = {
|
|||
|
(int)(0.7f * (1 << 24)), (int)(0.7f * (1 << 24)),
|
|||
|
(int)(0.7f * (1 << 24)), (int)(0.7f * (1 << 24)),
|
|||
|
(int)(0.7f * (1 << 24)), (int)(0.7f * (1 << 24)),
|
|||
|
(int)(0.7f * (1 << 24)), (int)(0.7f * (1 << 24)),
|
|||
|
(int)(0.7f * (1 << 24)), (int)(0.7f * (1 << 24))
|
|||
|
};
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief 打开频响统计
|
|||
|
@param sr:采样率
|
|||
|
@return hdl:句柄
|
|||
|
@note
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
spectrum_hdl *spectrum_open_demo(u32 sr)
|
|||
|
{
|
|||
|
#if TCFG_EQ_ENABLE
|
|||
|
spectrum_hdl *hdl = NULL;
|
|||
|
spectrum_open_parm parm = {0};
|
|||
|
parm.sr = sr;
|
|||
|
parm.channel = 1;
|
|||
|
parm.section = EQ_SECTION_MAX;
|
|||
|
parm.rms_en = 1;
|
|||
|
parm.time_ms = 5;
|
|||
|
parm.attackFactor = 0.9;
|
|||
|
parm.releaseFactor = 0.9;
|
|||
|
parm.freq_center = freq;
|
|||
|
parm.quality_factor = quality;
|
|||
|
parm.d_time = 100;
|
|||
|
parm.alpha = 0.9;
|
|||
|
parm.priv = NULL;
|
|||
|
parm.output = spectrum_output;
|
|||
|
hdl = audio_spectrum_open(&parm);
|
|||
|
return hdl;
|
|||
|
#else
|
|||
|
return NULL;
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
#endif
|
|||
|
#endif
|