Como atribuir nomes a placas de som em linux (parte 2)

No post anterior tratámos da atribuição de nomes a devices série ttyUSB para identificar a ligação a rádios ou portas série.
Neste post vamos atribuir nomes a devices de audio, muito útil quando queremos configurar devices de som e nos aparecem listas de 30 e mais periféricos de som a configurar no software, por exemplo, para modos digitais como JS8Call, FT8, SSTV, ou direwolf em AX.25 e tudo nos parece uma confusão…

Confusão maior porque de cada vez que reiniciamos o computador ou o raspberry pi estes devices de som arrancam por ordem aleatória!

O método descrito tem uma condição - os devices de som USB têm de estar ligados sempre na mesma porta USB, seja directamente ou através de um HUB USB, isto se utilizarmos devices com o mesmo idVendor, idProduct e número de série.

Pode parecer estranho o porquê deste artigo! Mas neste projecto eu tenho a saída de audio do raspberry para os auscultadores, a saída do monitor, os 2 rádios Icom, um FT-817, e 5 placas de som alsa para AX.25 através do modem por software direwolf ligadas cada uma a seu rádio! De cada vez que reinicio o raspberry é uma trapalhada acertar todos os devices pela ordem com que foram configurados inicialmente! Já faz sentido?

Em linux existem diferentes camadas para a utilização de som: alsa e pulse audio. Há software que utiliza alsa outros que utilizam pulse audio…
Este é um artigo prático, consulte as referências bibliográfica para compreender a teoria por detrás dos devices de som em linux.

Atribuir nomes aos devices Alsa e Pulse Audio

Aqui o objectivo é, conhecer a identificação de cada um dos devices de som dos nossos Icom ou outro equipamento, adicioná-los ao ficheiro anterior /etc/udev/rules.d/99-hamlib.rules com um nome ou symlink que o designará mais facilmente…

Ligue à vez, a ficha USB do IC-7300, siga o procedimento abaixo descrito, desligue esta ficha e ligue agora a USB do IC-9700…

Para saber o id do device de som abra uma janela terminal e escreva,

ou, sem querer causar mais ruído, pode também conhecer o id de cada periférico fazendo, "udevadm monitor --subsystem=sound", desligando e voltando a ligar cada uma das fichas USB…

Bom, o primeiro comando devolverá uma série de linhas, das quais apenas nos interessa identificar algo semelhante a,

(para o IC-7300)
name: <alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00.analog-stereo>
sysfs.path = "/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2.3/1-1.2.3.4/1-1.2.3.4:1.0/sound/card2"

(para o IC-9700)
name: <alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00.analog-stereo.2>
sysfs.path = "/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2.2/1-1.2.2.4/1-1.2.2.4:1.0/sound/card3"

Agora, no output gerado para o IC-7300, pegamos apenas na expressão,
"/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2.3/1-1.2.3.4/1-1.2.3.4:1.0/sound/card"

e construímos o código a escrever no ficheiro 99-hamlib.rules
Note que, este é o resultado do meu exemplo… deverá substituir esta expressão de acordo com o resultado que obteve! Estes valores identificam a porta USB a que o device se encontra ligado e o próprio device.

Na janela terminal escreva como sudo ou root,

e, a seguir às regras da primeira parte do artigo, relativas aos devices ttyUSB adapte e copie o seguinte código,

# ALSA devices
# IC-7300 Sound Card
SUBSYSTEM!="sound", GOTO="ic7300_alsa_naming_end"
ACTION!="add", GOTO="ic7300_alsa_naming_end"
DEVPATH=="/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2.3/1-1.2.3.4/1-1.2.3.4:1.0/sound/card?", ATTR{id}="IC-7300"
LABEL="ic7300_alsa_naming_end"

# IC-9700 Sound Card
SUBSYSTEM!="sound", GOTO="ic9700_alsa_naming_end"
ACTION!="add", GOTO="ic9700_alsa_naming_end"
DEVPATH=="/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2.2/1-1.2.2.4/1-1.2.2.4:1.0/sound/card?", ATTR{id}="IC-9700"
LABEL="ic9700_alsa_naming_end"

# PulseAudio devices
# IC-7300  pulseaudio device
SUBSYSTEM!="sound", GOTO="ic7300_pa_naming_end"
ACTION!="change", GOTO="ic7300_pa_naming_end"
KERNEL!="card*", GOTO="ic7300_pa_naming_end"
DEVPATH=="/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2.3/1-1.2.3.4/1-1.2.3.4:1.0/sound/card?", ENV{SOUND_DESCRIPTION}="IC-7300"
LABEL="ic7300_pa_naming_end"

# IC-9700 pulseaudio device
SUBSYSTEM!="sound", GOTO="ic9700_pa_naming_end"
ACTION!="change", GOTO="ic9700_pa_naming_end"
KERNEL!="card*", GOTO="ic9700_pa_naming_end"
DEVPATH=="/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2.2/1-1.2.2.4/1-1.2.2.4:1.0/sound/card?", ENV{SOUND_DESCRIPTION}="IC-9700"
LABEL="ic9700_pa_naming_end"

Não se esqueça de ligar as fichas dos rádios sempre nos mesmos portos de ligação USB! Caso contrário este procedimento não servirá para nada!

Placas de som Alsa ligadas ao direwolf

Se for também o seu caso, proceda como anteriormente descrito, e ao meu ficheiro 99-hamlib.rules acrescentei ainda,

