Chargement...
 
Skip to main content

1 - Le matériel et les pilotes ALSA, FFADO, ...


Alsa, dmix et soucis avec cartes son multiples

Bonjour,


Contexte :

il s'agit d'un "assistant de scène" à base de raspberry pi et pilotant 2 cartes son usb Antlion.
Un soft fait maison en Ocaml permet de parcourir les morceaux des sets qu'on joue en live, et doit jouer sur la carte son 1 un fichier wav contenant un métronome pré-enregistré, et sur la carte son 2 un fichier avec les samples synchronisés avec le métronome du fichier 1.


Les cartes son sont identifiées via leur port usb car totalement identiques et n'étant pas montées dans un ordre stable par udev :
Copy to clipboard
SUBSYSTEM!="sound", GOTO="alsa_naming_end" ACTION!="add", GOTO="alsa_naming_end" # DEVPATH can be obtained by looking at `udevadm monitor --subsystem=sound` while pluging in the sound card. # Do one card at a time, the "?" char on card should stay as it matches any card number that may pop on that USB port. DEVPATH=="/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1/1-1.1:1.0/sound/card?", ATTR{id}="Antlion1" DEVPATH=="/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card?", ATTR{id}="Antlion2" LABEL="alsa_naming_end"



Il y a une contrainte supplémentaire qui est que la carte Antlion1 est utilisée en permanence par un processus qui génère des clics de métronome (fait directement en Ocaml/C avec les libs alsa).

(donc 2 types de métronome qui peuvent être utilisés : en fichier wav ou généré par le programme)


J'ai ajouté une couche dmix pour que le processus métronome ET la lecture de fichier puissent être actifs simultanément sur la carte Antlion1, avec la config /etc/asound.conf suivante :

Copy to clipboard
pcm.dmixer { type dmix ipc_key 21324 slave.pcm "hw:CARD=Antlion1" } pcm.plugdmixer { type plug slave.pcm "dmixer" }




Ça fonctionnait bien sur un raspberry pi 2.



Problème :

Pour plusieurs raison j'ai du remplacer le raspberry pi 2 par un 4, et maintenant lecture en simultané du métronome sur la carte 1 et du sample sur la carte 2 ne fonctionne plus. Il n'y a "plus" de métronome.


La lecture sur la carte 1 uniquement, en passant par la couche dmix, fonctionne bien :
Copy to clipboard
$ aplay -D plugdmixer file1.wav Playing WAVE 'file1.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono ^CAborted by signal Interrupt... aplay: pcm_write:2127: write error: Interrupted system call



La lecture sur les 2 cartes en simultané SANS dmix fonctionne également :
Copy to clipboard
$ aplay -D plughw:CARD=Antlion1 file1.wav & aplay -D plughw:CARD=Antlion2 file2.wav


Les deux fichiers sont lus simultanément, chacun sur sa sortie, tout va bien.


Le problème survient avec l'utilisation de la couche dmix pour la carte 1 ET que la carte son 2 a également du signal à traiter :
Copy to clipboard
$ aplay -D plugdmixer file1.wav & aplay -D plughw:CARD=Antlion2 file2.wav


Le résultat est que seulement file2.wav est audible (sur la carte son 2). Il n'y a aucune sortie sur la carte son 1.

Dès que je termine avec CTRL+C le second processus (qui cible la carte 2), le son de file1 sort de la carte 1, et en milieu de piste, comme s'il jouait bien depuis le début mais en étant muté.

Donc il semble que l'utilisation de dmix sur la carte 1 provoque des soucis de sortie son lorsque la carte 2 est utilisée simultanément ❓


Est-ce que quelqu'un aurait une piste ?

Systeme : Debian 12 (bookworm)
libasound2: 1.2.8-1+rpt1.



(Il y a toujours le plan B qui serait de ne pas "armer" le métronome logiciel lorsque c'est une piste de métronome qui est lue, de manière à libérer la carte 1 et utiliser la commande qui fonctionne sans dmix, mais je rencontre une exception Alsa.Buffer_xrun lorsque le métronome logiciel ne passe pas par la couche dmix, et j'ai peur que ça ajoute une latence à chaque démarrage de métronome pour préparer la carte 1).


En espérant qu'on trouvera une solution,

Merci 😉
Anto45500


Copy to clipboard
aso@raspberrypi:~ $ cat /proc/asound/cards 0 [Headphones ]: bcm2835_headpho - bcm2835 Headphones bcm2835 Headphones 1 [Antlion1 ]: USB-Audio - Antlion USB adapter Antlion Audio Antlion USB adapter at usb-0000:01:00.0-1.1, full speed 2 [Antlion2 ]: USB-Audio - Antlion USB adapter Antlion Audio Antlion USB adapter at usb-0000:01:00.0-1.2, full speed 3 [vc4hdmi0 ]: vc4-hdmi - vc4-hdmi-0 vc4-hdmi-0 4 [vc4hdmi1 ]: vc4-hdmi - vc4-hdmi-1 vc4-hdmi-1


Copy to clipboard
aso@raspberrypi:~ $ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones] Subdevices: 8/8 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 Subdevice #2: subdevice #2 Subdevice #3: subdevice #3 Subdevice #4: subdevice #4 Subdevice #5: subdevice #5 Subdevice #6: subdevice #6 Subdevice #7: subdevice #7 card 1: Antlion1 [Antlion USB adapter], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 card 2: Antlion2 [Antlion USB adapter], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 card 3: vc4hdmi0 [vc4-hdmi-0], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0] Subdevices: 1/1 Subdevice #0: subdevice #0 card 4: vc4hdmi1 [vc4-hdmi-1], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0] Subdevices: 1/1 Subdevice #0: subdevice #0


Copy to clipboard
aso@raspberrypi:~ $ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 005: ID 346d:5678 USB Disk 2.0 Bus 001 Device 004: ID 0d8c:002c C-Media Electronics, Inc. Antlion USB adapter Bus 001 Device 003: ID 0d8c:002c C-Media Electronics, Inc. Antlion USB adapter Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bonjour,

j'ai contourné le problème en faisant le plan B : modifier le code pour fermer correctement le métronome logiciel et ne pas avoir l'erreur "device busy" à la lecture d'un métronome wav.

Ça permet de se passer de dmix, et là ça fonctionne bien.
Chaque fichier est lu sur chaque carte son indépendamment.


Et pour info l'erreur Buffer_xrun que j'avais initialement (et qui n'apparaissait pas avec dmix) se produit dès que je demande un sample rate >= 44100.
Avec 44099, ça fonctionne bien.
Et là aussi ça fonctionnait bien le raspberry pi 2 et 48000 hz, avec les mêmes cartes son.

J'ai mis 44000 pour avoir un nombre rond et pair.



Je suis quand même curieux de savoir pourquoi l'utilisation de dmix cause ces soucis 😉