109 lines
2.8 KiB
C
Raw Normal View History

2025-02-18 15:40:42 +08:00
#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