Когда PulseAudio стартует, оно захватывает устройства и если пробуем запустить какое-то приложение, которое может только ALSA, то получим сообщение о невозможности открыть устройство, так как оно уже занято.
Что бы решить проблему нужна пара простых (по факту, но не по пути, которым к ним пришёл) шагов. Но для начала нужно посмотреть соответствующий раздел в вики Арчика: https://wiki.archlinux.org/index.php/PulseAudio#ALSA.2Fdmix_without_grabbing_hardware_device
Идея проста: сказать пульсе работать через dmix для воспроизведения и через dsnoop для записи.
Что бы не гадить в системные файлы, будем настраивать для отдельного пользователя (при желании, можно в /etc/skel добавить).
Для начала нужно научить саму ALSA ходить в dmix/dsnoop по умолчанию. Правим файл ~/.asoundrc:
pcm.!default {
type plug
slave.pcm "duplex"
}
pcm.duplex {
type asym
playback.pcm "dmix"
capture.pcm "dsnoop"
}
Тут используется asym, дабы соединить dmix и dsnoop и перезаписывается правило для дефолтного аудио устройства.
Следующим шагом правим файл ~/.config/pulse/default.pa:
#!/usr/bin/pulseaudio -nF
load-module module-alsa-sink device=dmix
load-module module-alsa-source device=dsnoop
# include upstream settings
.include /etc/pulse/default.pa
# Set defaults to our mix devices
set-default-sink alsa_output.dmix
set-default-source 0 alsa_input.dsnoop
Всего пара штрихов добавленная к тому, что было в арчевики. Если не укажем дефолты для воспроизведения и записи, то будет модулем udev загружена карта, и дефолт будет сдвинут на неё. В результате ничего хорошего не получим.
Проверить воспроизведение просто, например при помощи VLC: vlc some_file.wav –aout=pulse vlc some_file.wav –aout=alsa
Запись: ffmpeg -f pulse -i default -y out_pulse.wav ffmpeg -f alsa -i default -y out_alsa.wav
Полезные ссылки и команды
- команды default.pa: https://manned.org/pulse-cli-syntax.5
- список устройств записи (pulse):
pacmd list-sources
- список устройств воспроизведение (pulse):
pacmd list-sinks