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
@@ -0,0 +1,237 @@
#include "jlstream.h"
#include "media/audio_base.h"
#include "effects/effects_adj.h"
#include "app_config.h"
#include "aec_uart_debug.h"
#include "uartPcmSender.h"
#if TCFG_DATA_EXPORT_NODE_ENABLE
#define LOG_TAG_CONST EFFECTS
#define LOG_TAG "[DATA_EXPORT-NODE]"
#define LOG_ERROR_ENABLE
#define LOG_INFO_ENABLE
#define LOG_DUMP_ENABLE
#include "debug.h"
struct data_export_cfg_t {
u16 data_len;
} __attribute__((packed));
struct data_export_node_hdl {
char name[16];
struct stream_node *node; //节点句柄
void *effect_dev1;
u32 sample_rate;
u8 ch_num;
u8 ch_idx;
struct data_export_cfg_t node_cfg;
};
/*节点配置*/
struct data_export_global_info {
u8 node_cnt; //记录当前是第几个data export节点
u8 node_num; //记录数据流里面,date export节点的个数
int total_len; //记录通道数据总和
};
/*全局变量*/
struct data_export_global_info g_export_info = {
.node_cnt = 0,
.node_num = 0,
.total_len = 0,
};
/*节点输出回调处理,可处理数据或post信号量*/
static void data_export_handle_frame(struct stream_iport *iport, struct stream_note *note)
{
struct stream_frame *frame;
struct data_export_node_hdl *hdl = (struct data_export_node_hdl *)iport->private_data;
struct stream_node *node = iport->node;
while (1) {
frame = jlstream_pull_frame(iport, note); //从iport读取数据
if (!frame) {
break;
}
aec_uart_fill_v2(hdl->ch_idx, (s16 *)frame->data, frame->len);
aec_uart_write_v2();
if (node->oport) {
jlstream_push_frame(node->oport, frame); //将数据推到oport
} else {
jlstream_free_frame(frame); //释放iport资源
}
}
}
static int data_export_param_cfg_read(struct data_export_node_hdl *hdl)
{
/*
*解析配置文件内效果配置
* */
int len = 0;
struct node_param ncfg = {0};
len = jlstream_read_node_data(NODE_UUID_DATA_EXPORT, hdl->node->subid, (u8 *)&ncfg);
if (len != sizeof(ncfg)) {
printf("data_export_node read ncfg err\n");
return -2;
}
char mode_index = 0;
char cfg_index = 0;//目标配置项序号
struct cfg_info info = {0};
if (!jlstream_read_form_node_info_base(mode_index, ncfg.name, cfg_index, &info)) {
len = jlstream_read_form_cfg_data(&info, &hdl->node_cfg);
}
printf(" %s len %d, sizeof(struct data_export_cfg_t) %d\n", __func__, len, (int)sizeof(struct data_export_cfg_t));
if (len != sizeof(struct data_export_cfg_t)) {
printf("data_export_param read ncfg err\n");
return -1 ;
}
return len ;
}
/*节点预处理-在ioctl之前*/
static int data_export_adapter_bind(struct stream_node *node, u16 uuid)
{
printf("data_export_adapter_bind");
struct data_export_node_hdl *hdl = malloc(sizeof(*hdl));
memset(hdl, 0, sizeof(*hdl));
/*计算数据流data export节点的个数*/
g_export_info.node_num++;
hdl->node = node;
node->private_data = hdl; //保存私有信息
return 0;
}
/*打开改节点输入接口*/
static void data_export_ioc_open_iport(struct stream_iport *iport)
{
printf("data_export_ioc_open_iport");
iport->handle_frame = data_export_handle_frame; //注册输出回调
iport->private_data = iport->node->private_data; //保存节点私有句柄
}
/*节点参数协商*/
static int data_export_ioc_negotiate(struct stream_iport *iport)
{
/* struct stream_oport *oport = iport->node->oport;
struct stream_fmt *in_fmt = &iport->prev->fmt;
struct data_export_node_hdl *hdl = (struct data_export_node_hdl *)iport->private_data; */
return 0;
}
/*节点start函数*/
static void data_export_ioc_start(struct data_export_node_hdl *hdl)
{
struct stream_fmt *fmt = &hdl->node->oport->fmt;
/* struct jlstream *stream = jlstream_for_node(hdl->node); */
printf("data_export_ioc_start");
/*读取节点参数*/
data_export_param_cfg_read(hdl);
/*计算总的通道数据大小*/
g_export_info.total_len += hdl->node_cfg.data_len;
hdl->ch_idx = g_export_info.node_cnt;
printf("ch_idx : %d", hdl->ch_idx);
g_export_info.node_cnt++;
hdl->sample_rate = fmt->sample_rate;
hdl->ch_num = AUDIO_CH_NUM(fmt->channel_mode);
if (g_export_info.node_cnt >= g_export_info.node_num) {
uartSendInit();
aec_uart_open_v2(g_export_info.node_num, g_export_info.total_len);
}
}
/*节点stop函数*/
static void data_export_ioc_stop(struct data_export_node_hdl *hdl)
{
printf("data_export_ioc_stop");
g_export_info.node_num--;
g_export_info.node_cnt--;
if (g_export_info.node_num == 0) {
g_export_info.total_len = 0;
aec_uart_close_v2();
}
}
static int data_export_ioc_update_parm(struct data_export_node_hdl *hdl, int parm)
{
int ret = false;
return ret;
}
static int get_data_export_ioc_parm(struct data_export_node_hdl *hdl, int parm)
{
int ret = 0;
return ret;
}
/*节点ioctl函数*/
static int data_export_adapter_ioctl(struct stream_iport *iport, int cmd, int arg)
{
int ret = 0;
struct data_export_node_hdl *hdl = (struct data_export_node_hdl *)iport->private_data;
switch (cmd) {
case NODE_IOC_OPEN_IPORT:
data_export_ioc_open_iport(iport);
break;
case NODE_IOC_OPEN_OPORT:
break;
case NODE_IOC_CLOSE_IPORT:
break;
case NODE_IOC_SET_SCENE:
break;
case NODE_IOC_NEGOTIATE:
*(int *)arg |= data_export_ioc_negotiate(iport);
break;
case NODE_IOC_START:
data_export_ioc_start(hdl);
break;
case NODE_IOC_SUSPEND:
case NODE_IOC_STOP:
data_export_ioc_stop(hdl);
break;
}
return ret;
}
/*节点用完释放函数*/
static void data_export_adapter_release(struct stream_node *node)
{
printf("data_export_adapter_release");
free(node->private_data);
}
/*节点adapter 注意需要在sdk_used_list声明,否则会被优化*/
REGISTER_STREAM_NODE_ADAPTER(data_export_node_adapter) = {
.name = "data_export",
.uuid = NODE_UUID_DATA_EXPORT,
.bind = data_export_adapter_bind,
.ioctl = data_export_adapter_ioctl,
.release = data_export_adapter_release,
};
/* REGISTER_ONLINE_ADJUST_TARGET(data_export) = { */
/* .uuid = NODE_UUID_DATA_EXPORT, */
/* }; */
#endif