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:
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:
- A partir do conector de áudio interno de 3,5 mm para áudio (áudio analógico)
- Na tela / monitor conectado HDMI
- De uma placa de som USB externa
- 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.
- Desative-o com um sinalizador de configuração de inicialização
- Impedir que ele seja carregado no kernel pelo
modprobe.d
daemon
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 *.conf
arquivo abaixo /etc/modprobe.d/
. No entanto, já existe um arquivo vazio e reservado, chamado raspi-blacklist.conf
para 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-2
ou 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.conf
arquivo.
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_audio
e não snd-usb-audio
. O nome do arquivo é snd-usb-audio.ko
e 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:
aplay
consistentemente não fiz nada depois de todo esse trabalho, até que eu usei em-D plughw:0,0
vez 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çãoplughw
vez dehw
. Entre. Comohw
é direto para o hardware, enquantoplughw
faz algum processamento, você pode verificar o que realmente está tentando reproduzir./usr/share/sounds/alsa
(especificamente,Front_Center.wav
)