sound.rst 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. .. ARU (c) 2018 - 2025, Pavel Priluckiy, Vasiliy Stelmachenok and contributors
  2. ARU is licensed under a
  3. Creative Commons Attribution-ShareAlike 4.0 International License.
  4. You should have received a copy of the license along with this
  5. work. If not, see <https://creativecommons.org/licenses/by-sa/4.0/>.
  6. .. _sound:
  7. **********************
  8. Низкие задержки звука
  9. **********************
  10. .. index:: installation, lowlatency, audio, pipewire
  11. .. _pipewire:
  12. ========
  13. PipeWire
  14. ========
  15. `PipeWire <https://wiki.archlinux.org/title/PipeWire_(Русский)>`__ -
  16. это новая альтернатива PulseAudio, которая призвана избавить от
  17. проблем своего предшественника, уменьшить задержки звука, снизить
  18. потребление памяти и улучшить безопасность. PipeWire поставляется по
  19. умолчанию в Arch Linux в качестве звукового сервера, требуемого для
  20. клиентов libpulse [#]_, так что никаких команд для его установки
  21. прописывать не нужно. Однако несмотря на это рекомендуется установить
  22. дополнительные компоненты и явно включить пользовательские службы для
  23. уменьшения их задержки запуска через активацию путем сокетов, которая
  24. используется по умолчанию для запуска PipeWire::
  25. sudo pacman -S pipewire-jack lib32-pipewire gst-plugin-pipewire
  26. systemctl --user enable --now pipewire pipewire-pulse wireplumber
  27. .. note:: Пакет ``lib32-pipewire`` нужен для правильной работы звука в
  28. 32-битных играх запускаемых через Wine или Proton, а также в нативных портах
  29. игр под Linux.
  30. Для непосредственно уменьшения самих задержек установим дополнительный
  31. пакет ``realtime-privileges`` и добавим пользователя в группу
  32. ``realtime``::
  33. sudo pacman -S realtime-privileges rtkit
  34. sudo usermod -aG realtime "$USER"
  35. Дополнительно советуем установить реализацию Jack API. См. раздел
  36. ниже.
  37. .. [#] https://gitlab.archlinux.org/archlinux/packaging/packages/pipewire/-/commit/14614b08f6f8cf8e50b4cbb78a141e82066e7f80
  38. .. index:: pipewire, lowlatency, audio, sound
  39. .. _pipewire_setup:
  40. --------------------
  41. Настройка PipeWire
  42. --------------------
  43. Несмотря на то, что настройки по умолчанию могут работать достаточно
  44. хорошо для большинства оборудования, имеет смысл выполнить
  45. дополнительную настройку для улучшения качества звука (особенно если
  46. вы являетесь обладателем ЦАП или полноценной звуковой карты).
  47. Сначала создадим пути для хранения конфигурационных файлов в домашней
  48. директории::
  49. mkdir -p ~/.config/pipewire/pipewire.conf.d
  50. В появившейся директории создадим файл со следующим содержанием:
  51. .. code-block:: shell
  52. :caption: ``nano ~/.config/pipewire/pipewire.conf.d/10-no-resampling.conf``
  53. context.properties = {
  54. default.clock.rate = 48000
  55. default.clock.allowed-rates = [ 44100 48000 96000 192000 ]
  56. }
  57. Фактически здесь мы настраиваем две вещи: первое, это частота дискретизации,
  58. используемая по умолчанию (``defalut.clock.rate``), в зависимости от которой
  59. PipeWire так же считает оптимальные задержки для вывода звука, а именно так
  60. называемые значения ``quantum``, о которых будет рассказано в следующем
  61. разделе. Во-вторых, мы явно перечисляем все доступные частоты дискретизации
  62. (``defalut.clock.allowed-rates``), поддерживаемые нашим устройством вывода
  63. звука (ЦАП или встроенная аудиокарта). Это нужно для того, чтобы PipeWire не
  64. делал ресемплирования, то есть изменения частоты дискретизации исходного
  65. аудиопотока к частоте используемой по умолчанию, что может повлечь за собой
  66. ухудшение качества итогового звучания, а также дополнительные накладные расходы
  67. в виде нагрузки на CPU.
  68. Важно отметить, что PipeWire выполняет переключение между указанными частотами
  69. дискретизации только в состоянии покоя непосредственно перед началом вывода
  70. нового аудиопотока, однако если вы начинаете проигрывать ещё один аудиопоток,
  71. то PipeWire не поменяет частоту дискретизации с учетом второго аудиопотока, а
  72. продолжит использовать ту же частоту дискретизации, что и у первого, и это
  73. может опять же привести к ситуации ресемплинга второго аудиопотока до уровня
  74. первого. В случае же если первоначальный аудиопоток не попадал в указанный
  75. диапозон частот, то он также бы ресемплировался от целовой к самой "ближайшей"
  76. частоте из перечисленных.
  77. Чтобы узнать весь диапозон частот доступных для вашего устройства, следует
  78. использовать данную команду:
  79. .. tab-set::
  80. .. tab-item:: Звуковой чип
  81. ::
  82. cat /proc/asound/card0/codec\#0 | grep -A 8 "Audio Output" -m 1 | grep rates
  83. .. tab-item:: ЦАП
  84. ::
  85. cat /proc/asound/card0/stream0 | grep Rates | uniq
  86. Частоты, которые были получены таким образом, нужно прописать через пробел
  87. взамен тех, что даны в примере выше. Если доступно несколько устройств, то при
  88. помощи команды ``cat /proc/asound/cards`` узнайте номер звуковой карты, которая
  89. используется непосредственно для вывода звука, и подставьте его в команду выше.
  90. .. index:: pipewire, upmix, 5.1, sound
  91. .. _upmixing-5.1:
  92. ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  93. Микширование стерео в 5.1
  94. ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  95. PipeWire так же как и PulseAuido позволяет микшировать звук в 5.1.
  96. Эта возможность отключена по умолчанию, но для неё существует заранее
  97. подготовленный конфигурационный файл, который нам нужно просто
  98. перенести в домашнюю директорию::
  99. mkdir -p ~/.config/pipewire/pipewire-pulse.conf.d ~/.config/pipewire/client-rt.conf.d
  100. cp /usr/share/pipewire/client-rt.conf.avail/20-upmix.conf ~/.config/pipewire/pipewire-pulse.conf.d
  101. cp /usr/share/pipewire/client-rt.conf.avail/20-upmix.conf ~/.config/pipewire/client-rt.conf.d
  102. .. index:: pipewire, choppy, high-load, cpu, sound
  103. .. _choppy-audio:
  104. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  105. Исправление хрипов под нагрузкой
  106. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  107. Некоторые пользователи после перехода на PipeWire могут столкнуться с
  108. появлением "хрипов" во время произведения звука, если система находится
  109. под высокой нагрузкой (например, фоновой компиляцией или во время игры).
  110. Это происходит потому, что PipeWire старается осуществлять вывод с
  111. звука с наименьшими задержками, что сложно гарантировать когда
  112. система нагружена даже с установленными ``realtime-privileges``.
  113. Для их исправления отредактируем файл, который мы создали выше, и
  114. изменим следующие значения для размера буфера по умолчанию:
  115. .. code-block:: shell
  116. :caption: ``nano ~/.config/pipewire/pipewire.conf.d/10-sound.conf``
  117. context.properties = {
  118. default.clock.rate = 48000
  119. default.clock.allowed-rates = [ 44100 48000 88200 96000 ]
  120. default.clock.min-quantum = 512
  121. default.clock.quantum = 4096
  122. default.clock.max-quantum = 8192
  123. }
  124. Здесь вы должны изменить только значение параметра ``quantum`` до
  125. 4096. Остальные значения как ``default.clock.rate`` и
  126. ``default.clock.allowed-rates`` вы должны указывать с учетом
  127. вашего оборудования, как уже говорилось выше.
  128. .. jack:
  129. ----
  130. JACK
  131. ----
  132. JACK - это ещё один альтернативный звуковой сервер с одноименной
  133. библиотекой API, цель которого состоит выведение звука с минимальной
  134. задержкой. Несмотря на неплохую поддержку JACK со стороны многих
  135. приложений, автор рекомендует по прежнему использовать звуковой сервер
  136. PipeWire, так как актуальная реализация JACK - `jack2
  137. <https://github.com/jackaudio/jack2>`__, практически не получает
  138. серьёзных улучшений и находится скорее в состоянии сопровождения.
  139. Для правильной работы приложений использующих JACK в качестве
  140. библиотеки API лучше всего установить пакет ``pipewire-jack``, который
  141. предоставляет совместимость между такими приложениями со звуковым
  142. сервером PipeWire, что позволяет всем изменениям проделенным выше для
  143. его настройки распространяться и на приложения, использующие JACK.
  144. .. vim:set textwidth=70: