【发布时间】:2018-11-04 05:50:45
【问题描述】:
我正在编写一个典型的捕获过程回放循环。使用snd_pcm_readi() 捕获一些廉价的音频处理,然后通过snd_pcm_writei() 播放。单线程。
在 128 周期大小和 96000KHz 下,我无法察觉任何延迟。很好。
我会定期遇到缓冲区不足(snd_pcm_writei() 返回 -EPIPE);没关系,我正在运行未配置为低音频延迟的常规 Ubuntu 16.04 桌面。
在一些欠载之后,延迟变得可察觉。我不明白为什么。
这是我的捕获设备配置:
Plug PCM: Linear Integer <-> Linear Float conversion PCM (S32_LE)
Its setup is:
stream : CAPTURE
access : RW_INTERLEAVED
format : FLOAT_LE
subformat : STD
channels : 1
rate : 96000
exact rate : 96000 (96000/1)
msbits : 32
buffer_size : 4096
period_size : 128
period_time : 1333
tstamp_mode : NONE
tstamp_type : MONOTONIC
period_step : 1
avail_min : 128
period_event : 0
start_threshold : 0
stop_threshold : 4096
silence_threshold: 0
silence_size : 0
这是播放设备配置:
Plug PCM: Linear Integer <-> Linear Float conversion PCM (S32_LE)
Its setup is:
stream : PLAYBACK
access : RW_INTERLEAVED
format : FLOAT_LE
subformat : STD
channels : 1
rate : 96000
exact rate : 96000 (96000/1)
msbits : 32
buffer_size : 384
period_size : 128
period_time : 1333
tstamp_mode : NONE
tstamp_type : MONOTONIC
period_step : 1
avail_min : 128
period_event : 0
start_threshold : 384
stop_threshold : 384
silence_threshold: 0
silence_size : 0
boundary : 6917529027641081856
当发生欠载时,我运行snd_pcm_recover() 并忘记了刚刚被snd_pcm_writei() 拒绝的音频时段。在我看来,只要我运行snd_pcm_writei(),就会播放下一个音频时段,我将再次进入低延迟循环。但这是错误的,延迟会增加。
我的循环的捕获端没有错误。
发生了什么事?我究竟做错了什么?
谢谢。
【问题讨论】: