4.3.30.4. HIFI5接口文档
Modules API
Module是基本数据处理模块,Module的基本操作符如下:
typedef struct module_ops {
int32_t (*cmd)(struct plugin_module *modptr, ele_msg_p msg_ptr);
int32_t (*process)(struct plugin_module *modptr, sample_p data_ptr);
/* this hook is for specitial used */
int32_t (*create)(struct plugin_module *modptr);
int32_t (*destroy)(struct plugin_module *modptr);
uint32_t (*priv_size)(void *work_param, uint32_t size);
uint32_t (*stack_size)(sttuct plugin_module *modptr);
} module_ops_t;
Module自身的结构由框架创建,module_ops中的create/destory接口,是给module用来创建内部自己需要。
控制接口
【函数声明】
int32_t (*cmd)(struct plugin_module * modptr, ele_msg_p msg_ptr);
【参数描述】
[IN] :struct plugin_module * modptr,模块自身指针。
[IN]:ele_msg_p msg_ptr,命令消息结构体。
【说明】
框架层在OPEN/CLOSE/START/STOP/SET_PARAM的时间点调用到该接口。
ELE_OPEN: 模块打开,通常是一些初始化等动作
ELE_CLOSE: 模块关闭
ELE_START: 开始 (通常是硬件驱动模块在此时开启DMA传输、开启中断等操作)
ELE_STOP: 停止
ELE_SET_PARAM: 设置参数
ELE_GET_PARAM: 获取参数
【返回值】
操作成功:SYS_OK
操作失败:SYS_ERR
【功能描述】
发送命令给Module
基本命令时序如下: OPEN->START->STOP->CLOSE。SET_PARAM/GET_PARAM是异步过程,在整个运行周期内都可能被调用。
上述子命令会在audio pipeline对应阶段被发送到module,module处理对应命令,完成整个控制流程。
数据接口
【函数声明】
int32_t (*process)(struct plugin_module * modptr, sample_p data_ptr);
【参数描述】
[IN] :struct plugin_module * modptr,模块自身指针
[IN]:sample_p data_ptr,数据结构体指针
【说明】
process接口处理数据流,sample_p data_ptr参数,表示一帧需要处理的数据内容。 每帧数据的结构体如下:
typedef struct sample {
sample_attr_t attr;
uint32_t ch_count;
uint32_t sample_count;
struct sample_data {
sample_type_t **noninterleaved;/*!< noninterleaved samples: noninterleaved[ch_count][sample_count] */
char *interleaved;/*!< interlaved samples */
} samples;
} sample_t __attribute__((aligned(8)));
在module的process处理函数中,需要读取上述的samples成员的数据,需要将处理完成之后的数据写回到samples。
【返回值】
操作成功:SYS_OK
操作失败:SYS_ERR
【功能描述】
数据处理接口,是算法调用的入口
创建/销毁Hook接口
【函数声明】
/* this hook is called after module's creating */
int32_t (*create)(struct plugin_module *modptr);
/* this hook is call before module's destroy */
int32_t (*destroy)(struct plugin_module *modptr);
【参数描述】
[IN] :struct plugin_module * modptr,模块自身指针
【说明】
create_hook在框架层创建module后调用。
destroy_hook在框架层销毁module前调用。
【返回值】
操作成功:SYS_OK
操作失败:SYS_ERR
【功能描述】
上述接口在系统create/destroy时被调用,给有特别需求的module使用,如果没有这类需求,可以不用实现该接口。
获取模块的内存size接口
【函数声明】
uint32_t (*priv_size)(void *work_param, uint32_t size);
【参数描述】
[IN] :void *work_param, 工作参数
[IN] :uint32_t size, 参数大小
【说明】
有一部分module需要在每个实例打开的时候创建一个不同的私有内存空间,用于保存module的私有数据。module需要实现此接口,框架层会根据该接口的返回值,分配好固定内存,其地址将会被存放在priv_data中。
【返回值】
操作成功:SYS_OK
操作失败:SYS_ERR
【功能描述】
返回模块所需要私有空间的大小,以便框架层能够按需分配。
获取栈内存size接口
【函数声明】
uint32_t (*stack_size)(struct plugin_module *modptr);
【参数描述】
[IN] :struct plugin_module * modptr,模块自身指针
【说明】
部分算法用到非常大的栈空间(建议不超过16K),默认情况下,内置的线程默认的栈空间是8K。当算法所需要的栈空间大于此内存时,需要实现这个接口,用于告知框架层整个算法所需要的栈空间大小。
【返回值】
栈空间大小
【功能描述】
返回模块所需要栈空间的大小,以便框架层能够按需分配。
返回值说明
enum sys_error {
SYS_OK = 0,
SYS_ERR = -1,
SYS_ERR_SEM = -2,
SYS_ERR_MEM = -3,
SYS_ERR_TRANSFER = -4,
SYS_ERR_TIMEOUT = -5
};