本文主要讨论pulseaudio模块的数据流。这里的模块(module)主要限制在sink和source这两种类型。其他类型的数据流后续有空
再撰文讨论。
pulseaudio的模块一般会启动一路线程进行数据的搬运和处理。
下面的是module-null-source模块的数据搬运线程启动代码。
进入thread_func函数内部看看函数做了哪些工作。
a.设置线程优先级。
b.设置消息处理队列。
c.for循环处理数据。
接下来看看for循环里面如何处理数据。
1.获取当前的系统时间。
2.判断是否到了新的一次写数据周期
3.向pulseaudio申请内存块memblock。
4.往内存块里写数据。
5.通知pulseaudio框架往内存块数据写完毕, 并释放内存块。
6.统计处理数据的时长。
7.设置定时器到下一个写数据的周期
8.休眠等待计时器以及货区本次休眠的时长。
整个搬运数据的过程中我们比较关注的就是u->block_usec。这个变量决定了每个读写周期的时长(不考虑系统抖动的情况下)以及每次读写数据的时长。这个时长最好和底层的硬件读写数据周期时长保持一致!!!!!!!!!!!!!!!