DEV Community

Cover image for Controle de Áudio Personalizado no Linux: Alternando entre Fone, Caixas e Áudio Duplo com um Único Comando
Igor Giamoniano
Igor Giamoniano

Posted on

Controle de Áudio Personalizado no Linux: Alternando entre Fone, Caixas e Áudio Duplo com um Único Comando

TL;DR: Criei um script chamado audioctl que, com um único comando,
me permite alternar entre fone (via HDMI), caixas de som (analógicas) ou
até reproduzir em ambos ao mesmo tempo. Tudo isso com pactl, um
pouco de Bash e o poder do Linux.


O que é o pactl?

O pactl (abreviação de PulseAudio Control) é uma ferramenta de linha
de comando usada para controlar servidores de áudio como PulseAudio
e, com compatibilidade total, o PipeWire --- o sucessor moderno do
PulseAudio, usado por padrão em distros como Fedora, Ubuntu 22.04+, Arch
e NixOS.

Com ele, você pode:

  • Listar dispositivos de áudio (sinks e sources)
  • Mudar o volume
  • Alternar entre saídas
  • Mover streams de áudio entre dispositivos
  • Carregar ou descarregar módulos (como o module-combine-sink)

Ele é o "canivete suíço" do áudio no terminal --- e a base de tudo o que
vamos construir neste tutorial.


O problema

Eu uso um setup simples, mas comum:

  • Meu fone de ouvido está conectado ao monitor (que por sua vez está ligado ao PC via HDMI).
  • Minhas caixas de som estão ligadas diretamente na saída de áudio analógica do computador.

Meu sogro precisava conseguir alterar entre caixa de som e fone de
ouvido, coisa que ele já conseguia na interface, porém ele também
precisava conseguir colocar nas duas ao mesmo tempo (por questões de
acessibilidade).

Então pensei:

"Se o Linux me dá total controle do sistema, por que não criar meu
próprio controlador de áudio?"

E foi exatamente isso que fiz. Neste post, vou te mostrar passo a
passo
como construí essa ferramenta --- e como você pode adaptá-la
para o seu setup.

imagem


Pré-requisitos

  • Um sistema Linux moderno (Ubuntu, Fedora, Arch, NixOS, etc.).
  • PulseAudio ou PipeWire.
  • Terminal e um editor de texto.
  • Pelo menos duas saídas de áudio funcionais.

💡 Se você não sabe se tem PipeWire ou PulseAudio, rode:

pactl info | grep "Server Name"

Se aparecer "PipeWire" ou "PulseAudio", está tudo certo!


Passo 1: Entenda sua configuração de áudio

Antes de automatizar, precisamos saber quais dispositivos existem.

Liste seus sinks (saídas de áudio):

pactl list sinks short
Enter fullscreen mode Exit fullscreen mode

Saída de exemplo:

52  alsa_output.pci-0000_01_00.1.hdmi-stereo     ...  RUNNING
57  alsa_output.pci-0000_09_00.6.analog-stereo   ...  SUSPENDED
Enter fullscreen mode Exit fullscreen mode
  • RUNNING = está em uso\
  • SUSPENDED = inativo, mas disponível

Agora veja os cards:

pactl list cards
Enter fullscreen mode Exit fullscreen mode

Procure pelo seu dispositivo analógico e confirme o perfil ativo
(como output:analog-stereo).


Passo 2: Controle básico de volume

O pactl permite controlar o volume do sink padrão usando:

@DEFAULT_SINK@

# Aumentar 5%
pactl set-sink-volume @DEFAULT_SINK@ +5%

# Diminuir 5%
pactl set-sink-volume @DEFAULT_SINK@ -5%
Enter fullscreen mode Exit fullscreen mode

Passo 3: Alternar entre saídas de áudio

Para mudar o sink padrão:

pactl set-default-sink NOME_DO_SINK
Enter fullscreen mode Exit fullscreen mode

Mover streams ativos:

pactl list short sink-inputs
pactl move-sink-input ID_DO_STREAM NOVO_SINK
Enter fullscreen mode Exit fullscreen mode

Passo 4: Áudio em dois dispositivos ao mesmo tempo (modo "dual")

pactl load-module module-combine-sink     sink_name=combined_output     slaves=alsa_output.hdmi,alsa_output.analog     sink_properties=device.description="Dual_HDMI+Analog"
Enter fullscreen mode Exit fullscreen mode

Passo 5: O script final --- audioctl

Código completo

https://gist.github.com/igorgbr/8031267dee77acf6d7d298ec72a37f94


Como instalar

chmod +x ~/projetos/audioctl
mkdir -p ~/bin
ln -sf ~/projetos/audioctl ~/bin/audioctl
Enter fullscreen mode Exit fullscreen mode

Dicas extras

speaker-test -t wav -c 2
Enter fullscreen mode Exit fullscreen mode

Conclusão

Com menos de 60 linhas de Bash, resolvi um problema real --- com
flexibilidade que nenhum app gráfico oferece.

O controle está nas suas mãos --- e no terminal.


Código completo

https://gist.github.com/igorgbr/8031267dee77acf6d7d298ec72a37f94

Top comments (0)