¿Cómo puedo usar una tarjeta de sonido USB externa y configurarla como predeterminada?

16

Tengo una tarjeta de sonido USB externa de C-Media ejecutándose en mi RPi3. Puedo reproducir algunas grabaciones usando aplay / arecord especificando el índice de la tarjeta y el complemento ALSA. Sin embargo, muchos otros archivos de sonido no se reproducen en absoluto, o no como se esperaba. Algún otro software de reproductor tampoco funciona.

P: ¿Cómo puedo configurar ALSA para usarlo de manera predeterminada?

not2qubit
fuente

Respuestas:

32

Antecedentes

Es sorprendente ver cuánto esfuerzo se ha puesto en tratar de resolver varios problemas relacionados con el sonido para la Raspberry Pi. Aparentemente, debe ser el punto más débil para que los nuevos usuarios se desarrollen y utilicen ALSA con Raspbian. Después de haber dedicado un tiempo y un esfuerzo considerables para que mi propio sonido RPi3 funcione en diferentes versiones del sistema operativo y también en otras distribuciones de Linux, he decidido escribir la página de solución definitiva para ir. Al menos para el tema del uso de una tarjeta de sonido externa en el último Raspbian Stretch .

El sistema de sonido ALSA

ALSA está diseñado para admitir cualquier tipo de dispositivo basado en * nix, independientemente de su configuración de hardware y de la antigüedad del hardware. No es necesario, no tiene mucho sentido tratar de entrar en los detalles de 20 años de su desarrollo. Simplemente aplicamos la esencia a una situación actual.

Sin embargo, en ningún momento de la historia la humanidad ha producido tantos diagramas inútiles y disfuncionales, como para tratar de explicar ALSA. Los únicos remotamente informativos son estos dos:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Obteniendo la información del sistema

El primer paso es averiguar qué sonido, si lo hay, funciona y qué hardware ya tiene. Hay todo tipo de formas de averiguar detalles, pero para la persona promedio, la mayoría de esos detalles no tienen sentido. Te mostramos lo más importante.

¿Qué queremos saber sobre nuestro sistema (de sonido)?

Queremos saber:

  • el nombre y las versiones del hardware de sonido incorporado
  • el nombre y las versiones del hardware de sonido externo
  • qué controladores de kernel (módulos) usa
  • qué otros controladores / módulos del núcleo relacionados con el sonido se cargan
  • qué tarjetas de sonido están disponibles
  • en qué orden las tarjetas de sonido son utilizadas y seleccionadas por el sistema operativo y los programas
  • si hay algún hardware en conflicto o programas de sistema de sonido

¿Desde dónde quieres reproducir y grabar sonido en tu sistema?

Sus opciones para reproducir sonidos pueden ser:

  1. Desde el conector de auriculares de audio interno de 3.5 mm (audio analógico)
  2. Desde la pantalla / monitor conectado a HDMI
  3. Desde una tarjeta de sonido USB externa
  4. Desde un puerto GPIO

Sus opciones para grabar sonidos pueden ser:

  • a. Desde una tarjeta de sonido USB externa (con al menos un tipo de entrada)
  • si. Desde un archivo o secuencia
  • C. De un GPIO

En esta publicación, le diremos cómo reproducir y grabar usando la tarjeta de sonido USB externa .

¿Un plan de éxito a prueba de futuro?

Con las actualizaciones de RPi hay un flujo constante de nuevos cambios y mejoras, a menudo rompiendo soluciones antiguas. La idea aquí es hacer la menor cantidad posible de cambios en el sistema o hacerlos obvios si es necesario. Eso significa que preferimos usar una configuración por usuario que una configuración de todo el sistema. Es decir, intente utilizar los archivos de configuración en su directorio de inicio, en lugar de en los archivos del sistema propiedad de la raíz.


TL; DR (¡Empecemos ya!)

Reinicie y conecte su tarjeta de sonido USB externa, así que comenzamos en la misma página ...

A. Recolecta información

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

Aquí vemos que el sistema predeterminado ( card 0) está utilizando el módulo bcm2835 ALSA. Aunque generalmente podemos especificar qué tarjeta usar, algunos software como omxplayer no tienen esta opción y no producirán ningún sonido de varias maneras.

En este punto, ya podría intentar configurar sus archivos de configuración de ALSA. Algunos tienen éxito, mientras que otros no lo son porque no es obvio cómo y dónde se debe hacer esto. Lo que finalmente queremos es decirle a nuestro sistema que use nuestra tarjeta de sonido USB externa.

B. Eliminar la hinchazón de audio

A menos que tenga muy buenas razones para mantener PulseAudio (PA) o software de servidor JACK adicional , debe desinstalarlos , si están allí. Tienden a interferir con ALSA, ya que toman el control de muchas funciones de ALSA, y todas las configuraciones adicionales necesarias para ellos, hacen que las cosas sean increíblemente confusas.

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. Deshabilite la tarjeta de sonido interna (Broadcom)

La tarjeta de sonido interna es impulsada por el módulo del núcleo en: /lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko A menos que esté planeando usar el conector de audio (en 1) o HDMI (en 2), debe desactivar este módulo del núcleo. Hay dos métodos para hacer esto.

  1. Deshabilítelo con un indicador de configuración de arranque
  2. Evita que el modprobe.ddemonio lo cargue en el núcleo

