Como posso usar uma placa de som USB externa e configurá-la como padrão?

16

Eu tenho uma placa de som USB externa da C-Media em execução no meu RPi3. Eu posso reproduzir algumas gravações usando aplay / arecord especificando o índice do cartão e o plug-in ALSA. No entanto, muitos outros arquivos de som não são reproduzidos ou não são o esperado. Algum outro software de reprodutor também não funciona.

P: Como posso configurar o ALSA para usá-lo por padrão?

not2qubit
fonte

Respostas:

32

fundo

É incrível ver quanto esforço foi feito para tentar resolver vários problemas relacionados ao som do Raspberry Pi. Aparentemente, deve ser o ponto mais fraco para os novos usuários desenvolverem com sucesso e usarem o ALSA no Raspbian. Depois de gastar um tempo e esforço consideráveis ​​tentando fazer meu próprio som RPi3 funcionar em diferentes versões do sistema operacional e em outras distribuições Linux, decidi escrever a página conclusiva da solução de ir-para. Pelo menos no tópico de usar uma placa de som externa no último Raspbian Stretch .

O sistema de som ALSA

O ALSA deve suportar qualquer tipo de dispositivo baseado em * nix, independentemente de sua configuração de hardware e independentemente da idade do hardware. Desnecessário, não faz muito sentido tentar entrar nos detalhes de 20 anos de seu desenvolvimento. Simplesmente aplicamos a essência a uma situação atual.

No entanto, em nenhum momento da história a humanidade produziu uma quantidade de diagramas inúteis e disfuncionais, como tentar explicar a ALSA. Os únicos informativos remotamente são esses dois:

insira a descrição da imagem aqui insira a descrição da imagem aqui

Obtendo as informações do sistema

O primeiro passo é descobrir qual som, se houver, funciona e qual hardware você já possui. Existem várias maneiras de descobrir detalhes, mas para uma pessoa comum, a maioria desses detalhes não faz sentido. Mostramos o mais importante.

O que queremos saber sobre o nosso sistema (de som)?

Nós queremos saber:

  • o nome e as versões integradas do hardware de som
  • o nome e as versões externas do hardware de som
  • quais drivers do kernel (módulos) ele usa
  • que outros drivers / módulos relacionados ao som são carregados
  • quais placas de som estão disponíveis
  • em que ordem as placas de som são usadas e selecionadas pelo SO e pelos programas
  • se houver algum hardware ou programa de sistema de som em conflito

De onde você deseja reproduzir e gravar som no seu sistema?

Suas opções para reproduzir sons podem ser:

  1. A partir do conector de áudio interno de 3,5 mm para áudio (áudio analógico)
  2. Na tela / monitor conectado HDMI
  3. De uma placa de som USB externa
  4. De uma porta GPIO

Suas opções para gravar sons podem ser:

  • uma. De uma placa de som USB externa (com pelo menos um tipo de entrada)
  • b. De um arquivo ou fluxo
  • c. De um GPIO

Em este post, vamos dizer-lhe como tocar e gravar usando a placa de som USB externo .

Um plano de sucesso à prova de futuro?

Com as atualizações da RPi, há um fluxo constante de novas mudanças e melhorias, muitas vezes quebrando soluções antigas. A idéia aqui é fazer o mínimo possível de alterações no sistema ou torná-las óbvias, se necessário. Isso significa que preferimos usar uma configuração por usuário do que em todo o sistema. Ou seja, tente usar os arquivos de configuração no diretório inicial, em vez de nos arquivos de sistema pertencentes à raiz.


TL; DR (Vamos começar já!)

Reinicie e conecte sua placa de som USB externa, por isso começamos na mesma página ...

A. Colete algumas informações

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

Aqui vemos que o padrão do sistema ( card 0) está usando o módulo bcm2835 ALSA. Embora geralmente possamos especificar qual placa usar, alguns softwares como o omxplayer não possuem essa opção e não produzirão nenhum som de várias maneiras.

Nesse ponto, você já pode tentar configurar seus arquivos de configuração do ALSA. Alguns são bem-sucedidos, enquanto outros não, porque não é óbvio como e onde isso deve ser feito. Em última análise, o que queremos é dizer ao nosso sistema para usar nossa placa de som USB externa.

B. Remova o inchaço do áudio

A menos que você tenha boas razões para manter o PulseAudio (PA) ou o software de servidor JACK adicional , desinstale-os , se houver. Eles tendem a interferir com o ALSA, pois assumem o controle de muitas funções do ALSA e todas as configurações adicionais necessárias por eles tornam as coisas incrivelmente 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. Desative a placa de som interna (Broadcom)

A placa de som interna é acionada pelo módulo do kernel em: /lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko A menos que você esteja planejando usar a tomada de áudio (em 1) ou HDMI (em 2), desative esse módulo do kernel. Existem dois métodos para fazer isso.

  1. Desative-o com um sinalizador de configuração de inicialização
  2. Impedir que ele seja carregado no kernel pelo modprobe.ddaemon