# CM108 ALSA devices for direwolf
# DEVPATH can be obtained by looking at `udevadm monitor --subsystem=sound` while pluging in the sound card.
# Do one card at a time, the "?" char on card should stay as it matches any card number that may pop on that USB port.
SUBSYSTEM!="sound", GOTO="alsa_naming_end"
ACTION!="add", GOTO="alsa_naming_end"
DEVPATH=="/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2.4/1-1.2.4.1/1-1.2.4.1:1.0/sound/card?", ATTR{id}="UHFpacket"
DEVPATH=="/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2.4/1-1.2.4.2/1-1.2.4.2:1.0/sound/card?", ATTR{id}="VHFpacket"
DEVPATH=="/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2.4/1-1.2.4.3/1-1.2.4.3:1.0/sound/card?", ATTR{id}="VHFpacketSat"
DEVPATH=="/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1.1/1-1.2.1.1:1.0/sound/card?", ATTR{id}="HFpacket"
LABEL="alsa_naming_end"

Desligue e volte a ligar estas placas de som e escreva no terminal, substituindo nomes ou wildcards... exemplo,

Artigo relacionado - Solução de problemas com a placa de som CM108

Outros comando utilizados para melhor compreender este projecto

Continua...

Referências:
https://x8x.net/2019/04/04/icom-ic-9700-and-ic-7300-coexisting-in-linux/
https://gist.github.com/Aishou/f39c2f970c6db20e1845925c5cc0890e
https://www.florian-wolters.de/posts/static-sound-device-names-ic9700-ic7300/
https://blog.habets.se/2021/12/Linux-Sound-devices-are-a-mess.html

Escuta de modos digitais com RTL-SDR + Gqrx + WSJT-X

No post Monitor de WSPR com raspberry pi + dongle RTL-SDR descrevi como receber sinais de WSPR em diversas frequências com um raspberry pi, em linux bash scripts.
Agora aqui, uma solução ainda mais eficaz com interface gráfico...

Descobri que é possível criar um stream de audio virtual através do Pulseaudio, e com este "fio" virtual de audio ligar o Gqrx, que funciona como receptor da RTL-SDR, ao WSJT-X onde nos é permitido ainda a escuta de outros modos digitais para além do WSPR…

Primeiro instalamos o Gqrx.
Siga as instruções seguintes, copiando e colando linha a linha numa janela terminal em linux,

A seguir escreva gqrx para iniciar a aplicação que, entretanto deve ter sido adicionado num dos menus do seu interface gráfico.

Agora corra o comando a seguir descrito, numa única linha, para adicionar o stream de audio,

Ligue o seu dispositivo SDR, eu utilizo a RTL-SDR, pois custa menos de 30€ e configure este device no Gqrx,

Para que funcione correctamente o output de audio deve ser configurado como Virtual_Sink, o nome que demos no nosso comando.

Configure agora o Gqrx para que possa receber instruções do WSJT-X da frequência a utilizar…
No menu "Tools - Remote control settings" verifique se existe, ou acrescente a porta 7356 para o endereço IPv4 127.0.0.1
Grave as alterações.

Instale agora o WSJT-X

Faça o download da página https://physics.princeton.edu/pulsar/K1JT/wsjtx.html para o seu sistema operativo. No meu caso o debian buster, actualmente na versão 2.5.4, wsjtx_2.5.4_armhf.deb

O WSJT-X foi adicionado ao menu. Corra-o e vamos às configurações…
No menu "File - Settings" seleccione o separador "Radio". Em "Rig:" escolha a opção "Hamlib NET rigctl"; em "Network Server" o endereço e a porta definidas no Gqrx, 127.0.0.1:7356.

Agora, no separador "Audio" escolha como input o stream virtual que anteriormente criámos "Virtual_Sink.monitor". No output é indiferente o que escolha, pois não vai fazer emissão.
Grave as suas configurações. É possível que o WSJT-X lhe dê alguma mensagem de erro, pois o Gqrx ainda não tem o serviço a correr.

No menu "Tools" do Gqrx inicie o serviço "Remote control"
Faça "play" e imediatamente deve ver na waterfall a recepção de sinais. Ajuste o volume Gain de modo a ter cerca de 50dB de input no WSJT-X.
No WSJT-X, escolha uma banda, por exemplo nos 30m ou 40m, o modo WSPR, inicie a recepção e deverá observar na waterfall de audio riscos verticais amarelo ou vermelho consoante a intensidade dos sinais. Aguarde pelo menos 2 minutos, para a recepção de WSPR, e o botão "Decode" acende-se em azul cian durante uns segundos até lhe aparecerem algumas estações na caixa de texto no topo.

Para aplicar permanentemente as definições no Pulseaudio, abra o ficheiro /etc/pulse/default.pa, avance até à última linha e acrescente as instruções a seguir numa única linha,

Se quiser contribuir para a rede mundial de WSPR, para estudo dos fenómenos de propagação e compreensão da MUF seleccione a opção "Upload spots" no WSJT-X.
A seguir pode configurar as bandas que gostaria de utilizar no botão "Schedule"

Referências:
https://www.onetransistor.eu/2017/10/virtual-audio-cable-in-linux-ubuntu.html
https://gqrx.dk/download/gqrx-sdr-for-the-raspberry-pi
https://dl1gkk.com/setup-raspberry-pi-for-ham-radio/