audio_stream.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. #ifndef AUDIO_STREAM_H
  2. #define AUDIO_STREAM_H
  3. #include "generic/includes.h"
  4. #include "media/audio_base.h"
  5. // 数据流IOCTRL命令
  6. #define AUDIO_STREAM_IOCTRL_CMD_CHECK_ACTIVE (1) // 检查数据流是否活动
  7. struct audio_stream_entry;
  8. struct audio_frame_copy;
  9. /*
  10. * 数据流中的传输内容
  11. */
  12. struct audio_data_frame {
  13. u8 channel; // 通道数
  14. u16 stop : 1; // 数据流停止标志
  15. u16 data_sync : 1; // 数据流同步标志
  16. u16 no_subsequent : 1; // 1-不再执行后续的数据流;0-正常执行
  17. u32 sample_rate; // 采样率
  18. u16 offset; // 数据偏移
  19. u16 data_len; // 数据长度
  20. s16 *data; // 数据地址
  21. };
  22. /*
  23. * 数据流
  24. * 多个数据流节点组成一个数据流
  25. */
  26. struct audio_stream {
  27. struct audio_stream_entry *entry; // 数据流节点
  28. void *priv; // resume私有参数
  29. void (*resume)(void *priv); // 激活回调接口
  30. };
  31. /*
  32. * 数据流群组
  33. * 用于串联多个数据流,在调用resume/clear等操作时依次处理各个数据流
  34. * 如数据流stream0最后一个节点是entry0_n,数据流1最后一个节点是entry1_n
  35. * 把这两个数据流加入到群组test_group中
  36. * audio_stream_group_add_entry(&test_group, &entry0_n);
  37. * audio_stream_group_add_entry(&test_group, &entry1_n);
  38. * 另一个数据流streamX的第一个节点是entryX_0,把群组关联到streamX数据流
  39. * entryX_0.group = &test_group;
  40. * 那么调用streamX中的resume就会依次调用stream0和stream1的resume了
  41. */
  42. struct audio_stream_group {
  43. struct audio_stream_entry *entry; // 数据流节点
  44. };
  45. /*
  46. * 数据流节点
  47. * 数据流节点依次串联,数据依次往后传递
  48. */
  49. struct audio_stream_entry {
  50. u8 pass_by; // 1-同步处理(即往后传的buf就是上层传入的buf);
  51. // 0-异步处理(数据存到其他buf再往后传)
  52. u8 remain; // 1-上次数据没输出完。0-上次数据输出完
  53. u16 offset; // 同步处理时的数据偏移
  54. struct audio_stream *stream; // 所属的数据流
  55. struct audio_stream_entry *input; // 上一个节点
  56. struct audio_stream_entry *output; // 下一个节点
  57. struct audio_stream_entry *sibling; // 数据流群组中的数据流节点链表
  58. struct audio_stream_group *group; // 数据流群组节点
  59. struct audio_frame_copy *frame_copy; // 数据分支节点
  60. int (*prob_handler)(struct audio_stream_entry *, struct audio_data_frame *in); // 预处理
  61. int (*data_handler)(struct audio_stream_entry *, struct audio_data_frame *in,
  62. struct audio_data_frame *out); // 数据处理
  63. void (*data_process_len)(struct audio_stream_entry *, int len); // 后级返回使用的数据长度
  64. void (*data_clear)(struct audio_stream_entry *); // 清除节点数据
  65. int (*ioctrl)(struct audio_stream_entry *, int cmd, int *param); // 节点IOCTRL
  66. };
  67. /*
  68. * 数据流分支
  69. * 支持一传多(分支)功能,内部自动生成struct audio_frame_copy来处理多个分支
  70. * 有多少个分支就会申请多少个空间,数据分别拷贝到对应分支空间然后往后传递
  71. */
  72. struct audio_frame_copy {
  73. struct list_head head; // 链表。用于连接各个分支
  74. struct audio_data_frame frame; // 保存上层的传输内容
  75. struct audio_stream_entry entry; // 连接上层的节点
  76. };
  77. /*
  78. *********************************************************************
  79. * Audio Stream Open
  80. * Description: 创建一个数据流
  81. * Arguments : *priv resume回调的私有参数
  82. * resume 模块唤醒数据流时的回调函数
  83. * Return : 数据流句柄
  84. * Note(s) : None.
  85. *********************************************************************
  86. */
  87. struct audio_stream *audio_stream_open(void *priv, void (*resume)(void *priv));
  88. /*
  89. *********************************************************************
  90. * Audio Stream Add First
  91. * Description: 添加第一个数据流节点
  92. * Arguments : *stream 数据流句柄
  93. * *entry 数据流节点句柄
  94. * Return : None.
  95. * Note(s) : 第一个节点一般为解码输出
  96. *********************************************************************
  97. */
  98. void audio_stream_add_first(struct audio_stream *stream,
  99. struct audio_stream_entry *entry);
  100. /*
  101. *********************************************************************
  102. * Audio Stream Add Head
  103. * Description: 将节点插入到数据流的first节点后面
  104. * Arguments : *stream 数据流句柄
  105. * *entry 数据流节点句柄
  106. * Return : None.
  107. * Note(s) : None.
  108. *********************************************************************
  109. */
  110. void audio_stream_add_head(struct audio_stream *stream,
  111. struct audio_stream_entry *entry);
  112. /*
  113. *********************************************************************
  114. * Audio Stream Add Tail
  115. * Description: 将节点放到数据流的最后
  116. * Arguments : *stream 数据流句柄
  117. * *entry 数据流节点句柄
  118. * Return : None.
  119. * Note(s) : None.
  120. *********************************************************************
  121. */
  122. void audio_stream_add_tail(struct audio_stream *stream,
  123. struct audio_stream_entry *entry);
  124. /*
  125. *********************************************************************
  126. * Audio Stream Add Entry
  127. * Description: 将output节点添加到input节点之后
  128. * Arguments : *input 数据流节点句柄
  129. * *output 需要添加的数据流节点句柄
  130. * Return : None.
  131. * Note(s) : 如果input节点后面已经连接有节点,将创建数据流分支处理
  132. *********************************************************************
  133. */
  134. void audio_stream_add_entry(struct audio_stream_entry *input,
  135. struct audio_stream_entry *output);
  136. /*
  137. *********************************************************************
  138. * Audio Stream Add List
  139. * Description: 将entry数组中节点按顺序添加到数据流中
  140. * Arguments : *stream 数据流句柄
  141. * *entry[] 数据流节点数组
  142. * num 节点总个数
  143. * Return : None.
  144. * Note(s) : None.
  145. *********************************************************************
  146. */
  147. void audio_stream_add_list(struct audio_stream *stream,
  148. struct audio_stream_entry *entry[], int num);
  149. /*
  150. *********************************************************************
  151. * Audio Stream Delete Entry
  152. * Description: 将节点从数据流中删除
  153. * Arguments : *entry 数据流节点句柄
  154. * Return : None.
  155. * Note(s) : None.
  156. *********************************************************************
  157. */
  158. void audio_stream_del_entry(struct audio_stream_entry *entry);
  159. /*
  160. *********************************************************************
  161. * Audio Stream Delete List Entry
  162. * Description: 依次将数组中的节点删除
  163. * Arguments : *entry[] 数据流节点数组
  164. * num 节点总个数
  165. * Return : None.
  166. * Note(s) : None.
  167. *********************************************************************
  168. */
  169. void audio_stream_del_list(struct audio_stream_entry *entry[], int num);
  170. /*
  171. *********************************************************************
  172. * Audio Stream Group Add Entry
  173. * Description: 将节点加入到群组之中
  174. * Arguments : *group 数据流群组句柄
  175. * *entry 数据流节点句柄
  176. * Return : None.
  177. * Note(s) : None.
  178. *********************************************************************
  179. */
  180. void audio_stream_group_add_entry(struct audio_stream_group *group,
  181. struct audio_stream_entry *entry);
  182. /*
  183. *********************************************************************
  184. * Audio Stream Group Delete Entry
  185. * Description: 将节点从群组之中删除
  186. * Arguments : *group 数据流群组句柄
  187. * *entry 数据流节点句柄
  188. * Return : None.
  189. * Note(s) : None.
  190. *********************************************************************
  191. */
  192. void audio_stream_group_del_entry(struct audio_stream_group *group,
  193. struct audio_stream_entry *entry);
  194. /*
  195. *********************************************************************
  196. * Audio Stream Group Get Entry Number
  197. * Description: 获取群组中的节点个数
  198. * Arguments : *group 数据流群组句柄
  199. * Return : 节点个数
  200. * Note(s) : None.
  201. *********************************************************************
  202. */
  203. int audio_stream_group_entry_num(struct audio_stream_group *group);
  204. /*
  205. *********************************************************************
  206. * Audio Stream Run
  207. * Description: 数据处理接口
  208. * Arguments : *entry 数据流节点句柄
  209. * *input 输入数据
  210. * Return : 负数-出错
  211. * Note(s) : 数据流依次递归往后传输。直到最后一个节点,或者no_subsequent==1,
  212. * 或者prob_handler/data_handler处理错误返回负数
  213. *********************************************************************
  214. */
  215. int audio_stream_run(struct audio_stream_entry *from, struct audio_data_frame *input);
  216. /*
  217. *********************************************************************
  218. * Audio Stream Resume
  219. * Description: 唤醒数据流
  220. * Arguments : *entry 数据流节点句柄
  221. * Return : 0-成功
  222. * Note(s) : 最终会递归调用到struct audio_stream结构体中的.resume回调接口
  223. *********************************************************************
  224. */
  225. int audio_stream_resume(struct audio_stream_entry *entry);
  226. /*
  227. *********************************************************************
  228. * Audio Stream Clear From Entry
  229. * Description: 清除指定节点及后续所有节点的数据
  230. * Arguments : *entry 数据流节点句柄
  231. * Return : None.
  232. * Note(s) : 会清除offset/pass_by等记录,并且调用data_clear回调接口清除用户数据
  233. *********************************************************************
  234. */
  235. void audio_stream_clear_from(struct audio_stream_entry *entry);
  236. /*
  237. *********************************************************************
  238. * Audio Stream Clear
  239. * Description: 清除数据流所有节点数据
  240. * Arguments : *stream 数据流句柄
  241. * Return : None.
  242. * Note(s) : 会清除offset/pass_by等记录,并且调用data_clear回调接口清除用户数据
  243. *********************************************************************
  244. */
  245. void audio_stream_clear(struct audio_stream *stream);
  246. /*
  247. *********************************************************************
  248. * Audio Stream Clear By Entry
  249. * Description: 通过数据流某个节点清除数据流所有节点数据
  250. * Arguments : *entry 数据流节点句柄
  251. * Return : None.
  252. * Note(s) : 先找到数据流起始位置,再调用audio_stream_clear()清除所有节点
  253. *********************************************************************
  254. */
  255. void audio_stream_clear_by_entry(struct audio_stream_entry *entry);
  256. /*
  257. *********************************************************************
  258. * Audio Stream Check Active From Entry
  259. * Description: 检测指定节点及后续节点是否有活动情况
  260. * Arguments : *entry 数据流节点句柄
  261. * Return : true 活动
  262. * Note(s) : 只要中间有某个节点活动就会返回数据流活动
  263. *********************************************************************
  264. */
  265. int audio_stream_check_active_from(struct audio_stream_entry *entry);
  266. /*
  267. *********************************************************************
  268. * Audio Stream Close
  269. * Description: 关闭数据流
  270. * Arguments : *stream 数据流句柄
  271. * Return : None.
  272. * Note(s) : 需关闭所有数据流节点之后才能调用该函数
  273. *********************************************************************
  274. */
  275. void audio_stream_close(struct audio_stream *stream);
  276. #endif