Tentando permanecer com nossa abordagem minimalista, escolhemos (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, por algum motivo, você preferir usar o método (2), precisará colocar na lista negra o módulo do kernel. Para fazer isso, basta digitar a palavra blacklist, seguida pelo nome do módulo em qualquer *.confarquivo abaixo /etc/modprobe.d/. No entanto, já existe um arquivo vazio e reservado, chamado raspi-blacklist.confpara esse fim. No entanto, após 6 meses, você terá esquecido isso e o que ele contém; portanto, é melhor nomear o nome do módulo que está na 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

Qual é a diferença? Nenhum, AFAICT.

Após a reinicialização, verifique novamente os módulos de som.

$ 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! Seu irritante bcm2835 ( card 0) se foi, mas o índice do cartão USB é o mesmo! Isso é realmente bom.

Configure seu ALSA

Como já mencionei, queremos que a ALSA use nossa própria placa de som USB como padrão. Isso também significa que queremos que ele tenha o primeiro índice disponível na lista dos módulos de som do kernel. Como o módulo foi removido acima e o índice é o mesmo (cartão 1), estamos bem. Mas no caso de precisarmos carregar o bcm2835 novamente, não estamos, pois esse módulo reapareceria como o primeiro ( card 0).

Simplesmente precisamos dizer à ALSA qual deve ser o índice de placa PCM padrão e em que ordem eles devem ser priorizados no kernel.

Existem 3 lugares onde você pode configurar seu ALSA.

  • a configuração do usuário em:~/.asoundrc
  • a configuração do sistema em:/usr/share/alsa/alsa.conf
  • o módulo do sistema conf :/lib/modprobe.d/aliases.conf

Os dois primeiros alteram os dispositivos padrão, enquanto os últimos garantem a ordem de aparência.

Primeiro, corrigimos nossa configuração específica do usuário card 1. Se você tiver mais de um cartão exibido, selecione o índice de um que deseja ser o padrão.

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

pcm.!default {
        type hw
        card 1
}

ctl.!default {
        type hw
        card 1
}
EOF

Em seguida, corrigimos a configuração do sistema, usando os mesmos números de índice de cartão mostrados acima. Precisamos fazer isso, porque alguns pacotes do sistema nunca verão seu arquivo de configuração do usuário.

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

Agora reinicie para que as alterações entrem em vigor.

Agora você deve ter um sistema de áudio funcionando.


Vamos testar!

Para executar um teste adequado, você precisa de arquivos adequados para testar. Portanto, antes de qualquer coisa, verifique se todos os seus arquivos de som e vídeo estão realmente funcionando.

(Passei um tempo considerável tentando obter um vídeo de teste h264 / mp4 para reproduzir áudio, apenas para descobrir mais tarde, que ele nunca tinha nenhum áudio codificado! Duh!)

AVISO Se você estiver tentando testar vídeos que usem os codecs MPEG-2ou VC-1, precisará comprar (!) Uma chave de codec da organização RPi para poder decodificá-la completamente com os decodificadores de hardware internos. Caso contrário, você precisará converter os arquivos primeiro.

Você pode verificar se seu codec está ativado com:

# Check with:
vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1

Você precisará de alguns arquivos verificados para testar. Você pode fazer o download e usá-los se não tiver nenhum.

# 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

Em seguida, vamos jogar !!

# 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

VOCÊ ESTÁ PRONTO PARA IR!


[opcional] Pedido de hardware de áudio adicional

NOTA Se você usar esta seção, precisará alterar todos os valores do índice do cartão nas seções acima!

Se você conectou um hardware de áudio adicional e ele não aparece como você deseja, você pode forçar a reorganizar a ordem em que os módulos aparecem, no /lib/modprobe.d/aliases.confarquivo.

Algumas soluções propuseram fazer alterações neste arquivo. Infelizmente, eles não sabem que o módulo de som USB padrão do RPi está incorreto! Portanto, as mudanças nunca entram em vigor. O módulo do kernel de som com o qual estamos preocupados é chamado snd_usb_audioe não snd-usb-audio. O nome do arquivo é snd-usb-audio.koe localizado em: /lib/modules/4.9.59-v7+/kernel/sound/usb/.

Engraçado, o texto no arquivo diz que não precisa 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

Referências:

not2qubit
fonte
Usando um raspi 3B + com Raspian, aplayconsistentemente não fiz nada depois de todo esse trabalho, até que eu usei em -D plughw:0,0vez de -D hw:0,0(com base em shttps: //raspberrypi.stackexchange.com/a/89162). Infelizmente, embora quase tudo agora possa reproduzir áudio por USB, o utilitário que eu mais trabalho ( vban_receptor) ainda não funciona, mas neste momento quase certamente não é mais culpa da instalação
Mike 'Pomax' Kamermans
1
Sim, este é um pesadelo sangrento. Por favor, dê uma olhada na lista de diferentes plugins PCM aqui . Em seguida, leia a 1ª seção denominada "dispositivos e plugins ALSA" aqui . Talvez isso ajude a esclarecer por que você precisa usar em plughwvez de hw. Entre. Como hwé direto para o hardware, enquanto plughwfaz algum processamento, você pode verificar o que realmente está tentando reproduzir.
not2qubit
Eu testei-o com um dos arquivos de áudio de teste pântano-padrão em /usr/share/sounds/alsa(especificamente, Front_Center.wav)
Mike 'Pomax' Kamermans
1
Você estrela absoluta. Eu não esperava que obter um som de um raspberry pi fosse um projeto de vários dias sem orientação clara sobre o que fazer. Todos os + 1s para você.
Kieran
3
É criminoso que haja tão poucos votos positivos.
precisa saber é o seguinte