Problèmes et questions sur les applications multimédia.

Configuration de l'audio via Alsa

#1Messageil y a 11 ans

Bonjour à tous :bjr:

Bien souvent, la configuration de l'audio ne pose aucun problème, elle se fait d'emblée. Surtout par exemple sur un portable simple, où il n'y a qu'une carte audio. Par contre, il n'en va pas de même s'il y a plusieurs sorties audio possibles, par exemple :
- la sortie classique ;
- la sortie HDMI (HPs intégrés dans l'écran) ;
- une carte audio PCI ;
- des enceintes USB.

Du point de vue logiciel, il y a deux couches : la couche Alsa (Advanced Linux sound architecture), celle de base, et PulseAudio, qui s'appuie sur Alsa. Voir le Wiki Arch pour une description générale d'Alsa.

Il vaut toujours mieux configurer via Alsa, même si ça semble à priori un peu plus complexe que PulseAudio.


1) Détermination des cartes audio disponibles dans le PC

Leur liste peut s'obtenir par la commande :

cat /proc/asound/cards


Exemple sur mon PC :

[pat@xfce ~]$ cat /proc/asound/cards
 0 [MID            ]: HDA-Intel - HDA Intel MID
                      HDA Intel MID at 0xfb9f8000 irq 47
 1 [Generic        ]: HDA-Intel - HD-Audio Generic
                      HD-Audio Generic at 0xfbabc000 irq 49
 2 [MM1            ]: USB-Audio - MM-1
                      Bowers & Wilkins MM-1 at usb-0000:00:1a.0-1.4, full speed
 3 [C525           ]: USB-Audio - HD Webcam C525
                      HD Webcam C525 at usb-0000:00:1a.0-1.5, high speed


Le problème est que l'ordre de ces cartes n'est pas forcément fixe. Il varie d'autant plus qu'un périphérique audio soit sous ou hors tension (donc pas forcément reconnu) au démarrage du PC.

Il faut donc fixer l'ordre de ces cartes, en mettant de préférence à l'adresse 0 la carte la plus communément utilisée.

Configuration de l'audio via Alsa

#2Messageil y a 11 ans

2) Fixer les numéros des cartes audio

Dans ce but, il faut ordonner les modules qui les gèrent. Pour avoir la liste de ces modules, utiliser la commande :

cat /proc/asound/modules


Ce qui donne chez moi :

[root@xfce pat]# cat /proc/asound/modules
 0 snd_hda_intel
 1 snd_hda_intel
 2 snd_usb_audio
 3 snd_usb_audio
[root@xfce pat]#


Si je veux par exemple avoir mes enceintes USB MM1, gérée par le module snd_usb_audio à l''adresse 0, il faut que je déclare dans un ficher .conf (peu importe le nom) situé dans /etc/modprobe.d, par exemple alsa-base.conf :

[pat@xfce ~]$ cat /etc/modprobe.d/alsa-base.conf 
options snd slots=snd_usb_audio,snd_hda_intel
options snd_usb_audio index=0
options snd_hda_intel index=1
[pat@xfce ~]$


Si à présent je redémarre mon PC, l'ordre des cartes a changé, et est désormais fixe :

[pat@xfce ~]$ cat /proc/asound/cards
 0 [MM1            ]: USB-Audio - MM-1
                      Bowers & Wilkins MM-1 at usb-0000:00:1a.0-1.4, full speed
 1 [MID            ]: HDA-Intel - HDA Intel MID
                      HDA Intel MID at 0xfb9f8000 irq 48
 2 [Generic        ]: HDA-Intel - HD-Audio Generic
                      HD-Audio Generic at 0xfbabc000 irq 49
 3 [C525           ]: USB-Audio - HD Webcam C525
                      HD Webcam C525 at usb-0000:00:1a.0-1.5, high speed
[pat@xfce ~]$


avec en plus mes enceintes à l'adresse 0.

Configuration de l'audio via Alsa

#3Messageil y a 11 ans

3) Configurer sa carte audio

Cela se fait via un fichier caché situé dans le home de l'utilisateur et nommé .asoundrc.

En tête de ce fichier, il est possible de configurer le périphérique audio par défaut du système. Dans ce qui précède on a forcé à 0 l'adresse de la carte audio la plus communément utilisée. Il faudra donc mettre :

