tło
To niesamowite, jak wiele wysiłku włożono w próby rozwiązania różnych problemów związanych z dźwiękiem w Raspberry Pi. Najwyraźniej musi to być najsłabsze miejsce dla nowych użytkowników, aby z powodzeniem rozwijać ALSA i korzystać z niego pod Raspbian. Spędziłem dużo czasu i wysiłku, próbując uzyskać własny dźwięk RPi3 działający w różnych wersjach systemu operacyjnego, a także w innych dystrybucjach Linuksa, dlatego postanowiłem napisać rozstrzygającą stronę rozwiązania. Przynajmniej na temat używania zewnętrznej karty dźwiękowej w najnowszej wersji
Raspbian Stretch .
System dźwiękowy ALSA
ALSA ma obsługiwać wszelkiego rodzaju urządzenia oparte na * nix, niezależnie od konfiguracji sprzętowej i bez względu na to, ile lat ma sprzęt. Nie ma sensu próbować zagłębiać się w szczegóły
20 lat
jego rozwoju. Po prostu stosujemy esencję do obecnej sytuacji.
Jednak nigdy w historii ludzkość nie stworzyła takiej ilości bezużytecznych i dysfunkcyjnych diagramów, jak przy próbie wyjaśnienia ALSA. Jedynymi zdalnie informacyjnymi są te dwa:
Uzyskiwanie informacji o systemie
Pierwszym krokiem jest ustalenie, jaki dźwięk, jeśli w ogóle, działa i jaki sprzęt już masz. Istnieje wiele sposobów na znalezienie detali, ale dla przeciętnego człowieka większość tych szczegółów jest bez znaczenia. Pokazujemy najważniejsze.
Co chcemy wiedzieć o naszym (dźwiękowym) systemie?
Chcemy wiedzieć:
- nazwa i wersje wbudowanego dźwięku
- nazwa i wersje zewnętrznego sprzętu dźwiękowego
- jakich sterowników (modułów) jądra używa
- jakie inne sterowniki / moduły jądra związane z dźwiękiem są ładowane
- jakie karty dźwiękowe są dostępne
- w jakiej kolejności karty dźwiękowe są używane i wybierane przez system operacyjny i programy
- jeśli występują sprzeczne programy sprzętowe lub dźwiękowe
Skąd chcesz odtwarzać i nagrywać dźwięk w swoim systemie?
Dostępne opcje odtwarzania dźwięków to:
- Z wewnętrznego gniazda słuchawkowego audio 3,5 mm (dźwięk analogowy)
- Z podłączonego ekranu / monitora HDMI
- Z zewnętrznej karty dźwiękowej USB
- Z portu GPIO
Dostępne opcje nagrywania dźwięków to:
- za. Z zewnętrznej karty dźwiękowej USB (z co najmniej jednym rodzajem wejścia)
- b. Z pliku lub strumienia
- do. Z GPIO
W tym poście dowiemy się, jak grać i nagrywać za pomocą zewnętrznej karty dźwiękowej USB .
Plan sukcesu na przyszłość?
Dzięki aktualizacjom RPi stale pojawiają się nowe zmiany i ulepszenia, często łamiące stare rozwiązania. Chodzi o to, aby wprowadzić jak najmniej zmian w systemie lub uczynić je oczywistymi w razie potrzeby. Oznacza to, że wolimy używać konfiguracji użytkownika, niż konfiguracji systemowej. Tj. Spróbuj użyć plików konfiguracyjnych w katalogu domowym, a nie w plikach systemowych będących własnością root.
TL; DR (Chodźmy już!)
Uruchom ponownie i podłącz zewnętrzną kartę dźwiękową USB, więc zaczynamy od tej samej strony ...
A. Zbierz trochę informacji
# 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]
Widzimy tutaj, że system default ( card 0
) korzysta z modułu ALSA bcm2835. Chociaż zwykle możemy określić, jakiej karty użyć, niektóre programy, takie jak omxplayer
, nie mają tej opcji i nie będą generować żadnego dźwięku na różne sposoby.
W tym momencie możesz już spróbować skonfigurować pliki konfiguracyjne ALSA. Niektóre odnoszą sukcesy, a inne nie, ponieważ nie jest oczywiste, jak i gdzie należy to zrobić. Ostatecznie chcemy, aby nasz system użył naszej zewnętrznej karty dźwiękowej USB.
B. Usuń wzdęcia audio
Jeśli nie masz bardzo dobrych powodów, aby zatrzymać PulseAudio (PA) lub
dodatkowe oprogramowanie serwera JACK , powinieneś je odinstalować , jeśli są. Mają tendencję do zakłócania działania ALSA, ponieważ przejmują kontrolę nad wieloma funkcjami ALSA, a wszystkie dodatkowe wymagane przez nie konfiguracje sprawiają, że wszystko jest niezwykle mylące!
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. Wyłącz wewnętrzną kartę dźwiękową (Broadcom)
Wewnętrzna karta dźwiękowa jest napędzana przez moduł jądra w:
/lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko
O ile nie planujesz używać gniazda audio (w 1) lub HDMI (w 2), powinieneś wyłączyć ten moduł jądra. Można to zrobić na dwa sposoby.
- Wyłącz go za pomocą flagi konfiguracji rozruchu
- Zapobiegaj ładowaniu go do jądra przez
modprobe.d
demona
Starając się pozostać przy naszym minimalistycznym podejściu, wybieramy (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
Jeśli z jakiegoś powodu wolisz użyć metody (2), musisz umieścić na czarnej liście moduł jądra. Aby to zrobić, wystarczy wpisać słowo blacklist
, a następnie nazwę modułu w dowolnym *.conf
pliku pod /etc/modprobe.d/
. Jednak istnieje już pusty, zarezerwowany plik, wywołany raspi-blacklist.conf
w tym celu. Jednak po 6 miesiącach zapomnisz o tym i o tym, co zawiera, więc lepiej nazwać go po module, który umieszczasz na czarnej liście.
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
Co za różnica? Brak, AFAICT.
Po ponownym uruchomieniu ponownie sprawdź moduły dźwiękowe.
$ 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! Twój denerwujący bcm2835 ( card 0
) zniknął, ale indeks karty USB jest taki sam! To jest naprawdę dobre.
Skonfiguruj ALSA
Jak już wspomniałem, chcemy, aby ALSA używała własnej karty dźwiękowej USB jako domyślnej. Oznacza to również, że chcemy, aby miał on pierwszy dostępny indeks na liście modułów dźwiękowych jądra. Ponieważ moduł został usunięty powyżej, a indeks jest taki sam (karta 1), jesteśmy dobrzy. Jednak w przypadku musimy bcm2835 obciążenia ponownie, nie jesteśmy, jako że moduł będzie ponownie pojawi się jako pierwsza ( card 0
).
Musimy po prostu powiedzieć ALSA, jaki powinien być nasz domyślny indeks kart PCM
i w jakiej kolejności powinny być traktowane priorytetowo w jądrze.
Istnieją 3 miejsca, w których możesz skonfigurować ALSA.
- config użytkownik w:
~/.asoundrc
- config System w:
/usr/share/alsa/alsa.conf
- conf Moduł System w:
/lib/modprobe.d/aliases.conf
Pierwsze 2 zmieniają domyślne urządzenia, a ostatnie zapewniają kolejność wyświetlania.
Najpierw naprawiamy naszą konfigurację specyficzną dla użytkownika do użycia card 1
. Jeśli pokazano więcej niż jedną kartę, wybierz indeks karty, która ma być domyślna.
#cat ~/.asoundrc
cat << EOF | tee ~/.asoundrc
pcm.!default {
type hw
card 1
}
ctl.!default {
type hw
card 1
}
EOF
Następnie naprawiamy konfigurację systemu, używając tych samych numerów indeksów kart, jak powyżej. Musimy to zrobić, ponieważ niektóre pakiety systemowe nigdy nie zobaczyłyby pliku konfiguracyjnego użytkownika.
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
Teraz uruchom ponownie, aby zmiany odniosły skutek.
Powinieneś teraz mieć działający system audio.
Przetestujmy to!
Aby wykonać odpowiedni test, potrzebujesz odpowiednich plików do testowania. Przede wszystkim upewnij się, że wszystkie pliki dźwiękowe i wideo faktycznie działają.
(Spędziłem dużo czasu próbując uzyskać wideo testowe h264 / mp4 do odtwarzania dźwięku, ale później odkryłem, że nigdy nie było zakodowane żadnego dźwięku! Duh!)
OSTRZEŻENIE Jeśli próbujesz przetestować filmy, które używają
kodeków MPEG-2
lub VC-1
, musisz
kupić (!) Klucz kodeku
od organizacji RPi, aby móc go w pełni zdekodować za pomocą wbudowanych dekoderów sprzętowych. W przeciwnym razie musisz najpierw przekonwertować pliki.
Możesz sprawdzić, czy twój kodek jest włączony za pomocą:
# Check with:
vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1
Będziesz potrzebować zweryfikowanych plików do testowania. Możesz je pobrać i używać, jeśli ich nie masz.
# 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
Następnie zagrajmy !!
# 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
MOŻESZ RUSZAĆ!
[opcjonalnie] Zamówienie dodatkowego sprzętu audio
UWAGA Jeśli korzystasz z tej sekcji, musisz zmienić wszystkie wartości indeksu karty w powyższych sekcjach!
Jeśli podłączyłeś dodatkowy sprzęt audio i nie wyświetla się on tak, jak chcesz, możesz zmusić do zmiany kolejności wyświetlania modułów w /lib/modprobe.d/aliases.conf
pliku.
Niektóre rozwiązania proponują wprowadzenie zmian w tym pliku. Niestety nie są świadomi, że domyślny moduł dźwiękowy USB RPi ma błędną pisownię! Tak więc zmiany nigdy nie obowiązują. Moduł jądra dźwięku, którym się zajmujemy, jest wywoływany snd_usb_audio
i nie snd-usb-audio
. Nazwa pliku jest snd-usb-audio.ko
i znajduje się w: /lib/modules/4.9.59-v7+/kernel/sound/usb/
.
Zabawne, tekst w pliku mówi, że nie trzeba go modyfikować!
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
Bibliografia:
aplay
konsekwentnie nie zrobił nic, po całej tej pracy, dopóki nie użyłem-D plughw:0,0
zamiast-D hw:0,0
(na podstawie shttps: //raspberrypi.stackexchange.com/a/89162). Niestety, chociaż prawie wszystko może teraz odtwarzać dźwięk przez USB, narzędzie, które muszę pracować najbardziej (vban_receptor
) nadal nie działa, ale w tym momencie prawie na pewno nie jest to już wina konfiguracjiplughw
zamiasthw
. BTW. Ponieważhw
jest to bezpośrednio sprzętowe, podczas gdyplughw
wykonuje pewne przetwarzanie, możesz sprawdzić, co naprawdę próbujesz odtworzyć./usr/share/sounds/alsa
(konkretnieFront_Center.wav
)