Comment puis-je utiliser une carte son USB externe et la définir par défaut?

16

J'ai une carte son USB externe de C-Media en cours d'exécution sur mon RPi3. Je peux lire certains enregistrements en utilisant aplay / arecord en spécifiant l'index de la carte et le plugin ALSA. Cependant, de nombreux autres fichiers audio ne sont pas lus du tout ou pas comme prévu. Certains autres logiciels de lecture ne fonctionnent pas non plus.

Q: Comment puis-je configurer ALSA pour l'utiliser par défaut?

not2qubit
la source

Réponses:

32

Contexte

C'est incroyable de voir combien d'efforts ont été déployés pour essayer de résoudre divers problèmes liés au son pour le Raspberry Pi. Apparemment, ce doit être le point le plus faible pour les nouveaux utilisateurs de développer avec succès et d'utiliser ALSA sous Raspbian. Ayant passé beaucoup de temps et d'efforts à essayer de faire fonctionner mon propre son RPi3 dans différentes versions de système d'exploitation et dans d'autres distributions Linux, j'ai décidé d'écrire la page de solution concluante à emporter. Au moins pour le sujet de l'utilisation d'une carte son externe sur le dernier Raspbian Stretch .

Le système de son ALSA

ALSA est conçu pour prendre en charge tout type de périphérique basé sur * nix, quelle que soit sa configuration matérielle et quel que soit l'âge du matériel. Inutile de chercher à entrer dans les détails de 20 ans de développement. Nous appliquons simplement l'essence à une situation actuelle.

Cependant, à aucun moment de l'histoire, l'humanité n'a produit autant de diagrammes inutiles et dysfonctionnels que pour essayer d'expliquer l'ALSA. Les seuls à distance informatifs sont les deux:

entrez la description de l'image ici entrez la description de l'image ici

Obtention des informations système

La première étape consiste à déterminer quel son, le cas échéant, fonctionne et quel matériel vous possédez déjà. Il existe toutes sortes de façons de trouver des détals, mais pour la personne moyenne, la plupart de ces détails sont dénués de sens. Nous montrons le plus important.

Que voulons-nous savoir sur notre système (sonore)?

Nous voulons savoir:

  • le nom et les versions du matériel audio intégré
  • le nom et les versions du matériel audio externe
  • quels pilotes du noyau (modules) il utilise
  • quels autres pilotes / modules du noyau liés au son sont chargés
  • quelles cartes son sont disponibles
  • dans quel ordre les cartes son sont utilisées et sélectionnées par le système d'exploitation et les programmes
  • s'il y a du matériel ou des programmes de sonorisation en conflit

D'où voulez-vous jouer et enregistrer du son sur votre système?

Vos options pour jouer des sons peuvent être:

  1. De la prise casque audio 3,5 mm interne (audio analogique)
  2. Depuis l'écran / moniteur connecté HDMI
  3. Depuis une carte son USB externe
  4. Depuis un port GPIO

