Introduction

La sortie du son se fait via un ensemble de pilotes pour les cartes son. Sous Linux, le plus connu est Alsa.

Les logiciels diffusant des flux sonores passent donc par Alsa (par exemple) pour la diffusion en temps que tel sur la carte son de telle sorte que le schéma de base est le suivant :

Application-diffusant-du-son > Alsa > carte-son > sortie analogique

Si l'on veut que plusieurs applications puissent diffuser simultanément sur Alsa, il faut une fonction de mixage. Cette fonction peut être intégrée à Alsa ou on peut passer par un serveur de son. Un serveur de son est une couche logicielle qui s'interpose entre le signal généré par le(s) logiciel(s) et le pilote (Alsa) et peut donc mélanger tous les signaux audio provenant des différents logiciels afin de n'en envoyer qu'un seul au pilote. Un exemple de serveur de son bien connu sous Linux est Pulseaudio.

Alsa

Alsa est le pilote qui gère le son sous Linux. Il peut être interessant de bien le configurer nottament si vous avez différents periphériques de sortie son (par exemple une carte son integrée à votre machine et une carte son branchée en USB (DAC)).

La gestion des périphériques (cartes son)

Pour lister les cartes son liée à votre machine et utilisées par Alsa, on utilise la commande suivante :

aplay -l

ou

aplay -L

si on veut plus de précisions

Exemple de résultat :

**** Liste des Périphériques Matériels PLAYBACK ****
carte 0: ALSA [bcm2835 ALSA], périphérique 0: bcm2835 ALSA [bcm2835 ALSA]
Sous-périphériques: 7/8
Sous-périphérique #0: subdevice #0
Sous-périphérique #1: subdevice #1
Sous-périphérique #2: subdevice #2
Sous-périphérique #3: subdevice #3
Sous-périphérique #4: subdevice #4
Sous-périphérique #5: subdevice #5
Sous-périphérique #6: subdevice #6
Sous-périphérique #7: subdevice #7
carte 1: PCM2702 [Burr-Brown Japan PCM2702], périphérique 0: USB Audio [USB Audio]
Sous-périphériques: 1/1
Sous-périphérique #0: subdevice #0

Une carte son USB est dans les trois dernières lignes, soit la carte 1 et son identifiant ALSA est donc hw:1,0. La première est a donc pour identifiant hw:0,0 (le deuxième chiffre correspond aux sous-périphérique, ici de 0 à 7)

  • Cas pour une carte son USB (DAC) : Si vous voulez que cette carte son USB garde toujours le même identifiant (même numéro), ajoutez cette ligne dans le fichier /etc/modprobe.d/alsa-base.conf :

    options snd-usb-audio index=0
    

    Si vous voulez, à l'inverse, empêcher que cette carte soit mise en numéro 0, ajoutez plutôt cette ligne :

    options snd-usb-audio index=-2
    

Ensuite, il faut configurer Alsa pour que cela corresponde en éditant le fichier /etc/asound.conf :

nano /etc/asound.conf

et y mettre (en adaptant le numéro de la carte à celle que vous voulez mettre par défaut) :

pcm.!default {
    type hw
    card 0 ## Remplacez ici par le numéro de la carte que vous voulez avoir par défaut
    device 0
}

Configurer Alsa pour un utilisateur spécifique

Nous pouvons configurer les cartes son pour un utilisateur (que nous appellerons bidule). Cela peut être interessant pour manipuler facilement Alsa pour cet utilisateur, nottament indiquer à mpd la sortie son, choisir la sortie son aisément pour la diffusion, permettre le mixage afin que plusieurs sources puissent diffuser sur la même carte son, etc… Pour cela, il faut créer un fichier situé dans le home de cet utilisateur (être loggé en temps que bidule) :

touch /home/bidule/.asoundrc

Préciser la carte par défaut

Éditer le fichier .asoundrc et y mettre les éléments suivants (à adapter en fonction du numéro de carte que vous voulez par défaut) :

