Audio参数讲解
创始人
2024-03-19 15:08:43
0

一、音频基础参数

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

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...