cClaude.rocks ☕ Le blog

[Nouvelles technologies, sciences et coups de gueule…]

Menu

GĂ©rer le son Ă  travers un terminal quel drĂŽle d’idĂ©e !

Je fus confronté à cette problématique dans un cadre un peu particulier, le contrÎle parental sur un Raspberry PI.

Cela m’a amenĂ© Ă  m’intĂ©resser Ă  la commande amixer. amixer permet de contrĂŽler une carte son utilisant le couche ALSA. amixer supporte de multiples cartes son avec de multiples pĂ©riphĂ©riques.

Cet article va se concentrer sur le cas d’un Raspberry PI mais s’applique à la plupart des distributions Linux.


ඏ

Préalables

Le son sur un ordinateur cela peut sembler simple. Mais votre ordinateur possĂšde presque toujours plusieurs sorties son, par exemple les enceintes et la sortie casque.

Sur un Raspberry PI de base, vous avez les sorties HDMI et la sortie casque. Cependant, si vous utilisez un Pi 4 avec une interface graphique, il est probable que vous ayez investi dans un adaptateur son USB pour contourner le conflit existant entre certaines résolutions et la carte son embarquée.

Bref, quel que soit votre ordinateur et l’outil que vous utiliserez, l’étape prĂ©alable sera d’identifier la sortie audio que vous souhaitez contrĂŽler.


ඏ

La couche ALSA

ALSA pour Advanced Linux Sound Architecture est un ensemble de logiciels pour enregistrer et jouer des sons, qui est incorporĂ© dans le noyau Linux. Le travail de cette couche est la configuration automatique des cartes son et la cohabitation aisĂ©e de plusieurs pĂ©riphĂ©riques son dans un mĂȘme systĂšme.

  • Les outils fournis avec ALSA

    ALSA prend Ă©galement en charge d’autres fonctionnalitĂ©s :

    • les synthĂ©tiseur MIDI intĂ©grĂ© dans le matĂ©riel ;
    • le mixage logiciel de plusieurs canaux ;
    • les opĂ©rations full-duplex ;
    • les pilotes (y compris les problĂ©matiques liĂ©s aux multiprocesseurs).

    ALSA a une interface de programmation (API) trĂšs complĂšte (certains disent trop). Cependant ; l’API OSS peut ĂȘtre utilisĂ©e, ALSA possĂ©dant une couche d’émulation d’OSS (« Open Sound System »).
    ALSA apporte également des outils :
    * alsactl : AlsaControl permet de contrÎler les cartes son et de manipuler (charger et sauvegarder) les configurations ;
    * alsamixer : permet de rĂ©gler les volumes des diffĂ©rents canaux, utilise ncurses pour l’affichage ;
    * aplay : permet de jouer un fichier .wav ;
    * arecord : permet d’enregistrer un fichier .wav à partir d’une sortie sonore ;
    * aconnect : permet de connecter les deux ports MIDI existants sur le séquenceur ALSA.


ඏ

alsamixer : Une solution « graphique » pour gérer le son depuis le terminal

alsamixer est probablement la solution la plus simple pour commencer
 Le gros avantage, c’est qu’avec la touche F6 il est possible de choisir la carte son, c’est trĂšs simple. De plus par la suite une fois que l’on a vu le numĂ©ro de la carte, il est possible d’ouvrir l’interface directement sur le bon pĂ©riphĂ©rique en utilisant la syntaxe suivante :

alsamixer -c 2 # Sélectionne la carte N°2
Alsamixer

Les flÚches permettant de sélection le potentiomÚtre de votre choix (entrée, sortie, autre) ainsi que le volume.

L’inconvĂ©nient de cette solution Ă©tant qu’il n’est pas possible de programmer le son via un script.

Liste des cartes disponibles (« F6 ») sur un Raspberry Pi 4 ayant une carte son USB supplémentaire.

┌──────────── Carte Son ────────────┐ │- (par dĂ©faut) │ │0 bcm2835 HDMI 1 │ │1 bcm2835 Headphones │ │2 USB Audio Device │ │ entrez le nom du pĂ©riphĂ©rique...│ └───────────────────────────────────┘

ඏ

amixer la version purement CLI


La plus grosse difficultĂ© avec cette version est l’identification des cartes, une bonne solution est d’utiliser l’arborescence procfs comme suit :

cat /proc/asound/cards
 0 [b1             ]: bcm2835_hdmi - bcm2835 HDMI 1
                      bcm2835 HDMI 1
 1 [Headphones     ]: bcm2835_headphonbcm2835 Headphones - bcm2835 Headphones
                      bcm2835 Headphones
 2 [Device         ]: USB-Audio - USB Audio Device
                      GeneralPlus USB Audio Device at usb-0000:01:00.0-1.2, full speed
amixer <options> [commande]

Les commandes disponibles étant :

