Вопрос или проблема
Могут ли приложения, использующие PulseAudio, воспроизводить звук одновременно с приложениями, использующими ALSA?
Или, другими словами, можно ли запускать процессы PulseAudio и ALSA одновременно без взаимного исключения на аудиоустройствах?
Этот вопрос похож на эту тему здесь
Не удается воспроизводить звук одновременно в VLC и браузере
Ниже приведена информация о моей операционной системе Linux
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Release: 22.04
Codename: jammy
uname -a
Linux 6.8.0-52-generic #53~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jan 15 19:18:46 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
Похоже, что есть взаимное исключение между ALSA и PulseAudio при использовании одного и того же аудиоустройства.
Когда сначала запускается процесс PulseAudio, например, YouTube в веб-браузере, это работает нормально, но затем при запуске другого процесса, например, VLC, установленного на использование ALSA, появляются такие ошибки
“PCH [HDA Intel PCH] device or resource busy
Audio output failed:
The audio device “dmix:CARD=PCH,DEV=0″ could not be used:”
Здесь процесс PulseAudio захватил аудиовыходное устройство.
С другой стороны, когда сначала запускается процесс, например, VLC, установленный на использование ALSA, это работает нормально, но затем при попытке запустить процесс PulseAudio, например, YouTube в веб-браузере, он зависает без уведомления, что делает довольно сложным выявление причины проблемы.
Здесь процесс ALSA захватил аудиовыходное устройство.
Я использую эти команды, чтобы выяснить, какие процессы используют какие аудиоустройства.
sudo fuser -fv /dev/snd/*
sudo lsof /dev/snd/*
Одним из решений было бы использовать только PulseAudio повсюду или использовать только ALSA повсюду. Но проблема в том, что некоторые приложения работают лучше с PulseAudio, а другие — с ALSA.
Так что вопрос в том, возможно ли внести какие-то изменения в Linux, чтобы можно было воспроизводить звук одновременно из процессов PulseAudio и ALSA без каких-либо проблем?
Ответ или решение
Теория
Вопрос об одновременном использовании PulseAudio и ALSA на Linux вызывает интерес из-за различных задач, которые выполняют эти аудиосистемы, и способа, которым они управляют доступом к аудиоустройствам. PulseAudio и ALSA — это два уровня аудиоархитектуры, и их совместная работа может потребовать определенной конфигурации.
ALSA (Advanced Linux Sound Architecture) — это низкоуровневая инфраструктура для работы со звуком в Linux, обеспечивающая прямой доступ к аудиоустройствам. Она поддерживает все основные функции и предлагает интерфейсы для взаимодействия с аудиоборудованием.
PulseAudio, в свою очередь, является сервером звука, который работает поверх ALSA и предлагает множество дополнительных возможностей, таких как управление громкостью, маршрутизация звуковых потоков и работа с сетевыми аудиопотоками. PulseAudio взаимодействует с ALSA как с базовым уровнем для доступа к аудиоустройствам.
Проблема, описанная в вопросе, заключается в одновременном использовании обоих систем для разных приложений без взаимной блокировки доступа к аудиоустройствам.
Пример
На вашем Ubuntu 22.04.5 LTS, когда вы одновременно запускаете процессы, использующие разные аудиосистемы (например, PulseAudio для YouTube в браузере и ALSA для VLC), возникает конфликт. Один процесс блокирует доступ к аудиоустройству, в то время как другой пытается его занять, что вызывает ошибки вида "device or resource busy".
Понимание того, кто использует устройства, можно получить с помощью команд sudo fuser -fv /dev/snd/*
и sudo lsof /dev/snd/*
. Эти команды показывают текущие процессы, которые используют аудиоинфраструктуру ALSA.
Применение
Чтобы решить проблему одновременного использования PulseAudio и ALSA, можно предпринять несколько стратегий.
- Использовать плагин ALSA -> PulseAudio: Вы можете настроить систему так, чтобы ALSA использовала PulseAudio в качестве своей звуковой подсистемы. Это позволяет ALSA-процессам выводить звук через PulseAudio. Для этого вам нужно будет отредактировать конфигурационные файлы ALSA.
Файл конфигурации ALSA /etc/asound.conf
или ~/.asoundrc
может содержать:
pcm.!default {
type pulse
hint {
show on
description "PulseAudio Sound Server"
}
}
ctl.!default {
type pulse
}
Эта конфигурация направляет все аудиовыходы ALSA через PulseAudio, что устраняет конкуренцию за аудиоустройства.
-
Использовать dmix для ALSA: Если вы хотите использовать только ALSA без PulseAudio, вы можете использовать плагин ALSA dmix, который позволяет микшировать несколько аудиопотоков в одно устройство. Однако это может быть сложнее настроить и не имеет всех преимуществ PulseAudio.
-
Переходить к PipeWire: В недавних версиях дистрибутивов Linux появилась поддержка PipeWire, который может заменить и PulseAudio, и ALSA, предложив единую систему для управления звукозаписью и воспроизведением. PipeWire более современен и управляет конфликтами устройств более эффективно.
Таким образом, основная рекомендация — переход к использованию PulseAudio в качестве единой системы звукового сервера, перенаправляя все потоки через него. Это обеспечит наилучшую совместимость и позволит избежать конфликтов за ресурсы устройства. Однако, если вы столкнетесь с трудностями в настройке или предпочтете использовать только ALSA, дополнительные решения, такие как dmix или переход к PipeWire, также могут быть рассмотрены.