defaults.pcm.card 0
defaults.pcm.device 0
defaults.ctl.card 0


Remarque : si l'on désire passer d'une sortie audio à une autre, ce sont ces valeurs qu'il faut changer.

Il est ensuite possible de configurer la sortie audio de deux façons : analogique ou digitale.

Dans le cas de l'analogique, les informations binaires sont envoyées à un chipset (souvent pas terrible) situé dans la carte-mère du PC qui les convertit en un signal analogique directement exploitable par des hauts-parleurs, des casques, etc... C'est le cas le plus classique.
Si la sortie est digitale, ces informations sont envoyées sans modifications à un dispositif externe (souvent connecté en HDMI ou en USB) qui se chargera de leur traitement. Mes enceintes sont dans ce cas.


3.1) Configurer une sortie analogique

Par défaut, Linux utilise une fréquence d'échantillonnage de 48 Khz, ce qui correspondait à l'époque à une sortie de type "studio". Ce n'est pas très bon, car la plupart des médias lus proviennent de CD ou de DVD, dont la fréquence d'échantillonnage normalisée est de 44,1 khz.
Si le défaut est conservé, il va être nécessaire de ré-échantillonner les données de sortie, ce qui va entraîner une charge CPU non négligeable, ainsi qu'une perte de qualité (l'algorithme utilisé par dmix pour ce faire étant assez médiocre).

Je conseille donc de changer ce défaut, en rajoutant dans .asoundrc :

pcm.!default {
    type plug
    slave.pcm "44k"
}

pcm.44k  {
    type dmix
    ipc_key 321456
    ipc_key_add_uid true
    slave {
        pcm "hw:0" # 0 est le numéro de card = carte à utiliser
        period_time 0
        period_size 1024
        buffer_size 8192
        rate 44100
 }
}


Il est toutefois possible de garder la fréquence d'échantillonnage de 48khz, aux dépens d'une charge CPU accrue, en utilisant un algorithme de meilleure qualité que celui de dmix. Pour ce faire, on utilisera à la place :

defaults.pcm.rate_converter "samplerate_best"

pcm.!default {
type plug
slave.pcm {
type dmix
ipc_key 1024
slave {
pcm "hw:0,0"
rate 48000
}
}
}


Attention : sur certains systèmes, l'utilisation de samplerate_best peut causer un crash du lecteur Flash.


3.2) Configurer une sortie digitale

En ce cas, il n'y a pas de fréquence d'échantillonnage à spécifier, puisque la conversion digitale -> analogique est faite par le périphérique audio.

La séquence à rajouter dans le .asoundrc devient :

pcm.!default {

   type plug
   slave {
       pcm "iec958"
   }

}


C'est celle que j'utilise.

Remarque : il faut faire attention à ne pas utiliser une fréquence d'échantillonnage comme dans le 3.1 pour un périphérique prévu pour une entrée digitale. Il risque sinon d'y avoir une triple conversion :

digitale -> analogique par le chipset du PC, analogique -> digitale pour la sortie sur port USB ou HDMI, et enfin digitale -> analogique dans le périphérique externe.

Configuration de l'audio via Alsa

#5Messageil y a 11 ans

Salut Esclapion :bjr:
Je vois que tu t'es penché sur le sujet :bien
Que penses tu de mettre ça sur le Wiki?

Configuration de l'audio via Alsa

#6Messageil y a 11 ans

Bonjour lemust83, :bjr:

Pour l'instant, ce n'est pas assez fouillé. J'attends avec impatience tes compléments. :clindoeil:

Configuration de l'audio via Alsa

#7Messageil y a 11 ans

Je chercherai de mon coté quand j'aurais un peu de temps...

Configuration de l'audio via Alsa

#8Messageil y a 11 ans

Esclapion a écrit :Bonjour lemust83, :bjr:

Pour l'instant, ce n'est pas assez fouillé. J'attends avec impatience tes compléments. :clindoeil:

:bjr::bjr:
et merci pour les recherches... :clap
je trouve que c'est déjà bon pour mettre tout ça sur le wiki... après tu peux étoffer, détailler, ajouter si tu veux quand tu as d'autres infos, mais en attendant, ça peut aider ceux qui passent par le wiki... :clindoeil:
je crois que ce serait utile, la preuve, tu rediriges déjà certains vers cette page du forum !!! :gsourire:

