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:
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:
- De la prise casque audio 3,5 mm interne (audio analogique)
- Depuis l'écran / moniteur connecté HDMI
- Depuis une carte son USB externe
- 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.
- Désactivez-le avec un indicateur de configuration de démarrage
- Empêchez-le d'être chargé dans le noyau par le
modprobe.d
dé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 *.conf
fichier 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-2
ou 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.conf
fichier.
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_audio
et non snd-usb-audio
. Le nom de fichier est snd-usb-audio.ko
et 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:
aplay
n'a toujours rien fait après tout ce travail, jusqu'à ce que j'utilise à la-D plughw:0,0
place 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 configurationplughw
place dehw
. BTW. Étant donné quehw
c'est directement du matériel, alorsplughw
que certains traitements sont effectués, vous voudrez peut-être vérifier ce que vous essayez de jouer./usr/share/sounds/alsa
(spécifiquement,Front_Center.wav
)