Pulseaudio

PulseAudio ALSA模組中的fragments和fragment_size是什麼意思?

  • July 4, 2019

根據一篇名為Pulseaudio And Latencymodule-alsa-sink的部落格文章的建議,我嘗試使用特殊fragments和參數載入fragment_size以確保低延遲。但是,我不確定這些到底在做什麼。報告的延遲pactl list sinks與我在這些參數中輸入的值沒有明顯的對應關係。這是我編寫的用於測試各種設置的簡短腳本:

pulseaudio &

# unload all sinks
pactl list sinks | grep "Owner Module" | \
   cut -d : -f 2 | \
   while read i; do
       pactl unload-module $i;
   done

# try different settings
patest () {
   pactl load-module module-alsa-sink device=$DEV \
         tsched=no \
         fixed_latency_range=yes \
         fragments=$F fragment_size=$FS > /tmp/modnum.out;
   pactl list sinks | grep Latency;
   pactl unload-module $(cat /tmp/modnum.out)
}
patest_nofix () {
   pactl load-module module-alsa-sink device=$DEV > /tmp/modnum.out;
   pactl list sinks | grep Latency;
   pactl unload-module $(cat /tmp/modnum.out)
}

fragments現在我可以嘗試(F)和fragment_size(FS)的各種設置。對於硬體設備“hw:0”,延遲很低,但我看不出它與兩個參數的對應關係:

F=1; FS=15; DEV=hw:0; patest
#        Latency: 2516 usec, configured 1451 usec
F=1; FS=30; DEV=hw:0; patest
#        Latency: 2484 usec, configured 1451 usec
F=5; FS=15; DEV=hw:0; patest
#        Latency: 2475 usec, configured 1451 usec
F=50; FS=200; DEV=hw:0; patest
#        Latency: 57628 usec, configured 56689 usec

# (default minimum latency:)
DEV=hw:0; patest_nofix 
#        Latency: 1983968 usec, configured 2000000 usec

對於“dmix” ALSA 設備,它有點高,不知道為什麼:

F=1; FS=15; DEV=dmix; patest
#        Latency: 42752 usec, configured 42666 usec

# (default:)
DEV=dmix; patest_nofix
#        Latency: 326596 usec, configured 341333 usec

但是,當我創建自己的“dmix”設備以輸出到 hw:0 時,

$ cat ~/.asoundrc
...
pcm.hw0mix {
   type dmix
   ipc_key 2498 # unique random number
   slave {
       pcm "hw:0,0"
       channels 2
       rate 48000
   }
}

然後我可以看到延遲要高得多,並且似乎固定在 0.25 秒:

F=1; FS=15; DEV=hw0mix; patest
#        Latency: 251132 usec, configured 250000 usec
F=50; FS=200; DEV=hw0mix; patest
#        Latency: 251126 usec, configured 250000 usec

# (default:)
DEV=hw0mix; patest_nofix
#        Latency: 356292 usec, configured 375000 usec

fragments參數和和“配置的延遲”之間有什麼關係fragment_size,如何將配置的最小延遲更改為更低,即使對於非硬體 ALSA 設備也是如此?

有關片段/週期的說明,請參閱https://www.alsa-project.org/wiki/FramesPeriods>,另請參閱<https://juho.tykkala.fi/Pulseaudio-and-latency了解 Pulseaudio 調整技巧。

Pulseaudio 也進行混音,因此通過將其與 dmix 結合使用,您可能會在設置中出現一些重複。

dmix 使用 ALSA 外掛層,因此它總是會增加一些延遲。為了盡可能降低延遲,您可以直接使用 hw: 設備並在模擬端混合源。

但是,通過正確的系統配置,應該可以使用 dmix 作為 pulseaudio 的替代品,並且在大多數情況下保持不明顯的延遲。251ms 是多餘的,應該可以得到很多,比使用 dmix 低很多。

該工具https://github.com/raboof/realtimeconfigquickscan可能有助於辨識系統配置的任何方面導致過度延遲。

引用自:https://unix.stackexchange.com/questions/477463