Come posso utilizzare una scheda audio USB esterna e impostarla come predefinita?


16

Ho una scheda audio USB esterna da C-Media in esecuzione sul mio RPi3. Posso riprodurre alcune registrazioni usando aplay / arecord specificando l'indice delle carte e il plugin ALSA. Tuttavia, molti altri file audio non vengono riprodotti affatto o non come previsto. Alcuni software del lettore non funzionano neanche.

D: Come posso configurare ALSA per usarlo di default?

Risposte:


32

sfondo

È incredibile vedere quanti sforzi sono stati fatti per cercare di risolvere vari problemi relativi al suono del Raspberry Pi. Apparentemente deve essere il punto più debole per i nuovi utenti di sviluppare con successo e utilizzare ALSA sotto Raspbian. Avendo speso molto tempo e sforzi nel tentativo di far funzionare il mio suono RPi3 in diverse versioni del sistema operativo e anche in altre distribuzioni Linux, ho deciso di scrivere la pagina di soluzione definitiva. Almeno per l'argomento dell'utilizzo di una scheda audio esterna sull'ultimo Raspbian Stretch .

Il sistema audio ALSA

ALSA intende supportare qualsiasi tipo di dispositivo basato su * nix, indipendentemente dalla sua configurazione hardware e indipendentemente dalla sua età. Inutile, è inutile cercare di entrare nei dettagli di 20 anni del suo sviluppo. Semplicemente applichiamo l'essenza a una situazione attuale.

Tuttavia, in nessun momento della storia l'umanità ha prodotto una tale quantità di diagrammi inutili e disfunzionali, come per cercare di spiegare ALSA. Le uniche informative a distanza sono queste due:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Ottenere le informazioni di sistema

Il primo passo è capire quale suono, se presente, funziona e quale hardware hai già. Ci sono molti modi per scoprire i detal, ma per la persona media, la maggior parte di quei dettagli non ha senso. Mostriamo il più importante.

Cosa vogliamo sapere sul nostro sistema (audio)?

Vogliamo sapere:

  • il nome e le versioni dell'hardware audio incorporato
  • il nome e le versioni dell'hardware audio esterno
  • quali driver del kernel (moduli) utilizza
  • quali altri driver / moduli del kernel relativi al suono sono caricati
  • quali schede audio sono disponibili
  • in quale ordine le schede audio vengono utilizzate e selezionate dal sistema operativo e dai programmi
  • in caso di hardware in conflitto o programmi di sistema audio

Da dove vuoi riprodurre e registrare l'audio sul tuo sistema?

Le opzioni per la riproduzione di suoni possono essere:

  1. Dal jack per cuffie audio interno da 3,5 mm (audio analogico)
  2. Dallo schermo / monitor HDMI collegato
  3. Da una scheda audio USB esterna
  4. Da una porta GPIO

Le opzioni per la registrazione dei suoni possono essere:

  • un. Da una scheda audio USB esterna (con almeno un tipo di ingresso)
  • b. Da un file o flusso
  • c. Da un GPIO

In questo post, ti diremo come giocare e registrare usando la scheda audio USB esterna .

Un piano di successo a prova di futuro?

Con gli aggiornamenti di RPi c'è un flusso costante di nuove modifiche e miglioramenti, spesso rompendo vecchie soluzioni. L'idea qui è di apportare il minor numero possibile di modifiche al sistema o renderle ovvie se necessario. Ciò significa che preferiamo utilizzare una configurazione per utente, piuttosto che a livello di sistema. Vale a dire provare a utilizzare i file di configurazione nella directory principale, anziché nei file di sistema di proprietà root.


TL; DR (Andiamo già!)

Riavvia e collega la tua scheda audio USB esterna, quindi iniziamo dalla stessa pagina ...

A. Raccogli alcune informazioni

# 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]

Qui vediamo che il default di sistema ( card 0) sta usando il modulo ALSA bcm2835. Sebbene di solito possiamo specificare quale scheda utilizzare, alcuni software come omxplayer non hanno questa opzione e non riescono a produrre alcun suono in vari modi.

A questo punto potresti già provare a configurare i tuoi file di configurazione ALSA. Alcuni hanno successo, mentre molti altri non lo sono perché non è ovvio come e dove farlo. Quello che alla fine vogliamo è dire al nostro sistema di usare la nostra scheda audio USB esterna.

B. Rimuovere Audio Bloat

A meno che non abbiate ottime ragioni per conservare PulseAudio (PA) o software aggiuntivo per server JACK , è necessario disinstallarli , se presenti. Tendono a interferire con ALSA, in quanto prendono il controllo di molte funzioni ALSA e tutte le configurazioni aggiuntive necessarie da quelle, rendono le cose incredibilmente confuse!

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. Disabilitare la scheda audio interna (Broadcom)

La scheda audio interna è gestita dal modulo kernel in: /lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko A meno che non si preveda di utilizzare il jack audio (in 1) o HDMI (in 2), è necessario disabilitare questo modulo kernel. Esistono due metodi per farlo.

  1. Disabilitalo con un flag di configurazione di avvio
  2. Impedisci che venga caricato nel kernel dal modprobe.ddemone

