FramesPeriods
一个frame就等于一个要被播放的声音样本。与通道数和样本长度无关。
例子:
- 1帧立体声48khz 16位的pcm数据长度为4bytes
- 1帧5.1正道48k 16位pcm流的大小为12bytes
一个period就是每两次硬件中断之间的帧数。poll()会每个周期return一次。
buffer是一个环形buffer,大小一般来说比一个period size大,一般设做 2 * period size,但是一些硬件可以支持到8个周期大小的buffer,也可以设为非整数倍的period的大小。
现在如果我们的硬件设置为48khz,2周期,每个周期1024个帧,那么buffer size 就是2048个帧。硬件每处理一个buffer会中断2次,alsa会一直让buffer保持一个满的状态,每当第一个周期的样本播放完成,第二个周期的数据就会被播放,同时第三个周期的数据就会进入到第一个周期数据的位置。
例子
另一个例子:
假设我们将要使用一个立体声 16位 44.1k的音频流,单向(录音或者播放),那么我们就有
- 立体声 = 2通道
- 1个样本 16bits = 2bytes
- 1个帧 代表 所有通道的一个样本。那么我们现在是双通道,所以
- 1帧 = (通道数) * (样本大小bytes) = 2 * 2 = 4bytes
为了能支持2 * 44.1k的采样率,系统必须支持如下的速度
- bsp_rate = (通道数) * (1个样本长度) * (采样率) = 1帧 * 采样率 = 2 * 2 * 44.1k = 176400bytes/sec
图我就不挪了 自己看原版吧
现在 alsa每秒都中断。那么我们每秒都需要176400byte数据准备好,才能供上一个 双通道 16 位 44.1k的音频流。
- 如果半秒中断一次,那么每次终端就是 176400 / 2 = 88200 bytes
- 如果100ms中断一次,那么我们就需要 176400 * (0.1 / 1)= 17640 位。
我们可以通过设置period size 来控制pcm中断的产生。
- 如果我们设置一个16位双通道44.1k的音频流 并且每次都有4410帧数据 -》 4 byte * 4410frams = 17640字节 》一次中断会需要17640字节的数据 =》 那么他就是100ms中断一次。
alsa会自己觉得实际的buffer_size 和period_size,根据请求的通道数,和他们其他的一些属性。
下面是一个问题的回答:
帧代表一个单位 1帧 = 通道数 * 样本长度
在你的情况下,1帧占据了 2 通道* 16位 = 4个字节
周期数就是在环形buffer里面的
buffer_size = 周期大小 * 周期数
周期大小(bytes) = 周期大小 * byte每帧
byte每帧 = 通道数 * 每个样本的byte数
后面不愿意翻了 大概意思有了。
翻译的不太好。如果有错误,请告知,谢谢。