Vos options d' enregistrement de sons peuvent être:

  • une. Depuis une carte son USB externe (avec au moins un type d'entrée)
  • b. À partir d'un fichier ou d'un flux
  • c. Depuis un GPIO

Dans cet article, nous vous expliquerons comment jouer et enregistrer à l'aide de la carte son USB externe .

Un plan de réussite à l'épreuve du temps?

Avec les mises à jour de RPi, il y a un flux constant de nouvelles modifications et améliorations, cassant souvent les anciennes solutions. L'idée ici est d'apporter le moins de modifications possibles au système ou de les rendre évidentes si nécessaire. Cela signifie que nous préférons utiliser une configuration par utilisateur plutôt qu'une configuration à l'échelle du système. C'est-à-dire essayez d'utiliser des fichiers de configuration dans votre répertoire personnel, plutôt que dans des fichiers système appartenant à root.


TL; DR (Allons-y déjà!)

Redémarrez et branchez votre carte son USB externe, nous commençons donc sur la même page ...

A. Recueillir des informations

# Check ALSA modules
cat /proc/asound/modules

 0 snd_bcm2835
 1 snd_usb_audio

# Check sound hardware
cat /proc/asound/cards

 0 [ALSA           ]: bcm2835 - bcm2835 ALSA
                      bcm2835 ALSA
 1 [Set            ]: USB-Audio - C-Media USB Headphone Set
                      C-Media USB Headphone Set at usb-3f980000.usb-1.5, full speed

# Check info on card-1
amixer -c 1

Simple mixer control 'Headphone',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 151
  Mono:
  Front Left: Playback 104 [69%] [-8.88dB] [on]
  Front Right: Playback 104 [69%] [-8.88dB] [on]
Simple mixer control 'Mic',0
  Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined
  Playback channels: Mono
  Capture channels: Mono
  Limits: Playback 0 - 32 Capture 0 - 16
  Mono: Playback 23 [72%] [34.36dB] [off] Capture 0 [0%] [0.00dB] [on]
Simple mixer control 'Auto Gain Control',0
  Capabilities: pswitch pswitch-joined
  Playback channels: Mono
  Mono: Playback [on]

Nous voyons ici que le système par défaut ( card 0) utilise le module bcm2835 ALSA. Bien que nous puissions généralement spécifier la carte à utiliser, certains logiciels comme omxplayer n'ont pas cette option et ne produiront aucun son de différentes manières.

À ce stade, vous pouvez déjà tenter de configurer vos fichiers de configuration ALSA. Certains réussissent, tandis que d'autres ne le sont pas, car il n'est pas évident de savoir comment et où cela doit être fait. Ce que nous voulons en fin de compte, c'est de dire à notre système d'utiliser notre carte son USB externe.

B. Supprimer le gonflement audio

Sauf si vous avez de très bonnes raisons de conserver PulseAudio (PA) ou un logiciel serveur JACK supplémentaire , vous devez les désinstaller , s'ils existent. Ils ont tendance à interférer avec ALSA, car ils prennent le contrôle de nombreuses fonctions ALSA, et toutes les configurations supplémentaires nécessaires à celles-ci, rendent les choses incroyablement déroutantes!

sudo apt-get remove pulseaudio

# You can keep `jack*`, but make sure it is not running.
# If it is running you need to stop it, disble it or remove it.
service --status-all
# Disable the running service with:
sudo systemctl disable xxxxx

C. Désactivez la carte son interne (Broadcom)

La carte son interne est pilotée par le module du noyau dans: /lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko Sauf si vous prévoyez d'utiliser la prise audio (en 1) ou HDMI (en 2), vous devez désactiver ce module du noyau. Il existe deux méthodes pour ce faire.

  1. Désactivez-le avec un indicateur de configuration de démarrage
  2. Empêchez-le d'être chargé dans le noyau par le modprobe.ddémon

En essayant de rester avec notre approche minimaliste, nous choisissons (1).

# Edit boot config with:
sudo nano /boot/config.txt
# so that:
cat /boot/config.txt
...
# Enable audio (loads snd_bcm2835)
#dtparam=audio=on
dtparam=audio=off
...
# You need to reboot!
sudo reboot now

Si pour une raison quelconque, vous préférez utiliser la méthode (2), vous devez alors mettre le module du noyau sur liste noire. Pour ce faire, vous entrez simplement le mot blacklist, suivi du nom du module dans n'importe quel *.conffichier sous /etc/modprobe.d/. Cependant, il existe déjà un fichier vide et réservé, appelé raspi-blacklist.confà cet effet. Cependant, après 6 mois, vous aurez oublié cela et ce qu'il contient, il vaut donc mieux le nommer d'après le module que vous mettez sur liste noire.

cd /etc/modprobe.d/
# Manually edit a new file:  blacklist-snd_bcm2835.conf
#sudo nano blacklist-snd_bcm2835.conf
# And add the line: blacklist snd_bcm2835
## OR directly with:
sudo tee /etc/modprobe.d/blacklist-snd_bcm2835.conf <<EOF
blacklist snd_bcm2835
EOF
# You need to reboot!
sudo reboot now

Quelle est la différence? Aucun, AFAICT.

Après le redémarrage, revérifiez vos modules sonores.

$ cat /proc/asound/modules
 1 snd_usb_audio

$ cat /proc/asound/cards
 1 [Set            ]: USB-Audio - C-Media USB Headphone Set
                      C-Media USB Headphone Set at usb-3f980000.usb-1.5, full speed

Bom! Votre ennuyeux bcm2835 ( card 0) a disparu, mais l'index de la carte USB est le même! C'est vraiment bon.

Configurez votre ALSA

Comme je l'ai déjà mentionné, nous voulons qu'ALSA utilise notre propre carte son USB par défaut. Cela signifie également que nous voulons qu'il ait le premier index disponible dans la liste des modules sonores du noyau. Puisque le module a été supprimé ci-dessus et que l'index est le même (carte 1), nous sommes bons. Mais au cas où nous aurions besoin de charger à nouveau bcm2835, nous ne le sommes pas, car ce module réapparaîtrait comme le premier ( card 0).

Nous devons simplement dire à ALSA quels devraient être notre index de carte PCM par défaut et dans quel ordre ils doivent être priorisés dans le noyau.

Il y a 3 endroits où vous pouvez configurer votre ALSA.

  • la configuration de l' utilisateur dans:~/.asoundrc
  • la configuration du système dans:/usr/share/alsa/alsa.conf
  • le module système conf dans:/lib/modprobe.d/aliases.conf

Les 2 premiers modifient les appareils par défaut, tandis que les derniers, assurent l'ordre d'apparition.

Nous fixons d'abord notre configuration utilisateur spécifique à utiliser card 1. Si plusieurs cartes sont affichées, sélectionnez l'index de celle que vous souhaitez utiliser par défaut.

#cat ~/.asoundrc
cat << EOF | tee ~/.asoundrc

pcm.!default {
        type hw
        card 1
}

ctl.!default {
        type hw
        card 1
}
EOF

Ensuite, nous corrigeons la configuration du système, en utilisant les mêmes numéros d'index de carte que ci-dessus. Nous devons le faire, car certains packages système ne verront jamais votre fichier de configuration utilisateur.

sudo nano /usr/share/alsa/alsa.conf
# then replace:
#defaults.ctl.card 0
#defaults.pcm.card 0
# with:
defaults.ctl.card 1
defaults.pcm.card 1

Redémarrez maintenant pour que les modifications prennent effet.

Vous devriez maintenant avoir un système audio fonctionnel.


Testons-le!

Pour effectuer un test approprié, vous avez besoin de fichiers appropriés pour tester avec. Donc, avant tout, assurez-vous que tous vos fichiers audio et vidéo fonctionnent réellement.

(J'ai passé beaucoup de temps à essayer d'obtenir une vidéo de test h264 / mp4 pour lire de l'audio, pour découvrir plus tard, qu'il n'avait jamais encodé audio! Duh!)

AVERTISSEMENT Si vous essayez de tester des vidéos qui utilisent les codecs MPEG-2ou VC-1, vous devez acheter (!) Une clé de codec auprès de l'organisation RPi pour pouvoir la décoder entièrement avec les décodeurs matériels intégrés. Sinon, vous devez d'abord convertir les fichiers.

Vous pouvez vérifier si votre codec est activé avec:

# Check with:
vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1

Vous aurez besoin de fichiers vérifiés pour tester. Vous pouvez les télécharger et les utiliser si vous n'en avez pas.

# get some demo sound and video files
cd ~/Music

wget -Lk http://rpf.io/lamp3 -O example_11k.mp3
wget -Lk http://www.kozco.com/tech/piano2-CoolEdit.mp3 -O pianoTest_48k.mp3
wget -Lk http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_2mb.mp4 -O bbb_720p_2mb.mp4
wget -Lk https://raw.githubusercontent.com/mediaelement/mediaelement-files/master/big_buck_bunny.mp4 -O bbb_360_22k.mp4

Ensuite, jouons !!

# Double-check! 
aplay -l && arecord -l

**** List of PLAYBACK Hardware Devices ****
card 1: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

**** List of CAPTURE Hardware Devices ****
card 1: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0


# Play white noise on 2-channels (L/R) on Card-1 
speaker-test -c2 -D hw:1,0

# Play a WAV sound file
speaker-test -c2 -D hw:1,0 --test=wav -w /usr/share/sounds/alsa/Front_Center.wav

# Once the correct default card+device is set, and after reboot, 
# then full left/right voice test (above) is performed, just by:
speaker-test -c2 -twav

# Record some sounds (with a VU bar):
arecord --device=hw:1,0 --format S16_LE --rate 44100 -c1 -V mono test.wav

# Play recorded sounds
aplay -D plughw:1,0 test.wav

# Play recorded sounds (sample rate have to be equal) 
speaker-test -c2 -D plughw:1,0 -r 44100 --test=wav -W $HOME -w test.wav

# Install an MP3 player
sudo apt-get install mpg123

# Play some MP3 file
mpg123 -v -r 44100 some.mp3

# Play an MP3 sound stream
mpg123 http://ice1.somafm.com/u80s-128-mp3


# This plays video, but no sound!
omxplayer -o alsa /opt/vc/src/hello_pi/hello_video/test.h264

# This plays video and sound!
omxplayer -o alsa bbb_720p_2mb.mp4

# The following plays sometimes (!?) and at the wrong speed!
omxplayer -o alsa some.mp3

TU ES PRÊT!


[facultatif] Commande de matériel audio supplémentaire

REMARQUE Si vous utilisez cette section, vous devez modifier toutes les valeurs d'index des cartes dans les sections ci-dessus!

Si vous avez connecté du matériel audio supplémentaire et qu'il ne s'affiche pas comme vous le souhaitez, vous pouvez forcer à réorganiser l'ordre dans lequel les modules apparaissent, dans le /lib/modprobe.d/aliases.conffichier.

Certaines solutions ont proposé d'apporter des modifications à ce fichier. Malheureusement, ils ne savent pas que le module de son USB RPi par défaut est mal orthographié! Les modifications ne prennent donc jamais effet. Le module du noyau sonore qui nous intéresse est appelé snd_usb_audioet non snd-usb-audio. Le nom de fichier est snd-usb-audio.koet situé dans: /lib/modules/4.9.59-v7+/kernel/sound/usb/.

Assez drôle, le texte dans le fichier dit qu'il n'a pas besoin d'être modifié!

sudo nano /lib/modprobe.d/aliases.conf

#--------------------------------------
# For original (out-of-box) use
#--------------------------------------
# replace this: 
options snd-usb-audio index=-2
# with this:
options snd_usb_audio index=-2

#--------------------------------------
# To change the index & order
#--------------------------------------
# Set the index value of the cards:
options snd_usb_audio index=0
options snd_bcm2835 index=1
# Set the order:
options snd slots=snd_usb_audio,snd_bcm2835

Les références:

not2qubit
la source
L'utilisation d'un raspi 3B + avec Raspian aplayn'a toujours rien fait après tout ce travail, jusqu'à ce que j'utilise à la -D plughw:0,0place de -D hw:0,0(basé sur shttps: //raspberrypi.stackexchange.com/a/89162). Malheureusement, alors que presque tout peut désormais lire de l'audio via USB, l'utilitaire dont j'ai le plus besoin ( vban_receptor) ne fonctionne toujours pas, mais à ce stade, ce n'est certainement plus la faute de la configuration
Mike 'Pomax' Kamermans
1
Oui, c'est un cauchemar sanglant. Veuillez consulter la liste des différents plugins PCM ici . Lisez ensuite la 1ère section intitulée "Périphériques et plug-ins ALSA" ici . Peut-être que cela aiderait à comprendre pourquoi vous devez utiliser à la plughwplace de hw. BTW. Étant donné que hwc'est directement du matériel, alors plughwque certains traitements sont effectués, vous voudrez peut-être vérifier ce que vous essayez de jouer.
not2qubit
Je l'ai testé avec l'un des fichiers audio de test standard des tourbières dans /usr/share/sounds/alsa(spécifiquement, Front_Center.wav)
Mike 'Pomax' Kamermans
1
Vous star absolue. Je ne m'attendais pas à ce que le son d'un Raspberry Pi soit un projet de plusieurs jours sans aucune indication claire sur ce qu'il faut faire. Tous les +1 pour vous.
Kieran
3
Il est criminel qu'il y ait si peu de votes positifs.
BradChesney79