Configuration de l'audio via Alsa

#9Messageil y a 11 ans

:bjr:

Ce qui me gêne, c'est que mon PC est tout, sauf le cas standard. J'attends que des cobayes ayant un config normale me disent que c'est OK ou non.

Configuration de l'audio via Alsa

#10Messageil y a 11 ans

Excellent travail, merci Esclapion. :bien Bien d'accord avec (Edit) Loubrix lemust83, cela devrait enrichir le wiki.
Dernière modification par Erwanil y a 11 ans, modifié au total 1 fois.

Configuration de l'audio via Alsa

#11Messageil y a 11 ans

mais j'ai rien dit moi :saispas:

Configuration de l'audio via Alsa

#12Messageil y a 11 ans

Je pense qu'il pensait à moi
Plutôt flatteur comme confusion (pour moi :gsourire: )

Configuration de l'audio via Alsa

#13Messageil y a 11 ans

Loubrix a écrit :mais j'ai rien dit moi :saispas:


Effectivement je viens de me rendre compte de ma bévue, petite confusion entre petits hommes verts pseudos en vert :rigole:

Configuration de l'audio via Alsa

#15Messageil y a 10 ans

J'ai un complément à ajouter.

J'ai récemment adopté Manjaro comme système d'exploitation principal sur mon ordinateur portable
et j'ai eu un gros souci d'absence de son avec mon casque USB.

Voilà la parade que j'ai trouvé en m'inspirant des indications d'Esclapion dans cette aide et d'autres éléments trouvés sur internet et qui fonctionne de mon côté pour l'instant.

Configuer le son pour l'utilisation d'un casque audio USB

    1 )Ajouter des fichiers de configuration
J'ai créé 2 fichiers de configuration.
Le premier est /etc/modprobe.d/alsa-base.conf :

#/etc/modprobe.d/alsa-base.conf
#snd_hda_intel représente mes haut-parleurs
options snd slots=snd_hda_intel,snd_usb_audio
options snd_usb_audio index=1
options snd_hda_intel index=0

Comme indiqué dans la partie 2 de l'aide d'Esclapion, ces instructions servent à fixer les index des cartes son.

(NB : J'aurai pu fixer ma sortie audio USB sur l'index 0 qui est celui utilisé par défaut et cela m'aurait permis de régler le problème de son de mon casque. Par contre cette méthode a un inconvénient : aucun son ne vient des haut parleurs, même quand le casque n'est pas branché...)

Le second fichier est ~/.asoundrc :

#~/.asoundrc
#Pour rediriger le son vers les haut-parleurs
defaults.ctl.card 0 defaults.pcm.card 0 defaults.pcm.devices 0 pcm.!default { type plug slave { pcm iec958 }}

Avec ces paramètres le son viendra toujours des haut-parleurs même si un casque USB est branché

(NB : l'instruction "pcm.!default { type plug slave { pcm iec958 }}" a été obligatoire de mon côté pour que les haut-parleurs fonctionnent...).

Pour avoir du son dans mon casque, j'ai changé ce fichier de la manière suivante :

#~/.asoundrc
#Pour rediriger le son vers le casque USB
defaults.ctl.card 1 defaults.pcm.card 1 defaults.pcm.devices 1

Le problème est que si on laisse le fichier avec ces derniers paramètres, je n'ai plus de son dans les haut-parleurs et ce même si le casque USB est débranché. Il faut pour cela réécrire le fichier avec la première configuration, or avec celle-ci je n'ai pas de son si je branche mon casque USB... Cela veut dire que je dois réécrire le fichier ~/.asoundrc à chaque fois que je branche (ou débrache) mon casque USB.

Après quelques recherches sur Internet, j'ai réussi à trouver un moyen de réaliser cela de façon dynamique : en utilisant les règles udev.

    2) Ajouter 2 règles udev :
Je m'y connais très peu en linux et je me suis inspiré de la solution trouvée ici http://archlinux.me/w0ng/tag/usb/.
Pour des explications sur udev et comment l'utiliser, voici un lien sur ce que c'est et comment ça marche : http://doc.ubuntu-fr.org/udev

Pour en revenir à ma solution, j'ai créé le fichier /etc/udev/rules.d/00-local.rules :

