V rámci PW to lze, v podstatě to znamená, že nebude docházet k mixování, node má sink jen sám pro sebe. Ale jakmile se něco připojí na alsí zařízení, už je to natvrdo, ani PW s tím nic neudělá.
Určitě by se dalo upravit ALSA API, aby tam byla např. nějaká priorita klientů, řešilo to odpojování atp. Exkluzivní přístup, ve smyslu - klient má výhradní kontrolu nad zařízením, je tam tak nějak od začátku. Ale obávám se, že po tom není extra poptávka, navíc je vcelku jednoznačný trend zachovat to jako specifické low-level rozhraní a všechny věci okolo pokročilejší správy přístupů řešit nad tím v PipeWire.
S ohledem na tu zmíněnou situaci mě teď napadají v podstatě tři scénáře.
1) na zvukovku vůbec nemusím přistupovat přes PW, mám ji vyhrazenou jen pro specifické aplikace s nativním ALSA API. To je nejjednodušší, vyřadím jí pomocí WirePlumberu, jak jsem psal.
2) budu v pohodě, když se bude používat emulované ALSA rozhraní z PipeWire
poměrně hodně toho můžu nastavit buď configu nebo přes systémové proměnné.. V proměnné PIPEWIRE_NODE ho přímo nasměruju na konkrétní sink resp. source. Pomocí PIPEWIRE_ALSA mu zas můžu dát konkrétní nastavení.
Takže třeba takhle si udělám zmíněný exkluzivní přístup (žádný jiný klient v tu chvíli nesáhne na ten sink nebo source):
PIPEWIRE_ALSA='{ node.exclusive=true }' aplay -D pipewire ./test.wav
Napadají mě jen dvě situace, kdy by mi to mohlo vadit - chtěl bych co nejmenší latenci nebo bych z nějakého důvodu používal mmap přístup na zařízení (který PW emulace neumí).
3) v momentě, kdy budu na ALSA zvukovku přistupovat aplikací přímo bez PW, tak si ji zamknu pomocí příkazu pw-reserve.
https://docs.pipewire.org/page_man_pw-reserve_1.htmlJakmile aplikaci skončím, zase zámek pustím, aby se dala standardně používat přes PW.
Tzn. napíšu si buď nějaký wrapper script, nebo když to bude služba, tak třeba využiju ExecStartPre= atp.
Ukázka s komentářem:
#!/usr/bin/env bash
# Číslo karty v /proc/asound, buď se nemění a vím ho, nebo si ho vyparsuju podle názvu
CARD_NUM=1
# Název pro rezervaci je vždycky Audio a číslo, dá se zjistit i přes pw-dump
# řádek např. "api.dbus.ReserveDevice1": "Audio1"
RESERVE_DEV="Audio${CARD_NUM}"
echo "Requesting reservation for ALSA card $CARD_NUM..."
pw-reserve -n $RESERVE_DEV -r &
RESERVE_PID=$!
# zůstává běžet jako proces na pozadí, uložím si PID
# nastavím trap, aby ho ukončil, ať už skript doběhne, nebo se ukončí natvrdo
trap 'echo "Releasing reservation..."; kill $RESERVE_PID; exit' EXIT INT TERM
# Bulharská konstanta, než se zavřou připojení klienti.
# Dalo by se udělat líp, kdy bych čekal, až bude zařízení volné.
sleep 1
# Původní aplikace.. např.
aplay -D plughw:${CARD_NUM},0 "$@"