对于 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,但有时轮询发生较晚的主要内容,如果未能解决你的问题,请参考以下文章
Linux ALSA驱动之三:PCM创建流程源码分析(基于Linux 5.18)
Linux ALSA驱动之三:PCM创建流程源码分析(基于Linux 5.18)