对于Alsa pcm设备,period_size设置为128,但有时轮询会延迟



我面临一个问题,周期大小已设置为128,但有时轮询开始较晚
对于此配置,周期大小设置为128,速率为16Khz,因此轮询应在每128/16=8毫秒之后进行,但在某些情况下,轮询发生得有点晚,这会导致应用程序中出现某些问题
由于轮询是由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

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

最新更新