Files
AC707N/SDK/audio/framework/nodes/effect_dev2_node.c
T
2025-12-03 11:12:34 +08:00

192 lines
4.9 KiB
C

#include "jlstream.h"
#include "media/audio_base.h"
#include "effects/effects_adj.h"
#include "app_config.h"
#if TCFG_EFFECT_DEV2_NODE_ENABLE
#define LOG_TAG_CONST EFFECTS
#define LOG_TAG "[EFFECT_dev2-NODE]"
#define LOG_ERROR_ENABLE
#define LOG_INFO_ENABLE
#define LOG_DUMP_ENABLE
#include "debug.h"
#ifdef SUPPORT_MS_EXTENSIONS
#pragma code_seg(".effect_dev2.text")
#pragma data_seg(".effect_dev2.data")
#pragma const_seg(".effect_dev2.text.const")
#endif
struct effect_dev2_node_hdl {
char name[16];
struct stream_node *node; //节点句柄
void *effect_dev2;
u32 sample_rate;
u8 ch_num;
};
/* 自定义算法,初始化
* sample_rate:采样率
* ch_num:通道数,单声道 1,立体声 2, 四声道 4
**/
static void audio_effect_dev2_init(u32 sample_rate, u8 ch_num)
{
//do something
}
/* 自定义算法,运行
* sample_rate:采样率
* ch_num:通道数,单声道 1,立体声 2, 四声道 4
* *data:输入输出数据同地址,位宽16bit
* data_len :输入数据长度,byte
* */
static void audio_effect_dev2_run(u32 sample_rate, u8 ch_num, s16 *data, u32 data_len)
{
//do something
/* printf("effect dev2 do something here\n"); */
}
/* 自定义算法,关闭
**/
static void audio_effect_dev2_exit()
{
//do something
}
/*节点输出回调处理,可处理数据或post信号量*/
static void effect_dev2_handle_frame(struct stream_iport *iport, struct stream_note *note)
{
struct stream_frame *frame;
struct effect_dev2_node_hdl *hdl = (struct effect_dev2_node_hdl *)iport->private_data;
struct stream_node *node = iport->node;
while (1) {
frame = jlstream_pull_frame(iport, note); //从iport读取数据
if (!frame) {
break;
}
audio_effect_dev2_run(hdl->sample_rate, hdl->ch_num, (s16 *)frame->data, frame->len);
if (node->oport) {
jlstream_push_frame(node->oport, frame); //将数据推到oport
} else {
jlstream_free_frame(frame); //释放iport资源
}
}
}
/*节点预处理-在ioctl之前*/
static int effect_dev2_adapter_bind(struct stream_node *node, u16 uuid)
{
struct effect_dev2_node_hdl *hdl = malloc(sizeof(*hdl));
memset(hdl, 0, sizeof(*hdl));
hdl->node = node;
node->private_data = hdl; //保存私有信息
return 0;
}
/*打开改节点输入接口*/
static void effect_dev2_ioc_open_iport(struct stream_iport *iport)
{
iport->handle_frame = effect_dev2_handle_frame; //注册输出回调
iport->private_data = iport->node->private_data; //保存节点私有句柄
}
/*节点参数协商*/
static int effect_dev2_ioc_negotiate(struct stream_iport *iport)
{
/* struct stream_oport *oport = iport->node->oport;
struct stream_fmt *in_fmt = &iport->prev->fmt;
struct effect_dev2_node_hdl *hdl = (struct effect_dev2_node_hdl *)iport->private_data; */
return 0;
}
/*节点start函数*/
static void effect_dev2_ioc_start(struct effect_dev2_node_hdl *hdl)
{
struct stream_fmt *fmt = &hdl->node->oport->fmt;
/* struct jlstream *stream = jlstream_for_node(hdl->node); */
hdl->sample_rate = fmt->sample_rate;
hdl->ch_num = AUDIO_CH_NUM(fmt->channel_mode);
audio_effect_dev2_init(hdl->sample_rate, hdl->ch_num);
}
/*节点stop函数*/
static void effect_dev2_ioc_stop(struct effect_dev2_node_hdl *hdl)
{
audio_effect_dev2_exit();
}
static int effect_dev2_ioc_update_parm(struct effect_dev2_node_hdl *hdl, int parm)
{
int ret = false;
return ret;
}
static int get_effect_dev2_ioc_parm(struct effect_dev2_node_hdl *hdl, int parm)
{
int ret = 0;
return ret;
}
/*节点ioctl函数*/
static int effect_dev2_adapter_ioctl(struct stream_iport *iport, int cmd, int arg)
{
int ret = 0;
struct effect_dev2_node_hdl *hdl = (struct effect_dev2_node_hdl *)iport->private_data;
switch (cmd) {
case NODE_IOC_OPEN_IPORT:
effect_dev2_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 |= effect_dev2_ioc_negotiate(iport);
break;
case NODE_IOC_START:
effect_dev2_ioc_start(hdl);
break;
case NODE_IOC_SUSPEND:
case NODE_IOC_STOP:
effect_dev2_ioc_stop(hdl);
break;
}
return ret;
}
/*节点用完释放函数*/
static void effect_dev2_adapter_release(struct stream_node *node)
{
free(node->private_data);
}
/*节点adapter 注意需要在sdk_used_list声明,否则会被优化*/
REGISTER_STREAM_NODE_ADAPTER(effect_dev2_node_adapter) = {
.name = "effect_dev2",
.uuid = NODE_UUID_EFFECT_DEV2,
.bind = effect_dev2_adapter_bind,
.ioctl = effect_dev2_adapter_ioctl,
.release = effect_dev2_adapter_release,
};
/* REGISTER_ONLINE_ADJUST_TARGET(effect_dev2) = { */
/* .uuid = NODE_UUID_effect_dev2, */
/* }; */
#endif