Hintergrund
Es ist erstaunlich zu sehen, wie viel Mühe darauf verwendet wurde, verschiedene Soundprobleme für den Raspberry Pi zu lösen. Anscheinend muss es die schwächste Stelle für neue Benutzer sein, um mit ALSA unter Raspbian erfolgreich zu entwickeln und zu verwenden. Nachdem ich viel Zeit und Mühe darauf verwendet habe, meinen eigenen RPi3-Sound in verschiedenen Betriebssystemversionen und auch in anderen Linux-Distributionen zum Laufen zu bringen, habe ich mich entschlossen, die abschließende To-Go-To-Lösungsseite zu schreiben. Zumindest für das Thema der Verwendung einer externen Soundkarte auf dem neuesten
Raspbian Stretch .
Das ALSA Soundsystem
ALSA soll alle Arten von * nix-basierten Geräten unterstützen, unabhängig von ihrer Hardwarekonfiguration und dem Alter der Hardware. Unnötig, es macht wenig Sinn, sich mit den Details von
20 Jahren
seiner Entwicklung zu beschäftigen. Wir wenden das Wesentliche einfach auf eine aktuelle Situation an.
Jedoch hat die Menschheit zu keinem Zeitpunkt in der Geschichte eine solche Menge nutzloser und dysfunktionaler Diagramme erstellt, um zu versuchen, ALSA zu erklären. Die einzigen, die in der Ferne informativ sind, sind diese beiden:
Abrufen der Systeminformationen
Der erste Schritt besteht darin, herauszufinden, welcher Sound funktioniert und welche Hardware Sie bereits haben. Es gibt viele Möglichkeiten, Details herauszufinden, aber für den Durchschnittsbürger sind die meisten dieser Details bedeutungslos. Wir zeigen das Wichtigste.
Was möchten wir über unser (Ton-) System wissen?
Wir wollen wissen:
- Name und Versionen der integrierten Soundhardware
- Name und Version der externen Soundhardware
- Welche Kerneltreiber (Module) werden verwendet?
- Welche anderen Sound-bezogenen Kernel-Treiber / Module werden geladen?
- Welche Soundkarten sind verfügbar?
- In welcher Reihenfolge werden die Soundkarten vom Betriebssystem und den Programmen verwendet und ausgewählt?
- Wenn es widersprüchliche Hardware- oder Soundsystemprogramme gibt
Von wo möchten Sie Sound auf Ihrem System abspielen und aufnehmen?
Ihre Optionen zum Abspielen von Sounds können sein:
- Über die interne 3,5-mm-Audio-Kopfhörerbuchse (analoges Audio)
- Vom über HDMI angeschlossenen Bildschirm / Monitor
- Von einer externen USB-Soundkarte
- Von einem GPIO-Port
Ihre Optionen für die Tonaufnahme können sein:
- ein. Von einer externen USB-Soundkarte (mit mindestens einem Eingangstyp)
- b. Aus einer Datei oder einem Stream
- c. Von einem GPIO
In diesem Beitrag erfahren Sie, wie Sie mit der externen USB-Soundkarte spielen und aufnehmen .
Ein zukunftssicherer Erfolgsplan?
Mit den RPi-Updates gibt es einen ständigen Fluss neuer Änderungen und Verbesserungen, die häufig alte Lösungen zum Scheitern bringen. Die Idee dabei ist, so wenig Änderungen wie möglich am System vorzunehmen oder sie bei Bedarf offensichtlich zu machen. Das heißt, wir bevorzugen eine benutzerspezifische Konfiguration als eine systemweite. Dh versuchen Sie, Konfigurationsdateien in Ihrem Home-Verzeichnis zu verwenden, anstatt in root-eigenen Systemdateien.
TL; DR (Lass uns schon loslegen!)
Starten Sie Ihre externe USB-Soundkarte neu und schließen Sie sie an, damit wir auf derselben Seite beginnen ...
A. Sammle einige Informationen
# 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]
Hier sehen wir, dass das System default ( card 0
) das ALSA-Modul bcm2835 verwendet. Obwohl wir normalerweise festlegen können, welche Karte verwendet werden soll, hat manche Software wie omxplayer
diese Option nicht und kann keinen Ton auf verschiedene Arten erzeugen.
Zu diesem Zeitpunkt könnten Sie bereits versuchen, Ihre ALSA-Konfigurationsdateien zu konfigurieren. Einige sind erfolgreich, andere nicht, weil nicht klar ist, wie und wo dies erfolgen soll. Letztendlich möchten wir, dass unser System unsere externe USB-Soundkarte verwendet.
B. Entfernen Sie Audio Bloat
Sofern Sie keine guten Gründe haben, PulseAudio (PA) oder
zusätzliche JACK- Serversoftware beizubehalten, sollten Sie diese deinstallieren , sofern sie vorhanden sind. Sie neigen dazu, ALSA zu stören, da sie die Kontrolle über viele ALSA-Funktionen übernehmen, und all die zusätzlichen Konfigurationen, die von diesen benötigt werden, machen die Dinge unglaublich verwirrend!
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. Deaktivieren Sie die interne Soundkarte (Broadcom)
Die interne Soundkarte wird vom Kernel-Modul gesteuert in:
/lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko
Sofern Sie nicht vorhaben, die Audio-Buchse (in 1) oder HDMI (in 2) zu verwenden, sollten Sie dieses Kernel-Modul deaktivieren. Es gibt zwei Methoden, um dies zu tun.
- Deaktivieren Sie es mit einem Boot-Konfigurations-Flag
- Verhindern Sie, dass der
modprobe.d
Daemon ihn in den Kernel lädt
Um bei unserem minimalistischen Ansatz zu bleiben, wählen wir (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
Wenn Sie aus irgendeinem Grund die Methode (2) bevorzugen, müssen Sie das Kernelmodul auf die schwarze Liste setzen. Dazu geben Sie einfach das Wort ein blacklist
, gefolgt vom Namen des Moduls in einer beliebigen *.conf
Datei unter /etc/modprobe.d/
. Es gibt jedoch bereits eine leere, reservierte Datei, die raspi-blacklist.conf
zu diesem Zweck aufgerufen wird . Nach 6 Monaten haben Sie dies und das, was es enthält, jedoch vergessen. Benennen Sie es daher besser nach dem Modul, das Sie auf die schwarze Liste setzen.
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
Was ist der Unterschied? Keine, AFAICT.
Überprüfen Sie nach dem Neustart Ihre Soundmodule erneut.
$ 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! Ihr nerviges bcm2835 ( card 0
) ist weg, aber der Index der USB-Karte ist der gleiche! Das ist eigentlich gut.
Konfigurieren Sie Ihren ALSA
Wie bereits erwähnt, soll ALSA standardmäßig eine eigene USB-Soundkarte verwenden. Dies bedeutet auch, dass es den ersten verfügbaren Index in der Liste der Kernel-Soundmodule haben soll. Da das Modul oben entfernt wurde und der Index derselbe ist (Karte 1), sind wir gut. Falls wir jedoch bcm2835 erneut laden müssen, ist dies nicht der Fall, da dieses Modul als erstes wieder angezeigt wird ( card 0
).
Wir müssen ALSA lediglich mitteilen, wie unser Standard-PCM-Kartenindex lauten soll
und in welcher Reihenfolge sie im Kernel priorisiert werden sollen.
Es gibt 3 Stellen, an denen Sie Ihren ALSA konfigurieren können.
- die Benutzerkonfiguration in:
~/.asoundrc
- die Systemkonfiguration in:
/usr/share/alsa/alsa.conf
- Das Systemmodul konf in:
/lib/modprobe.d/aliases.conf
Die ersten beiden ändern die Standardgeräte, während die letzten die Reihenfolge der Darstellung sicherstellen.
Wir korrigieren zuerst unsere benutzerspezifische Konfiguration card 1
. Wenn mehr als eine Karte angezeigt wird, wählen Sie den Index der Karte aus, die Sie als Standard festlegen möchten.
#cat ~/.asoundrc
cat << EOF | tee ~/.asoundrc
pcm.!default {
type hw
card 1
}
ctl.!default {
type hw
card 1
}
EOF
Als nächstes korrigieren wir die Systemkonfiguration mit den gleichen Kartennummern wie oben. Wir müssen dies tun, da einige Systempakete Ihre Benutzerkonfigurationsdatei niemals sehen würden.
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
Starten Sie jetzt neu, damit die Änderungen wirksam werden.
Sie sollten jetzt ein funktionierendes Audiosystem haben.
Lass es uns testen!
Um einen ordnungsgemäßen Test durchzuführen, benötigen Sie ordnungsgemäße Dateien zum Testen. Stellen Sie also vor allem sicher, dass alle Ihre Audio- und Videodateien tatsächlich funktionieren.
(Ich habe viel Zeit damit verbracht, ein h264 / mp4-Testvideo zum Abspielen von Audio zu bringen, um später festzustellen, dass es nie Audio-codiert hatte! Duh!)
WARNUNG Wenn Sie Videos testen
möchten, die den CodecMPEG-2
oder verwenden VC-1
, müssen Sie
einen Codec-Schlüssel (!) Von der RPi-Organisation kaufen , um ihn mit den integrierten Hardware-Decodern vollständig decodieren zu können. Andernfalls müssen Sie zuerst die Dateien konvertieren.
Sie können überprüfen, ob Ihr Codec aktiviert ist mit:
# Check with:
vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1
Zum Testen benötigen Sie einige überprüfte Dateien. Sie können diese herunterladen und verwenden, wenn Sie keine haben.
# 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
Als nächstes lasst uns SPIELEN !!
# 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
DU BIST STARTKLAR!
[optional] Bestellung zusätzlicher Audio-Hardware
HINWEIS Wenn Sie diesen Abschnitt verwenden, müssen Sie alle Karteiwerte in den obigen Abschnitten ändern!
Wenn Sie zusätzliche Audio-Hardware angeschlossen haben und diese nicht wie gewünscht angezeigt wird, können Sie erzwingen, dass die Reihenfolge, in der die Module angezeigt werden, in der /lib/modprobe.d/aliases.conf
Datei geändert wird .
Einige Lösungen haben vorgeschlagen, Änderungen in dieser Datei vorzunehmen. Leider wissen sie nicht, dass das RPi-Standard-USB-Soundmodul falsch geschrieben ist! Die Änderungen werden also nie wirksam. Das Sound-Kernel-Modul, mit dem wir uns befassen, heißt snd_usb_audio
und nicht snd-usb-audio
. Der Dateiname ist snd-usb-audio.ko
und befindet sich in: /lib/modules/4.9.59-v7+/kernel/sound/usb/
.
Witzigerweise muss der Text in der Datei nicht geändert werden!
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
Verweise:
aplay
hat nach all dieser Arbeit durchweg nichts bewirkt, bis ich sie-D plughw:0,0
anstelle von verwendete-D hw:0,0
(basierend auf shttps: //raspberrypi.stackexchange.com/a/89162). Leider funktioniert das Dienstprogramm, mit dem ich am meisten arbeiten muss (vban_receptor
), noch immer nicht , obwohl jetzt fast alles Audio über USB wiedergeben kann , aber an diesem Punkt ist es mit ziemlicher Sicherheit nicht mehr die Schuld des Setups