Wie kann ich eine externe USB-Soundkarte verwenden und als Standard festlegen?

15

Ich habe eine externe USB-Soundkarte von C-Media auf meinem RPi3. Ich kann einige Aufnahmen mit aplay / arecord abspielen, indem ich die Kartei und das ALSA-Plugin spezifiziere. Viele andere Audiodateien werden jedoch nicht oder nicht wie erwartet wiedergegeben. Einige andere Player-Software funktioniert auch nicht.

F: Wie kann ich ALSA so einrichten, dass es standardmäßig verwendet wird?

not2qubit
quelle

Antworten:

31

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:

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

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:

  1. Über die interne 3,5-mm-Audio-Kopfhörerbuchse (analoges Audio)
  2. Vom über HDMI angeschlossenen Bildschirm / Monitor
  3. Von einer externen USB-Soundkarte
  4. 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.

  1. Deaktivieren Sie es mit einem Boot-Konfigurations-Flag
  2. Verhindern Sie, dass der modprobe.dDaemon 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 *.confDatei unter /etc/modprobe.d/. Es gibt jedoch bereits eine leere, reservierte Datei, die raspi-blacklist.confzu 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.confDatei 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_audiound nicht snd-usb-audio. Der Dateiname ist snd-usb-audio.kound 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:

not2qubit
quelle
Die Verwendung einer Raspi 3B + mit Raspian aplayhat nach all dieser Arbeit durchweg nichts bewirkt, bis ich sie -D plughw:0,0anstelle 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
Mike 'Pomax' Kamermans 11.04.19
1
Ja, das ist ein verdammter Albtraum. Bitte sehen Sie sich hier die Liste der verschiedenen PCM-Plugins an . Lesen Sie dann den ersten Abschnitt mit dem Namen "ALSA-Geräte und Plugins" hier . Vielleicht würde das helfen, etwas Licht in den Sinn zu bringen, warum Sie plughwstattdessen verwenden müssen hw. Übrigens. Da hwes sich direkt um Hardware handelt, während plughweinige Prozesse ausgeführt werden, möchten Sie möglicherweise überprüfen, was Sie tatsächlich spielen möchten.
not2qubit
Ich habe es mit einer der Standard-Test-Audiodateien in /usr/share/sounds/alsa(im Einzelnen Front_Center.wav)
Mike 'Pomax' Kamermans,
1
Du absoluter Star. Ich hatte nicht damit gerechnet, dass es ein mehrtägiges Projekt ohne klare Anleitung sein würde, aus einem Himbeer-Pi Sound zu machen. Alle +1 für dich.
Kieran
3
Es ist kriminell, dass es so wenige Gegenstimmen gibt.
BradChesney79