pure sdk for main

This commit is contained in:
divadiow
2025-08-27 09:51:58 +01:00
parent f0d033f1c9
commit 0571416e7c
3283 changed files with 1577720 additions and 1 deletions
+247
View File
@@ -0,0 +1,247 @@
#include "sys_config.h"
#include "typesdef.h"
#include "list.h"
#include "dev.h"
#include "osal/sleep.h"
#include "string.h"
#include "pdmFilter.h"
#include "pdm_audio.h"
#include "utlist.h"
#include "newaudio.h"
#include "stream_frame.h"
#include "osal/string.h"
#if AUDIO_EN == 1
//对PCM数据的放大倍数,最大127*256
#define PCM_GAIN (10*256)//30*256//(22*256)
stream *global_pdm_s = NULL;
static void rm_dc_filter_init(TYPE_FIRST_ORDER_FILTER_TYPE *filter)
{
memset(filter, 0, sizeof(TYPE_FIRST_ORDER_FILTER_TYPE));
}
static void newaudio_deal_task(void *arg)
{
stream *s = (stream *)arg;
int16* addr;
int res;
int i;
struct data_structure *data ;
TYPE_FIRST_ORDER_FILTER_TYPE filter_ctl;
rm_dc_filter_init(&filter_ctl);
struct audio_pdm_s *self_priv = (struct audio_pdm_s*)s->priv;
while(1)
{
res = csi_kernel_msgq_get(self_priv->pdm_msgq,&data,-1);
if(!res)
{
addr = get_stream_real_data(data);
for(i=0; i<AUDIOLEN/2; i++)
{
addr[i] = rm_dc_filter(&filter_ctl, addr[i]);
addr[i] = pcm_volum_gain(addr[i], PCM_GAIN);
}
//发送
send_data_to_stream(data);
//_os_printf("!");
}
else
{
_os_printf("%s:%d err @@@@@@@@@@@@\n",__FUNCTION__,__LINE__);
}
}
}
static uint32_t get_sound_data_len(void *data)
{
struct data_structure *d = (struct data_structure *)data;
return (uint32_t)d->priv;
}
static uint32_t set_sound_data_len(void *data,uint32_t len)
{
struct data_structure *d = (struct data_structure *)data;
d->priv = (void*)AUDIOLEN;
return (uint32_t)AUDIOLEN;
}
static uint32_t set_sound_data_time(void *data,uint32_t len)
{
struct data_structure *d = (struct data_structure *)data;
d->timestamp = os_jiffies();
return (uint32_t)0;
}
static stream_ops_func stream_sound_ops =
{
.get_data_len = get_sound_data_len,
.set_data_len = set_sound_data_len,
// .set_data_time = set_sound_data_time,
};
static int opcode_func(stream *s,void *priv,int opcode)
{
static uint8_t *pdm_audio_buf = NULL;
int res = 0;
switch(opcode)
{
case STREAM_OPEN_ENTER:
break;
case STREAM_OPEN_EXIT:
{
s->priv = (void*)os_malloc(sizeof(struct audio_pdm_s));
if(s->priv)
{
struct audio_pdm_s *self_priv = (struct audio_pdm_s*)s->priv;
self_priv->pdm_msgq = (void*)csi_kernel_msgq_new(1,sizeof(uint8_t*));
OS_TASK_INIT("pdmAudio_deal", &self_priv->thread_hdl, newaudio_deal_task, s, OS_TASK_PRIORITY_NORMAL, 1024);
}
pdm_audio_buf = os_malloc(AUDIONUM * AUDIOLEN);
if(pdm_audio_buf)
{
stream_data_dis_mem(s,AUDIONUM);
}
//绑定到对应的流
streamSrc_bind_streamDest(s,R_RECORD_AUDIO);
streamSrc_bind_streamDest(s,R_RTP_AUDIO);
}
break;
case STREAM_OPEN_FAIL:
break;
case STREAM_DATA_DIS:
{
struct data_structure *data = (struct data_structure *)priv;
int data_num = (int)data->priv;
data->type = DATA_TYPE_AUDIO_PDM;//设置声音的类型
data->priv = (void*)AUDIOLEN;
//注册对应函数
data->ops = &stream_sound_ops;
data->data = pdm_audio_buf + (data_num)*AUDIOLEN;
}
break;
case STREAM_DATA_FREE:
//_os_printf("%s:%d\n",__FUNCTION__,__LINE__);
//设置为播放sd卡
//send_stream_cmd(s,(void*)0x10);
//_os_printf("priv:%X\n",priv);
break;
case STREAM_DATA_FREE_END:
//os_sema_up(s->priv);
break;
//数据发送完成,可以选择唤醒对应的任务
case STREAM_SEND_DATA_FINISH:
break;
default:
//默认都返回成功
break;
}
return res;
}
void *newaudio_creat() {
stream *s = NULL;
s = open_stream(S_PDM,AUDIONUM,0,opcode_func,NULL);
if(!s)
{
goto newaudio_creat_end;
}
global_pdm_s = s;
return s;
newaudio_creat_end:
global_pdm_s = NULL;
return NULL;
}
static void *newaudio_set_buf(void *priv_el,void *el_point)
{
stream *s = (stream *)priv_el;
struct data_structure *data;
data = get_src_data_f(s);
struct data_structure **point = (struct data_structure**)el_point;
void *buf = NULL;
if(data)
{
buf = get_stream_real_data(data);
}
*point = data;
return buf;
}
static void newaudio_get_buf(void *priv_el,void *el_point)
{
stream *s = (stream *)priv_el;
struct audio_pdm_s *self_priv = (struct audio_pdm_s*)s->priv;
struct data_structure *data = (struct data_structure*)el_point;
int res;
if(!data)
{
_os_printf("%s:%d err\n",__FUNCTION__,__LINE__);
return;
}
set_stream_data_time(data,os_jiffies());
res = csi_kernel_msgq_put(self_priv->pdm_msgq,&data,0,0);
//正常应该保证不进这里,如果进来代表任务没有获取队列,直接配置下一个buf导致的
if(res)
{
force_del_data(data);
}
return;
}
void *newaudio_task()
{
stream *s = NULL;
void *audio_priv;
s = newaudio_creat();
if(!s)
{
goto newaudio_task_end;
}
struct audio_pdm_s *self_priv = (struct audio_pdm_s*)s->priv;
audio_priv = pdm_audio_open(PDM_SAMPLE_FREQ_16K,PDM_CHANNEL_RIGHT);
if(audio_priv)
{
self_priv->audio_hardware_hdl = audio_priv;
pdm_audio_register(audio_priv,s,AUDIOLEN,newaudio_set_buf,newaudio_get_buf);
pdm_audio_start(audio_priv);
}
newaudio_task_end:
return (void*)s;
}
#endif
+47
View File
@@ -0,0 +1,47 @@
#ifndef __NEWAUDIO_H
#define __NEWAUDIO_H
#include "typesdef.h"
#include "list.h"
#include "dev.h"
#include "devid.h"
#include "osal/mutex.h"
#include "osal/irq.h"
#include "osal/task.h"
#include "stream_frame.h"
#define AUDIONUM (4)
#define AUDIOLEN (1024)
typedef struct audio_el audio_el;
typedef struct NewAudio NewAudio;
typedef void (*free_func)(void*node);
struct audio_el {
unsigned char *audio_data; //音频数据
struct audio_el *next;
int len;
unsigned int timestamp;
NewAudio *parent_priv;
free_func free; //释放函数
} ;
struct NewAudio
{
stream *s;
void *audio_hardware_hdl;
};
struct audio_pdm_s
{
void *pdm_msgq;
void *audio_hardware_hdl;
struct os_task thread_hdl;
};
void *newaudio_task();
audio_el *global_ready_el();
unsigned char *get_el_buf(audio_el* el_node);
unsigned int get_el_timestamp(audio_el* el_node);
int get_el_buf_len(audio_el* el_node);
#endif