对于 Alsa pcm 设备,period_size 设置为 128,但有时轮询发生较晚

Posted

技术标签:

【中文标题】对于 Alsa pcm 设备,period_size 设置为 128,但有时轮询发生较晚【英文标题】:For Alsa pcm device, period_size is set to 128, yet sometimes the poll happens late 【发布时间】:2020-11-19 11:02:59 【问题描述】:

我遇到的问题是周期大小已设置为 128,但有时轮询开始较晚。 对于此配置,周期大小设置为 128,速率为 16 Khz,因此应在每 128/16 = 8 ms 之后进行轮询,但在某些情况下,轮询发生得有点晚,这会导致应用程序出现某些问题。 因为,轮询是由依赖于配置的 Alsa 系统模块在内部触发的,如果我们在配置的某个地方出错或任何人可能遇到的任何类似问题,请提出建议。在下面粘贴我的设置的 PCM 转储:-

APCM_DUMP_DEVICE_DETALS :-
Hardware PCM card 0 'mt2712-d1v1' device 5 subdevice 0
Its setup is:
stream       : CAPTURE
access       : RW_INTERLEAVED
format       : S16_LE
subformat    : STD
channels     : 1
rate         : 16000
exact rate   : 16000 (16000/1)
msbits       : 16
buffer_size  : 512
period_size  : 128
period_time  : 8000
tstamp_mode  : NONE
tstamp_type  : MONOTONIC
period_step  : 1
avail_min    : 128
period_event : 0
start_threshold  : 128
stop_threshold   : 512
silence_threshold: 0
silence_size : 0
boundary     : 4611686018427387904
appl_ptr     : 0
hw_ptr       : 0

APCM_DUMP_DEVICE_DETALS :-
Hardware PCM card 0 'mt2712-d1v1' device 1 subdevice 0
Its setup is:
stream       : PLAYBACK
access       : RW_INTERLEAVED
format       : S16_LE
subformat    : STD
channels     : 1
rate         : 16000
exact rate   : 16000 (16000/1)
msbits       : 16
buffer_size  : 512
period_size  : 128
period_time  : 8000
tstamp_mode  : NONE
tstamp_type  : MONOTONIC
period_step  : 1
avail_min    : 128
period_event : 0
start_threshold  : 128
stop_threshold   : 512
silence_threshold: 0
silence_size : 0
boundary     : 4611686018427387904
appl_ptr     : 0
hw_ptr       : 0

APCM_DUMP_DEVICE_DETALS :-
Hardware PCM card 0 'mt2712-d1v1' device 12 subdevice 0
Its setup is:
stream       : CAPTURE
access       : RW_INTERLEAVED
format       : S16_LE
subformat    : STD
channels     : 1
rate         : 16000
exact rate   : 16000 (16000/1)
msbits       : 16
buffer_size  : 512
period_size  : 128
period_time  : 8000
tstamp_mode  : NONE
tstamp_type  : MONOTONIC
period_step  : 1
avail_min    : 128
period_event : 0
start_threshold  : 128
stop_threshold   : 512
silence_threshold: 0
silence_size : 0
boundary     : 4611686018427387904
appl_ptr     : 0
hw_ptr       : 0

APCM_DUMP_DEVICE_DETALS :-
Hardware PCM card 0 'mt2712-d1v1' device 11 subdevice 0
Its setup is:
stream       : PLAYBACK
access       : RW_INTERLEAVED
format       : S16_LE
subformat    : STD
channels     : 1
rate         : 16000
exact rate   : 16000 (16000/1)
msbits       : 16
buffer_size  : 512
period_size  : 128
period_time  : 8000
tstamp_mode  : NONE
tstamp_type  : MONOTONIC
period_step  : 1
avail_min    : 128
period_event : 0
start_threshold  : 128
stop_threshold   : 512
silence_threshold: 0
silence_size : 0
boundary     : 4611686018427387904
appl_ptr     : 0
hw_ptr       : 0

【问题讨论】:

硬件有问题,mt2712 驱动程序有问题,或者其他一些驱动程序/进程占用了 CPU。 不是定期观察,而是偶尔发生,您能否提出进一步调查的建议。 @CL。抱歉响应迟了,在查看内核跟踪后,我们发现我们正在读取捕获设备的全部可用数据(snd_pcm_avail_update),因此内核中的一个标志设置为 0,因为它有 0 个字节可用它错过了及时唤醒读取线程的中断。一旦我们将 pcm_read 设置为只读取所需的数据,该行为就会得到纠正。 【参考方案1】:

针对这个问题,我们尝试分析内核跟踪,通过内核跟踪后,我们发现我们正在读取捕获设备的全部可用数据(snd_pcm_avail_update)(而不是 period_size),因此内核中的一个标志设置为 0,因为它有 0 个字节可用,因此它错过了及时唤醒读取线程(应用程序)的中断。一旦我们将 pcm_read 设置为只读取所需的数据,该行为就会得到纠正

【讨论】:

以上是关于对于 Alsa pcm 设备,period_size 设置为 128,但有时轮询发生较晚的主要内容,如果未能解决你的问题,请参考以下文章

Alsa中PCM参数设置

Linux ALSA声卡驱动之三:PCM设备的创建

Linux ALSA驱动之三:PCM创建流程源码分析(基于Linux 5.18)

Linux ALSA驱动之三:PCM创建流程源码分析(基于Linux 5.18)

Linux ALSA驱动之三:PCM创建流程源码分析(基于Linux 5.18)

Linux ALSA 之三:简单的 ALSA Driver 实现