一、音频基础参数
frame_bits 一帧数据的位数比如 :16bits 2ch frame_bits = 16*2
sample_bits 采样位数 比如16bit 24bit 32bit
period_size 指一个周期包含多少帧
periods 每次处理AD/DA转换的间隔周期
内核可以缓冲很多周期的数据,每个周期都会生成一个中断和一个副本,用户层可以间隔很长时间再处理一次,一次可以处理多个周期的数据
buffer_size
= period_size * periods
params_periods 宏从 hw_params 中提取出对应的 periods。
period_bytes_min /* min period size */ 和定义的最小和最大的 period size。
periods_max 和 periods_min 定义了最大和最小的 periods。
periods 信息和 OSS 中的 fragment 相对应。period 定义了 PCM 中断产生的周期。这个周期非常依赖硬件。
一般来说,一个更短的周期会提供更多的中断和更多的控制。如在录音中,周期大小定义了输入延迟,另外,整个缓存区大小也定义了播放的输出延迟。
二、音频硬件参数举例
static const struct snd_pcm_hardware dummy_pcm_hardware = {
.info = SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED
| SNDRV_PCM_INFO_RESUME | SNDRV_PCM_INFO_MMAP_VALID,
.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE
| SNDRV_PCM_FMTBIT_S32_LE,
.rate_min = 8000,
.rate_max = 192000,
.channels_min = 1,
.channels_max = 16,
.period_bytes_min = 256,
.period_bytes_max = 1024 * 16,
.periods_min = 2,
.periods_max = 4096,
.buffer_bytes_max = 1024*1024,
.fifo_size = 256,
};
应用层pcminfo显示:
Info for card 0, device 1:
PCM out:
Access: 0x000009
Format[0]: 0x000444
Format[1]: 00000000
Format Name: S16_LE, S24_LE, S32_LE
Subformat: 0x000001
Rate: min=8000Hz max=192000Hz
Channels: min=1 max=16
Sample bits: min=16 max=32
Period size: min=4 max=8192
Period count: min=2 max=4096
PCM in:
Access: 0x000009
Format[0]: 0x000444
Format[1]: 00000000
Format Name: S16_LE, S24_LE, S32_LE
Subformat: 0x000001
Rate: min=8000Hz max=192000Hz
Channels: min=1 max=16
Sample bits: min=16 max=32
Period size: min=4 max=8192
Period count: min=2 max=4096
上面示例,定义了该I2S支持最大16通道,最小1通道,最大period_bytes 1024*16
不管你是使用1通道还是16通道,最大period_bytes 1024*16 不变。
所以在tinyplay播放1通道和16通道所支持的-p 参数是不同的,注意tinyplay的-p指的是
多少个frame,一个frame大小与通道数和bits都有关系,但需要保证
frames_bytes*period_size = period_bytes不超过1024*16 bytes。
比如播放48K 2ch 32bits音频:-p 最大2048,2048*2ch*(32bites/8) = 1024*16
若播放8ch 32bits -p 就是512,16ch 32bits就是 256。
说说为什么应用层显示Period size min=4 max=8192
首先这个地方Period size 单位也是frame的个数
min=4的由来:period_bytes_min = 256,max_ch=16,max_bits=32,所以
Period size min= 256/16/(32/8) = 4
max=8192的由来:min_ch=1,min_bits=16
Period size max = 16*1024/1/(16/8) = 8192
由上可知,Period size的范围并不适用所有音频文件,要根据具体音频参数来计算
说说Period count计算:tinypcminfo显示与驱动配置相同
但是具体能支持最大多少Period count,还受其他参数影响
根据上述驱动定义,最大buffer_size = 1024*1024,即1M
需确保period_bytes* Period count <= 1Mbytes
所以当播放48K 2ch 32bits,使用-p 2048时,Period count最大是64