Commande Description
info Affiche des informations sur le périphérique de mixage.
scontrols Affiche tous les états de base du mélangeur (Single controls)
scontents Affiche le contenu de toutes les états de base du mélangeur (commande par défaut)
sset SCONTROL PARAMETER DĂ©fini la valeur d’un Ă©tat de base du mĂ©langeur
sget SCONTROL Obtiens la valeur d’un Ă©tat de base du mĂ©langeur
controls Affiche toutes les états pour une carte donnée (sans option, toutes les cartes)
contents Afficher le contenu de toutes les commandes pour une carte donnée
cset CONTROL PARAMETER 
 DĂ©finit une valeur d’un contrĂŽleur de la carte. L’identifiant a ces composants : iface, name, index, device, subdevice, numid. L’argument suivant spĂ©cifie la valeur du contrĂŽleur.
cget CONTROL Affiche le contenu du contrĂŽle de la carte. L’identifiant a la mĂȘme syntaxe que pour la commande cset.

Les options disponibles étant :

Options Description
-c, --card N Sélectionne la carte donnée
-D, --device N Sélectionne le périphérique, la valeur par défaut est : 'default'
-d, --debug Mode de débogage
-n, --nocheck Ne pas effectuer la vérification plage sur les valeurs
-v, --version Affiche la version du programme
-q, --quiet Limite l’affiche des rĂ©sultats
-s, --stdin Traite les commandes Ă  partir de l’entrĂ©e standard (stdin) puis les exĂ©cute en sĂ©quence. Lorsque cette option est donnĂ©e, les arguments de la ligne de commande sont ignorĂ©s. Seuls sset et cset sont acceptĂ©s. Les autres commandes sont ignorĂ©es. Attention, les commandes non valides sont Ă©galement ignorĂ©es sans erreurs.
-R, --raw-volume Utilise la valeur brute pour Ă©valuer la reprĂ©sentation en pourcentage. C’est le mode par dĂ©faut.
-M, --mapped-volume Utilise le volume mappĂ© pour Ă©valuer la reprĂ©sentation en pourcentage comme le fait alsamixer, permet un effet plus naturel pour l’oreille humaine.

Affichage de l’aide pour votre version :

sudo amixer -h

ඏ

Exemples

Les contrĂŽleurs

Afficher la liste contrĂŽleur disponibles

amixer controls

Exemple d'affichage (PI 4)

numid=4,iface=MIXER,name='Master Playback Switch'
numid=3,iface=MIXER,name='Master Playback Volume'
numid=2,iface=MIXER,name='Capture Switch'
numid=1,iface=MIXER,name='Capture Volume'

Les informations

Les informations sur le pĂ©riphĂ©rique de mixage s’obtiennent comme suit :

amixer info

Qui donne par exemple sur un Raspberry PI 4 :

Card default 'b1'/'bcm2835 HDMI 1'
  Mixer name    : 'Broadcom Mixer'
  Components    : ''
  Controls      : 2
  Simple ctrls  : 1

Sur un autre type de machine Linux, on obtient :

Card default 'pulse'/'PulseAudio'
  Mixer name    : 'PulseAudio'
  Components    : ''
  Controls      : 4
  Simple ctrls  : 2

Le volume

Mettre le son à 15% :

amixer sset "Master",0 15%

Mettre le son au maximum :

amixer sset "Master",0 100%

Allumer ou Ă©teindre le son

Couper le son

amixer sset "Master",0 off

Activer le son Ă  la derniĂšre valeur

amixer sset "Master",0 on

ඏ

Changer le volume du son depuis un autre utilisateur

Si vous souhaitez modifier le volume via la ligne de commande c’est peut-ĂȘtre parce que vous souhaitez le faire Ă  distance, Ă  travers une connection SSH.

On va donc rĂ©utiliser ce qu’on a vu dans le billet « écrire un message sur l’écran d’un autre ».

Sur Raspberry Pi OS

sudo su -l utilisateur_cible -c 'DISPLAY=:0.0 XAUTHORITY=${HOME}/XAUTHORITY alsamixer -c 2'

ou

sudo su -l "${TARGET_USER}" -c 'DISPLAY=:0.0 XAUTHORITY=${HOME}/XAUTHORITY amixer cset numid=3 40%'

Pour une machine sous Raspberry Pi OS, on peut par exemple utiliser :

ssh "${ADMIN_USER:-pi}@${REMOTE_HOST}" "sudo su -l '${TARGET_USER}' -c 'DISPLAY=:0.0 XAUTHORITY=${HOME}/XAUTHORITY amixer cset numid=3 40%'"

En définissant au préalable :

  • REMOTE_HOST=« Adresse IP du Raspberry »
  • TARGET_USER=« Nom de l ‘utilisateur connectĂ© sur l’interface graphique »

Pour une autre machine, il faudra définir :

  • ADMIN_USER=« Nom d’un utilisateur ayant les droits pour executer la commande sudo »

ඏ

Références

኿


â„č 2006 - 2024 | 🏠 Accueil du domaine | 🏡 Accueil du blog