KT24-1110_65E-HA-651B/include_lib/media/audio_stream.h
2024-11-10 18:44:17 +08:00

322 lines
12 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef AUDIO_STREAM_H
#define AUDIO_STREAM_H
#include "generic/includes.h"
#include "media/audio_base.h"
// 数据流IOCTRL命令
#define AUDIO_STREAM_IOCTRL_CMD_CHECK_ACTIVE (1) // 检查数据流是否活动
struct audio_stream_entry;
struct audio_frame_copy;
/*
* 数据流中的传输内容
*/
struct audio_data_frame {
u8 channel; // 通道数
u16 stop : 1; // 数据流停止标志
u16 data_sync : 1; // 数据流同步标志
u16 no_subsequent : 1; // 1-不再执行后续的数据流0-正常执行
u32 sample_rate; // 采样率
u16 offset; // 数据偏移
u16 data_len; // 数据长度
s16 *data; // 数据地址
};
/*
* 数据流
* 多个数据流节点组成一个数据流
*/
struct audio_stream {
struct audio_stream_entry *entry; // 数据流节点
void *priv; // resume私有参数
void (*resume)(void *priv); // 激活回调接口
};
/*
* 数据流群组
* 用于串联多个数据流在调用resume/clear等操作时依次处理各个数据流
* 如数据流stream0最后一个节点是entry0_n数据流1最后一个节点是entry1_n
* 把这两个数据流加入到群组test_group中
* audio_stream_group_add_entry(&test_group, &entry0_n);
* audio_stream_group_add_entry(&test_group, &entry1_n);
* 另一个数据流streamX的第一个节点是entryX_0把群组关联到streamX数据流
* entryX_0.group = &test_group;
* 那么调用streamX中的resume就会依次调用stream0和stream1的resume了
*/
struct audio_stream_group {
struct audio_stream_entry *entry; // 数据流节点
};
/*
* 数据流节点
* 数据流节点依次串联,数据依次往后传递
*/
struct audio_stream_entry {
u8 pass_by; // 1-同步处理即往后传的buf就是上层传入的buf
// 0-异步处理数据存到其他buf再往后传
u8 remain; // 1-上次数据没输出完。0-上次数据输出完
u16 offset; // 同步处理时的数据偏移
struct audio_stream *stream; // 所属的数据流
struct audio_stream_entry *input; // 上一个节点
struct audio_stream_entry *output; // 下一个节点
struct audio_stream_entry *sibling; // 数据流群组中的数据流节点链表
struct audio_stream_group *group; // 数据流群组节点
struct audio_frame_copy *frame_copy; // 数据分支节点
int (*prob_handler)(struct audio_stream_entry *, struct audio_data_frame *in); // 预处理
int (*data_handler)(struct audio_stream_entry *, struct audio_data_frame *in,
struct audio_data_frame *out); // 数据处理
void (*data_process_len)(struct audio_stream_entry *, int len); // 后级返回使用的数据长度
void (*data_clear)(struct audio_stream_entry *); // 清除节点数据
int (*ioctrl)(struct audio_stream_entry *, int cmd, int *param); // 节点IOCTRL
};
/*
* 数据流分支
* 支持一传多分支功能内部自动生成struct audio_frame_copy来处理多个分支
* 有多少个分支就会申请多少个空间,数据分别拷贝到对应分支空间然后往后传递
*/
struct audio_frame_copy {
struct list_head head; // 链表。用于连接各个分支
struct audio_data_frame frame; // 保存上层的传输内容
struct audio_stream_entry entry; // 连接上层的节点
};
/*
*********************************************************************
* Audio Stream Open
* Description: 创建一个数据流
* Arguments : *priv resume回调的私有参数
* resume 模块唤醒数据流时的回调函数
* Return : 数据流句柄
* Note(s) : None.
*********************************************************************
*/
struct audio_stream *audio_stream_open(void *priv, void (*resume)(void *priv));
/*
*********************************************************************
* Audio Stream Add First
* Description: 添加第一个数据流节点
* Arguments : *stream 数据流句柄
* *entry 数据流节点句柄
* Return : None.
* Note(s) : 第一个节点一般为解码输出
*********************************************************************
*/
void audio_stream_add_first(struct audio_stream *stream,
struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Add Head
* Description: 将节点插入到数据流的first节点后面
* Arguments : *stream 数据流句柄
* *entry 数据流节点句柄
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_add_head(struct audio_stream *stream,
struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Add Tail
* Description: 将节点放到数据流的最后
* Arguments : *stream 数据流句柄
* *entry 数据流节点句柄
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_add_tail(struct audio_stream *stream,
struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Add Entry
* Description: 将output节点添加到input节点之后
* Arguments : *input 数据流节点句柄
* *output 需要添加的数据流节点句柄
* Return : None.
* Note(s) : 如果input节点后面已经连接有节点将创建数据流分支处理
*********************************************************************
*/
void audio_stream_add_entry(struct audio_stream_entry *input,
struct audio_stream_entry *output);
/*
*********************************************************************
* Audio Stream Add List
* Description: 将entry数组中节点按顺序添加到数据流中
* Arguments : *stream 数据流句柄
* *entry[] 数据流节点数组
* num 节点总个数
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_add_list(struct audio_stream *stream,
struct audio_stream_entry *entry[], int num);
/*
*********************************************************************
* Audio Stream Delete Entry
* Description: 将节点从数据流中删除
* Arguments : *entry 数据流节点句柄
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_del_entry(struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Delete List Entry
* Description: 依次将数组中的节点删除
* Arguments : *entry[] 数据流节点数组
* num 节点总个数
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_del_list(struct audio_stream_entry *entry[], int num);
/*
*********************************************************************
* Audio Stream Group Add Entry
* Description: 将节点加入到群组之中
* Arguments : *group 数据流群组句柄
* *entry 数据流节点句柄
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_group_add_entry(struct audio_stream_group *group,
struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Group Delete Entry
* Description: 将节点从群组之中删除
* Arguments : *group 数据流群组句柄
* *entry 数据流节点句柄
* Return : None.
* Note(s) : None.
*********************************************************************
*/
void audio_stream_group_del_entry(struct audio_stream_group *group,
struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Group Get Entry Number
* Description: 获取群组中的节点个数
* Arguments : *group 数据流群组句柄
* Return : 节点个数
* Note(s) : None.
*********************************************************************
*/
int audio_stream_group_entry_num(struct audio_stream_group *group);
/*
*********************************************************************
* Audio Stream Run
* Description: 数据处理接口
* Arguments : *entry 数据流节点句柄
* *input 输入数据
* Return : 负数-出错
* Note(s) : 数据流依次递归往后传输。直到最后一个节点或者no_subsequent==1
* 或者prob_handler/data_handler处理错误返回负数
*********************************************************************
*/
int audio_stream_run(struct audio_stream_entry *from, struct audio_data_frame *input);
/*
*********************************************************************
* Audio Stream Resume
* Description: 唤醒数据流
* Arguments : *entry 数据流节点句柄
* Return : 0-成功
* Note(s) : 最终会递归调用到struct audio_stream结构体中的.resume回调接口
*********************************************************************
*/
int audio_stream_resume(struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Clear From Entry
* Description: 清除指定节点及后续所有节点的数据
* Arguments : *entry 数据流节点句柄
* Return : None.
* Note(s) : 会清除offset/pass_by等记录并且调用data_clear回调接口清除用户数据
*********************************************************************
*/
void audio_stream_clear_from(struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Clear
* Description: 清除数据流所有节点数据
* Arguments : *stream 数据流句柄
* Return : None.
* Note(s) : 会清除offset/pass_by等记录并且调用data_clear回调接口清除用户数据
*********************************************************************
*/
void audio_stream_clear(struct audio_stream *stream);
/*
*********************************************************************
* Audio Stream Clear By Entry
* Description: 通过数据流某个节点清除数据流所有节点数据
* Arguments : *entry 数据流节点句柄
* Return : None.
* Note(s) : 先找到数据流起始位置再调用audio_stream_clear()清除所有节点
*********************************************************************
*/
void audio_stream_clear_by_entry(struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Check Active From Entry
* Description: 检测指定节点及后续节点是否有活动情况
* Arguments : *entry 数据流节点句柄
* Return : true 活动
* Note(s) : 只要中间有某个节点活动就会返回数据流活动
*********************************************************************
*/
int audio_stream_check_active_from(struct audio_stream_entry *entry);
/*
*********************************************************************
* Audio Stream Close
* Description: 关闭数据流
* Arguments : *stream 数据流句柄
* Return : None.
* Note(s) : 需关闭所有数据流节点之后才能调用该函数
*********************************************************************
*/
void audio_stream_close(struct audio_stream *stream);
#endif