David Schlachter

Périphériques audio USB sur FreeBSD

Mise à jour 2024-04-16 : Le problème avec la mise en veille devrait être réglé par ce correctif récemment intégré à FreeBSD (qui devrait bientôt être disponible dans une version RELEASE). Merci à Christos Margiolis pour le correctif et pour me l'avoir communiqué.

J'ai récemment acheté une carte son Behringer UMC22 pour des visioconférences et le DJing. Cette page rassemble ce que j'ai appris sur cette carte et sur l'audio USB en général sur FreeBSD.

Résumé : Tout fonctionne si la carte son suit les spécifications pour la classe de périphériques audio USB.

Behringer UMC22 sound card connected to FreeBSD computer

Support matériel

Quelles cartes son fonctionnent sur FreeBSD ? Les notes de compatibilité de matériel ne mentionnent pas de cartes son USB et elles ne figurent non plus dans la page de manuel pour leur pilote snd_uaudio (4). Même la code source pour le pilote snd_uaudio n’énumère que quelques cartes et une liste complète n'est pas présente.

Le support matériel pour des cartes son n'est pas question de dispositifs ou composants particuliers, sinon qu'il se base sur le suivi de la spécification « USB audio device class » (classe de périphériques audio USB.).

Comment vérifier si un périphérique audio USB suit les spécifications pour la classe de périphériques audio USB ? Dans le cas du UMC22, le système est basé sur la puce PCM2902 de Texas Instruments. Les spécifications pour la puce PCM2902 disent que (traduit de l'anglais) « la conception de l'ensemble de la carte doit être considérée comme conforme à la spécification USB en tant que produit conforme à la norme USB » et que l'interface communique par « la demande standard USB et la demande spécifique à la classe audio USB ». Même s'il n'y a pas de déclaration explicite de compatibilité, il est entendu que la puce est en conformité aux spécifications pour la classe de périphériques audio USB. La même puce est aussi présente dans d'autres cartes son de Behringer, comme les UM2, UA222, UCA222 et UCA202.

Utilisation de la carte son

Quand la carte son est connectée à un ordinateur exécutant FreeBSD, dmesg montre que la carte UMC22 est reconnue par le pilote uaudio. La chaîne de texte identifiant la puce PCM2902 est aussi visible dans la sortie de la commande (« Burr-Brown from TI »):

uaudio0 on uhub1
uaudio0: <Burr-Brown from TI USB Audio CODEC, class 0/0, rev 1.10/1.00, addr 2> on usbus0
uaudio0: Play: 48000 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: Play: 44100 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: Play: 32000 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: Record: 48000 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: Record: 44100 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: Record: 32000 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: Record: 22050 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: Record: 16000 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: Record: 11025 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: No MIDI sequencer.
pcm3: <USB audio> on uaudio0
uaudio0: HID volume keys found.

Les périphériques de son reconnus par le système sont visibles sous cat /dev/sndstat, qui montre que la carte est reconnue (pcm3) pour la reproduction et l'enregistrement audio :

Installed devices: pcm0: <Realtek (0x0257) (Analog 2.0+HP/2.0)> (play/rec) default
pcm1: <Realtek (0x0257) (Right Analog Mic)> (rec)
pcm2: <Intel Kaby Lake (HDMI/DP 8ch)> (play)
pcm3: <USB audio> (play/rec)
No devices installed from userspace.

Comment définir la carte son comme l'appareil de sortie ? Pour certains programmes, comme mixxx ou Audacity, l'appareil de sortie est défini dans les réglages de l'application. D'autres programmes n'utiliseront que l'appareil de sortie par défaut, défini par la commande :
sysctl hw.snd.default_unit=3
avec le numéro de l'appareil (dans ce cas, pcm3 = 3).

Le numéro d'appareil visible dans /dev/sndstat corresponde aussi à ceux sous /dev/dsp et /dev/mixer. Par exemple, les niveaux de volume sont visibles avec mixer (8). Par exemple :
mixer -f /dev/mixer3
Pour modifier le niveau de volume :
mixer -f /dev/mixer3 vol 75
(Pas besoin dans ces commandes de spécifier l'appareil s'il est déjà celui par défaut).

Difficultés

Au moment d'entrer à la mise en veille, la lecture d'un fichier audio avec la carte son provoquera une série de messages comme les suivants sur la console :

pcm3: unregister: channel pcm3:virtual:dsp3.vp0 busy (pid 45989)
pcm3: Waiting for sound application to exit!

Ces messages continueront jusqu'à la libération de l'appareil audio, suivie par la mise en veille.

Pour prévenir ce blocage, je redéfinis l'appareil par défaut à 0 avant de la mise en veille. De cette façon, une application utilisant l'appareil par défaut (par exemple, Firefox) ne va pas bloquer la mise en veille.

Cependant, si une application utilise explicitement la carte son, cela ne marchera pas. En fait, ces applications vont probablement jamais libérer l'appareil audio, provocant effectivement une panne qui va exiger un redémarrage de l'ordinateur.

Pour libérer la carte son, j'utilise ce script pour quitter tout programme qui utilise la carte son au moment de la mise en veille :

# Close up the USB sound card before suspend
sysctl hw.snd.default_unit=0

# Close any programs still using the sound card
while fstat | grep dsp3 2>&1; do
   fstat | grep dsp3 | cut -w -f 3 | while read pid;
      do kill -15 "$pid"
   done
done
while [ "$(ls -l /dev | grep -c dsp3)" -gt 1 ]; do
   sleep 1
done