Nejjednodušší varianta je k tomu přistupovat přímo přes konkrétní ALSA zařízení.
Bude to fungovat i na nějakém minimálním headless RPi bez grafického rozhraní, stačí mít nainstalovanou knihovnu ALSA libasound2 a alsa-utils + přímé závislosti.
Pokud to zkoušíte na nějakém stroji s DE (KDE, GNOME), bude nad tím sedět ještě pravděpodobně další vrstva - PipeWire (audio server) spolu s WirePlumber (nástroj pro její dynamickou konfiguraci). Pokud nějaká typická GUI aplikace (VLC, prohlížeč, DAW) používá audio zařízení, tak ve výchozím stavu přistupuje na právě přes PipeWire server. Buď nativním rozhraním nebo přes emulaci (PulseAudio, JACK, emulované ALSA rozhraní).
Za normálních okolností to ale to, že je to zařízení mimo ALSU napřímo přístupné také přes PipeWire, nemusí vůbec vadit. Protože pokud v tu chvíli nebude mít žádná aplikace zařízení aktivně otevřené (přehrávání, nahrávání) přes PipeWire, tak je normálně použitelné rovnou přes ALSU.
V nejhorším se dá také udělat pravidlo ve WirePlumberu, kde se zařízení pro PipeWire kompletně zakáže. Ale jak jsem zmiňoval, nebývá to nezbytně nutné a v případě headless RPi, tam tyhle další vrstvy vůbec nemusíte mít.
A teď jak tam přehrávat vícekanálový wav.
Nejdřív si vypíšu názvy ALSA hw zařízení přes příkaz: aplay -l
mám např. vícekanálovou PCIe zvukovku, která má název: HDSPMxcb26e5
card 2: HDSPMxcb26e5 [RME AIO_cb26e5], device 0: RME AIO [RME AIO]
Subdevices: 1/1
Subdevice #0: subdevice #0
Dá se použít i index (v mém případě: 2), ale název je lepší, protože se nemění při různém pořadí zavádění modulů, připojování USB zařízení atp.
Teď základní test.
speaker-test -D plughw:HDSPMxcb26e5 -c 16
Program pouští testovací šum postupně do všech kanálů v zařízení, v počtu specifikovaném pomocí parametru -c.. (já mám 16 kanálovou zvukovku, a takhle bych otestovat všechny kanály, ale může otestovat klidně jen třeba první 4). Při testu to vypisuje aktuální číslo kanálu.
Důležitý parametr pak je -D, kde se zadává název zařízení. Pokud bych tam zadal pouze HDSPMxcb26e5, tak bych musel mít přesný počet výstupních kanálů a sample formát, který konkrétní zvukovka vyžaduje (např. S32_LE, S24_3LE, jak zmiňoval Redustin atp.).
Ale tím, že jsem před to napsal
plughw:, tak se tam automaticky vřadí ALSA plugin, který sample formát převede a počty kanálů automaticky upraví podle výstupního zařízení.
Pokud jsem s tím v pohodě, můžu zkusit zahrát ten vícekanálový (poly) wav. Řekněme, že by měl třeba 8 kanálů..
aplay -D plughw:HDSPMxcb26e5 ./multichannel.wav
Tohle by mi mělo zahrát wav tak, že bude mapování kanálů 1:1. Tzn. zahraje mi to z prvních osmi kanálů na zvukovce (moje má 16), v těch zbylých bude ticho.
Což je jeden ze způsobů, jak k tomu přistupovat. Pokud mi nebude vyhovovat pořadí, můžu si to proházet přímo při přípravě toho wavu (v DAW) a nebo přepojit ty výstupní TRS jacky na zvukovce

Pokud bych to chtěl někam posunout (hrát např. z posledních osmi) nebo proházet pořadí, tak to bude vyžadovat vytvoření virtuálního ALSA audio zařízení s dalším pluginem na směrování audio kanálů.
To udělám v souboru ~/.asoundrc (pro aktuálního uživatele), kam přidám např. takovéhle sekce.
pcm.virtual1 {
type route
slave {
pcm "plughw:HDSPMxcb26e5"
channels 16
}
ttable.0.1 1
ttable.1.0 1
ttable.2.2 1
ttable.3.3 1
ttable.4.4 1
ttable.5.5 1
ttable.6.6 1
ttable.7.7 1
}
V definici slave se přes pcm odkážu na fyzickou zvukovku, úplně stejně jako v předchozích případech.
A následně např. prohodím první dva kanály přes tabulku.
Tam je fomát: ttable.in-channel.out-channel gain
Přičemž gain je jako float multiplikátor (tzn. 1 = beze změny).
pcm.virtual2 {
type route
slave {
pcm "plughw:HDSPMxcb26e5"
channels 16
}
ttable.0.2 1
ttable.1.3 1
ttable.2.4 1
ttable.3.5 1
ttable.4.6 1
ttable.5.7 1
ttable.6.8 1
ttable.7.9 1
}
V tomhle druhém případě jsem to posunul o dva výstupy.
Když to pak chci zahrát, tak použiju např.
aplay -D virtual1 ./multichannel.wav nebo aplay -D virtual2 ./multichannel.wav
Takže to je v kostce asi všechno. aplay se dá zavolat z Python programu normálně jako systémový příkaz přes modul subprocess.
Možná kdyby to mělo být hezčí, tak bych se asi poohlédnul po nějakém modulu, co umí s ALSA zařízeními pracovat přímo z Pythonu, třeba jako pyalsaaudio (v podstatě wrapper okolo libasound, ale dýl jsem to neviděl).
Čtení PCM wavů je přímo ve standardní knihovně Pythonu.
Udělat z toho nějakou přehrávací funkci, kterou pak můžu volat například z vláken. Což se zas může hodit, jestli to má dynamicky reagovat na nějaké řídící eventy z toho MQTT.. minimálně se to dá nějak zamykat, synchronizovat, lidsky zastavovat přehrávání atd.
Ale samozřejmě, jestli je to nějaká jednorázovka s opravdu základním spouštěním, nemusí to dávat smysl.