Tratando de mantener nuestro enfoque minimalista, elegimos (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

Si por alguna razón, prefiere usar el método (2), entonces debe incluir en la lista negra el módulo del núcleo. Para hacer esto, simplemente ingrese la palabra blacklist, seguida del nombre del módulo en cualquier *.confarchivo debajo /etc/modprobe.d/. Sin embargo, ya hay un archivo vacío y reservado allí, llamado raspi-blacklist.confpara este propósito. Sin embargo, después de 6 meses, se habrá olvidado de esto y de lo que contiene, por lo que es mejor nombrarlo después del módulo que está en la lista negra.

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

¿Cual es la diferencia? Ninguno, AFAICT.

Después de reiniciar, vuelva a verificar sus módulos de sonido.

$ 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! Su molesto bcm2835 ( card 0) se ha ido, ¡pero el índice de la tarjeta USB es el mismo! Esto es realmente bueno

Configura tu ALSA

Como ya mencioné, queremos que ALSA use nuestra propia tarjeta de sonido USB como predeterminada. Esto también significa que queremos que tenga el primer índice disponible en la lista de módulos de sonido del núcleo. Como el módulo se eliminó anteriormente y el índice es el mismo (tarjeta 1), estamos bien. Pero en caso de que necesitemos cargar bcm2835 nuevamente, no lo estamos, ya que ese módulo volvería a aparecer como el primero ( card 0).

Simplemente necesitamos decirle a ALSA cuáles deberían ser nuestros índices de tarjeta PCM predeterminados y en qué orden deberían priorizarse en el núcleo.

Hay 3 lugares donde puede configurar su ALSA.

  • la configuración del usuario en:~/.asoundrc
  • la configuración del sistema en:/usr/share/alsa/alsa.conf
  • el módulo del sistema conf en:/lib/modprobe.d/aliases.conf

Los primeros 2 cambian los dispositivos predeterminados, mientras que el último garantiza el orden de aparición.

Primero arreglamos nuestra configuración específica de usuario para usar card 1. Si se muestran más de una tarjeta, seleccione el índice de la que desea que sea predeterminada.

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

pcm.!default {
        type hw
        card 1
}

ctl.!default {
        type hw
        card 1
}
EOF

A continuación, arreglamos la configuración del sistema, usando los mismos números de índice de tarjeta que los anteriores. Necesitamos hacer esto, porque algunos paquetes del sistema nunca verían su archivo de configuración de usuario.

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

Ahora reinicie para que los cambios surtan efecto.

Ahora debería tener un sistema de audio en funcionamiento.


¡Probémoslo!

Para realizar una prueba adecuada, necesita los archivos adecuados para realizar la prueba. Entonces, antes que nada, asegúrese de que todos sus archivos de sonido y video realmente estén funcionando.

(¡Pasé un tiempo considerable tratando de obtener un video de prueba h264 / mp4 para reproducir audio, solo para descubrir más tarde, que nunca tenía ningún audio codificado! ¡Duh!)

ADVERTENCIA Si está intentando probar videos que usan los códecs MPEG-2o VC-1, debe comprar (!) Una clave de códec de la organización RPi para poder decodificarla completamente con los decodificadores de hardware integrados. De lo contrario, primero debe convertir los archivos.

Puede verificar si su códec está habilitado con:

# Check with:
vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1

Necesitará algunos archivos verificados para probar. Puede descargarlos y usarlos si no tiene ninguno.

# 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

A continuación, ¡juguemos!

# 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

¡TÚ ERES BUENO PARA IRTE!


[opcional] Orden de hardware de audio adicional

NOTA Si usa esta sección, ¡necesita cambiar todos los valores de índice de tarjeta en las secciones anteriores!

Si ha conectado hardware de audio adicional y no se muestra como desea, puede forzar a reorganizar el orden en que aparecen los módulos en el /lib/modprobe.d/aliases.confarchivo.

Algunas soluciones han propuesto realizar cambios en este archivo. ¡Desafortunadamente, no saben que el módulo de sonido USB predeterminado de RPi está mal escrito! Entonces los cambios nunca surten efecto. El módulo de kernel de sonido que nos interesa, se llama snd_usb_audioy no snd-usb-audio. El nombre del archivo es snd-usb-audio.koy ubicado en: /lib/modules/4.9.59-v7+/kernel/sound/usb/.

Curiosamente, el texto en el archivo dice que no necesita ser modificado.

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

Referencias

not2qubit
fuente
Al usar un raspi 3B + con Raspian, aplayno hice nada consistentemente después de todo este trabajo, hasta que lo usé en -D plughw:0,0lugar de -D hw:0,0(basado en shttps: //raspberrypi.stackexchange.com/a/89162). Desafortunadamente, aunque casi todo ahora puede reproducir audio a través de USB, la utilidad que más necesito para trabajar ( vban_receptor) todavía no funciona, pero en este punto casi seguramente ya no es culpa de la configuración
Mike 'Pomax' Kamermans el
1
Sí, esta es una pesadilla sangrienta. Eche un vistazo a la lista de diferentes complementos PCM aquí . Luego lea la primera sección llamada "Dispositivos y complementos ALSA" aquí . Quizás eso ayudaría a arrojar algo de luz sobre por qué necesita usar en plughwlugar de hw. Por cierto. Dado que hwes directo al hardware, mientras que plughwrealiza algunos procesamientos, es posible que desee verificar lo que realmente está tratando de reproducir.
not2qubit
Lo probé con uno de los archivos de audio de prueba estándar de pantano en /usr/share/sounds/alsa(específicamente Front_Center.wav)
Mike 'Pomax' Kamermans
1
Eres una estrella absoluta. No esperaba que obtener sonido de una frambuesa pi fuera un proyecto de varios días sin una guía clara sobre qué hacer. Todos los +1 para ti.
Kieran
3
Es criminal que haya tan pocos votos a favor.
BradChesney79