#Set USB headset as default sound card when plugged in
KERNEL=="pcmC[D0-9cp]*", ACTION=="add" , PROGRAM="/bin/sh -c 'K=%k; K=$${K#pcmC}; K=$${K%%D*}; echo defaults.ctl.card $$K defaults.pcm.card $$K defaults.pcm.devices $$K > /my/absolute/path/.asoundrc;'"

#Restore default sound card when USB headset unplugged
KERNEL=="pcmC[D0-9cp]*", ACTION=="remove", PROGRAM="/bin/sh -c 'echo defaults.ctl.card 0 defaults.pcm.card 0 defaults.pcm.devices 0 pcm.!default { type plug slave { pcm iec958 }}  > /my/absolute/path/.asoundrc;'"

Il y a 2 règles dans ce fichier. La première écrit (dans mon fichier ~/.asoundrc) la configuration pour mon casque USB lorsque je le branche. La seconde écrit la configuration pour mes haut-parleurs lorsque je débranche mon casque.

(NB : Contrairement à la solution dont je me suis inspiré, je n'ai utilisé qu'une seule instruction echo au lieu de 3. Cela vient du fait que si on retire de manière trop lente la prise USB, l'action de réécriture est exécutée plusieurs fois avec certaines lignes qui sont répétées. Cela casse la configuration pour mes haut-parleurs.)

(NB 2: l'instruction "pcm.!default { type plug slave { pcm iec958 }}" n'est pas réécrite pour la configuration pour le casque USB car cela fait planter certaines application (vlc dans mon cas)).

Voilà, voilà. Vu que je suis un débutant sur linux, ça doit être vraiment améliorable.
Enfin, si ce que j'ai fait enfreint des bonnes pratiques, n'hésitez pas à le signaler.

Configuration de l'audio via Alsa

#16Messageil y a 9 ans

je n'ai pas de .asound.rc sous mon home, ni sous celui de root. du coup j'imagine que ça a changé depuis ! ou alors il faut le créer ?

Configuration de l'audio via Alsa

#17Messageil y a 9 ans

jujudusud a écrit :je n'ai pas de .asound.rc sous mon home, ni sous celui de root. du coup j'imagine que ça a changé depuis ! ou alors il faut le créer ?


a créer oui mais pas .asound.rc mais .asoundrc :clindoeil:
il y a une page sur le wiki arch créé en 2011 mais actualisée en 2014 donc doit être toujours bonne :saispas:

Configuration de l'audio via Alsa

#18Messageil y a 9 ans

Bonjour,
Oui pardon .asoundrc ... :-)
Apparement c'est ok pour moi pour mettre la card externe usb en 0 (premier). la commande qui affiche le contenu cards place bien l'usb en premier chez moi.
Ensuite je configure le transfert en digital (dans asound.rc) mais comment controler que c'est ce qui se passe ?
dernière chose, alsa ne peux pas controler le volume de ma carte son externe. celle si possèdes des potentiometres. cela se vérifie par une erreur en retour des commandes de reglage de niveau de master et pcm. donc tout fonctionne parfaitement apparement.
;-)

Configuration de l'audio via Alsa

#19Messageil y a 9 ans

Hier je me suis amusé a connecter ma fiche HDMI a ma TV samsung ..... et comme toujours, je suis obligé de bidouiller Alsa pour que le son HDMI sorte sur la tv ..... dès le branchement.
Vous faites comment ?

Configuration de l'audio via Alsa

#20Messageil y a 9 ans

ça dépend, perso je le fais via Pulseaudio-Volume-Control, mais je ne balance pas tout le son de l'ordi vers l'HDMI, juste le son du player video (puisque la sortie TV me sert uniquement à regarder des films). le player doit être en fonctionnement pour qu'il apparaisse dans Pulseaudio-Volume-Control.
le seul problème c'est que tout est mémorisé, donc une fois que tu as réglé le son du player pour qu'il sorte sur la TV, et que tu as déplacé la fenêtre du player vers l'écran de la TV, ça reste comme ça, même quand tu as débranché le HDMI.
je contourne ça en utilisant 2 players: Smplayer me sert sur l'écran de l'ordi, et Vlc sur la TV (je ne l'ouvre que si la TV est branchée)
Répondre