pcm.!default {
        type hw
        card 0
        device 0
}

ctl.!default {
        type hw           
        card 0
        device 0
}

Cela permet de définir la carte utilisée par defaut par Alsa (dans ce cas, ce sera la première apparaissant suite à la commande 'aplay -l'). En effet, même si la carte apparaît en première pour Alsa, ce n'est pas forcément celle qui est utilisée par defaut, il faut donc le définir.

Cela permet donc que tout son joué par l'utilisateur bidule sorte par la carte indiquée par défaut ci-dessus (par exemple, en lançant une commande du type aplay /fichier/de/son)

Utiliser des aliases pour mieux identifier ses cartes son

On peut aussi mettre des aliases. Cela permet d'assigner un nom compréhensible lors de nos configurations gérées par l'utilisateur bidule :

pcm.cartepc {
        type hw
        card 1
        device 0
}


pcm.carteusb {
    type hw
    card 0
    device 0
}

Ici, nous avons défini deux aliases, cartepc et carteusb (cartepc est définie en carte n°1 dans la sortie de la commande 'aplay -l' et carteusb en carte n°0). Dès lors, il est possible de lancer des commandes du type :

aplay -D carteusb /fichier/de/son

ce qui permet de jouer ce fichier de son en sortant par la carte usb (DAC). Si l'on remplace carteusb par cartepc, le son sortira par la carte 1 d'Alsa (dans notre cas, la carte integrée à la machine)

Activer le mode mixeur afin de pouvoir envoyer plusieurs flux audio sur une même carte

Par défaut, si une carte est utilisée par un programme diffusant du son, aucun autre programme ne pourra également diffuser du son. Pour palier à cela, il faut éditer le fichier .asoundrc et y mettre des blocs de ce type (lire les commentaires inclus dans le bloc ci-dessous) :

pcm.dac {
        type plug
        slave.pcm "nom-au-choix"  ## Mettre ici un nom qui correspondra à ce qui suit en dessous
}

pcm.nom-au-choix  {
        type dmix
        ipc_key 1024
        slave {
                pcm "hw:0,0" ## Mettre ici l'identifiant de la carte renvoyé par *aplay -l*
                period_time 0
                period_size 1024
                buffer_size 4096
                rate 34890
        }
        bindings {
                0 0
                1 1
        }
}

ctl.nom-au-choix {
        type hw
        card 0 ## Mettre ici le numéro de la carte renvoyé par *aplay -l*
}

Vous pouvez bien sur avoir plusieurs blocs de ce type si vous avez plusieurs cartes son (il suffit d'adapter les noms et les numéros de cartes).

Configurer la sortie son sous un RaspberryPi

Nous repartons du point précédent, c'est à dire une sortie son en USB

Dans les logs, il peut y avoir d’innombrables messages de type :

[42641.766854] delay: estimated 0, actual 133

Pour pallier ce problème, il faut créer le fichier /etc/modprobe.d/alsa-base.conf et indiquer :

options snd-usb-audio nrpacks=1

Le deuxième problème qu’il peut y avoir est la désactivation de la carte son interne du Raspberry PI. Pour la réactiver, il faut charger son module au démarrage. Dans /etc/modules, rajouter :

snd-bcm2835

puis chargez le module pour ne pas avoir à rebooter :

modprobe snd-bcm2835

Enfin, si vous n'utilisez pas de carte son USB, vous voudrez sûrement pouvoir choisir entre la sortie son par l'HDMI ou par la sortie jack (headphones). Sur le RaspberryPi, c'est la même carte son qui gère les deux (carte bcm2835) et il faut donc lui indiquer quelle sortie utiliser.

Voici les codes correspondants :

  • 0=auto
  • 1=headphones
  • 2=hdmi

Pour activer la sortie sur le jack (headphones), lancez cette commande :

amixer cset numid=3 1

Pour activer la sortie sur l'HDMI :

amixer cset numid=3 2