Jak mogę użyć zewnętrznej karty dźwiękowej USB i ustawić ją jako domyślną?

16

Mam zewnętrzną kartę dźwiękową USB od C-Media działającą na moim RPi3. Mogę odtwarzać niektóre nagrania za pomocą aplay / arecord , podając indeks karty i wtyczkę ALSA. Jednak wiele innych plików dźwiękowych w ogóle nie jest odtwarzanych lub jest niezgodnych z oczekiwaniami. Niektóre inne oprogramowanie odtwarzacza również nie działa.

P: Jak skonfigurować ALSA, aby domyślnie go używał?

not2qubit
źródło

Odpowiedzi:

32

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:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

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:

  1. Z wewnętrznego gniazda słuchawkowego audio 3,5 mm (dźwięk analogowy)
  2. Z podłączonego ekranu / monitora HDMI
  3. Z zewnętrznej karty dźwiękowej USB
  4. 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.

  1. Wyłącz go za pomocą flagi konfiguracji rozruchu
  2. Zapobiegaj ładowaniu go do jądra przez modprobe.ddemona

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 *.confpliku pod /etc/modprobe.d/. Jednak istnieje już pusty, zarezerwowany plik, wywołany raspi-blacklist.confw 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-2lub 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.confpliku.

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_audioi nie snd-usb-audio. Nazwa pliku jest snd-usb-audio.koi 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:

not2qubit
źródło
Korzystanie z raspi 3B + z Raspian, aplaykonsekwentnie nie zrobił nic, po całej tej pracy, dopóki nie użyłem -D plughw:0,0zamiast -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 konfiguracji
Mike 'Pomax' Kamermans
1
Tak, to cholerny koszmar. Przejrzyj listę różnych wtyczek PCM tutaj . Następnie przeczytaj pierwszą część o nazwie „Urządzenia i wtyczki ALSA” tutaj . Być może pomogłoby to rzucić nieco światła na powód, dla którego należy używać plughwzamiast hw. BTW. Ponieważ hwjest to bezpośrednio sprzętowe, podczas gdy plughwwykonuje pewne przetwarzanie, możesz sprawdzić, co naprawdę próbujesz odtworzyć.
not2qubit
Przetestowałem go z jednym ze standardowych plików audio testowych w /usr/share/sounds/alsa(konkretnie Front_Center.wav)
Mike 'Pomax' Kamermans
1
Jesteś gwiazdą absolutną. Nie spodziewałem się, że wydobycie dźwięku z malinowego pi będzie wielodniowym projektem bez jasnych wskazówek, co robić. Wszystkie +1 dla Ciebie.
Kieran
3
Kryminalne jest to, że jest tak mało pozytywnych opinii.
BradChesney79