KT24-1110_65E-HA-651B/include_lib/media/audio_stream.h

322 lines
12 KiB
C
Raw Permalink Normal View History

2024-11-10 10:44:17 +00:00
#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_n1entry1_n
* test_group中
* audio_stream_group_add_entry(&test_group, &entry0_n);
* audio_stream_group_add_entry(&test_group, &entry1_n);
* streamX的第一个节点是entryX_0streamX数据流
* 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