Cercando di rimanere con il nostro approccio minimalista, scegliamo (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

Se per qualche motivo, preferisci usare il metodo (2), allora devi inserire nella lista nera il modulo del kernel. Per fare ciò, è sufficiente inserire la parola blacklist, seguita dal nome del modulo in qualsiasi *.conffile in /etc/modprobe.d/. Tuttavia, esiste già un file vuoto e riservato, richiamato raspi-blacklist.confa tale scopo. Tuttavia, dopo 6 mesi, ti sarai dimenticato di questo e di ciò che contiene, quindi è meglio nominarlo dopo il modulo che stai inserendo nella blacklist.

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

Qual è la differenza? Nessuna, AFAICT.

Dopo il riavvio, ricontrolla i tuoi moduli audio.

$ 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! Il tuo fastidioso bcm2835 ( card 0) è sparito, ma l'indice della scheda USB è lo stesso! Questo in realtà è buono.

Configura il tuo ALSA

Come ho già detto, vogliamo che ALSA utilizzi la nostra scheda audio USB come predefinita. Questo significa anche che vogliamo che abbia il primo indice disponibile nell'elenco dei moduli sonori del kernel. Poiché il modulo è stato rimosso sopra e l'indice è lo stesso (scheda 1), siamo a posto. Ma nel caso in cui dovessimo caricare nuovamente bcm2835, non lo siamo, poiché quel modulo riapparirà come il primo ( card 0).

Dobbiamo semplicemente dire ad ALSA quali dovrebbero essere i nostri indici di carte PCM predefiniti e in quale ordine dovrebbero avere la priorità nel kernel.

Ci sono 3 posti in cui puoi configurare il tuo ALSA.

  • l' utente configura in:~/.asoundrc
  • il sistema si configura in:/usr/share/alsa/alsa.conf
  • il modulo di sistema conf :/lib/modprobe.d/aliases.conf

I primi 2 cambiano i dispositivi predefiniti, mentre l'ultimo, garantisce l'ordine di apparizione.

Prima correggiamo la nostra configurazione specifica dell'utente da usare card 1. Se hai più di una carta mostrata, seleziona l'indice di una che desideri impostare come predefinito.

#cat ~/.asoundrc
cat << EOF | tee ~/.asoundrc

pcm.!default {
        type hw
        card 1
}

ctl.!default {
        type hw
        card 1
}
EOF

Quindi, ripariamo la configurazione del sistema, usando gli stessi numeri di indice delle carte di cui sopra. Dobbiamo farlo, perché alcuni pacchetti di sistema non vedrebbero mai il tuo file di configurazione dell'utente.

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

Ora riavviare per rendere effettive le modifiche.

Ora dovresti avere un sistema audio funzionante.


Proviamolo!

Per eseguire un test corretto, sono necessari file corretti con cui eseguire il test. Quindi, prima di tutto, assicurati che tutti i tuoi file audio e video funzionino effettivamente.

(Ho trascorso molto tempo cercando di ottenere alcuni video di prova h264 / mp4 per riprodurre l'audio, solo per scoprire in seguito che non aveva mai codificato alcun audio! Duh!)

ATTENZIONE Se stai provando a testare video che usano i codec MPEG-2o VC-1, devi acquistare (!) Una chiave codec dall'organizzazione RPi per poterla decodificare completamente con i decodificatori hardware integrati. Altrimenti, devi prima convertire i file.

Puoi verificare se il tuo codec è abilitato con:

# Check with:
vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1

Avrai bisogno di alcuni file verificati con cui provare. Puoi scaricarli e usarli se non ne hai.

# 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

Adesso giochiamo !!

# 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

SEI BRAVO AD ANDARE!


[opzionale] Ordine di hardware audio aggiuntivo

NOTA Se si utilizza questa sezione è necessario modificare tutti i valori dell'indice delle carte nelle sezioni precedenti!

Se hai collegato hardware audio aggiuntivo e non viene visualizzato come desideri, puoi forzare a riorganizzare l'ordine in cui i moduli vengono visualizzati nel /lib/modprobe.d/aliases.conffile.

Alcune soluzioni hanno proposto di apportare modifiche in questo file. Sfortunatamente, non sono consapevoli che il modulo audio USB predefinito RPi è errato! Quindi i cambiamenti non hanno mai effetto. Il modulo del kernel sonoro di cui ci occupiamo viene chiamato snd_usb_audioe non snd-usb-audio. Il nome del file è snd-usb-audio.koe si trova in: /lib/modules/4.9.59-v7+/kernel/sound/usb/.

Abbastanza divertente, il testo nel file dice che non ha bisogno di essere modificato!

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

Riferimenti:


Usando un raspi 3B + con Raspian, aplaynon ho fatto costantemente nulla dopo tutto questo lavoro, fino a quando non l'ho usato -D plughw:0,0invece -D hw:0,0(basato su shttps: //raspberrypi.stackexchange.com/a/89162). Sfortunatamente, mentre quasi tutto può ora riprodurre l'audio tramite USB, l'utilità di cui ho bisogno per funzionare di più ( vban_receptor) non funziona ancora, ma a questo punto quasi sicuramente non è più colpa
dell'installazione

1
Sì, questo è un incubo insanguinato. Consulta l'elenco dei diversi plug-in PCM qui . Quindi leggi la prima sezione chiamata "Dispositivi e plugin ALSA" qui . Forse questo aiuterebbe a far luce sul perché devi usare plughwinvece di hw. BTW. Dal momento che hwè direttamente all'hardware, mentre plughwfa un po 'di elaborazione, potresti voler controllare ciò che stai effettivamente cercando di giocare.
not2qubit

L'ho testato con uno dei file audio di prova standard /usr/share/sounds/alsa(in particolare Front_Center.wav)
Mike 'Pomax' Kamermans,

1
Stella assoluta. Non mi aspettavo che ottenere il suono da un Raspberry Pi sarebbe stato un progetto di più giorni senza una guida chiara su cosa fare. Tutti i +1 per te.
Kieran,

3
È criminale che ci siano così pochi voti.
BradChesney79,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.