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, porem 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.
Pré-requisitos
- Um sistema Linux moderno (Ubuntu, Fedora, Arch, NixOS, etc.).
- PulseAudio ou PipeWire (quase todas as distros usam um dos dois hoje).
- Terminal e um editor de texto.
- Pelo menos duas saídas de áudio funcionais (HDMI + analógico, no meu caso).
💡 Se você não sabe se tem PipeWire ou PulseAudio, rode:
bash
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
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
RUNNING= está em uso.SUSPENDED= inativo, mas disponível.
Agora veja os cards (placas de som):
pactl list cards
Procure pelo seu dispositivo analógico e confirme se o
perfil está ativo (ex: output:analog-stereo).
🔍 No meu caso, descobri que:
- O fone sai pelo HDMI (alsa_output.pci-0000_01_00.1.hdmi-stereo).
- As caixas saem pelo analógico (alsa_output.pci-0000_09_00.6.analog-stereo).Importante: eu não preciso alternar portas dentro de um mesmo sink — preciso alternar entre sinks diferentes.
Passo 2: Controle básico de volume
Esta parte não era realmente necessária, eu a construí somente para testar a possibilidade e acabei deixando no código.
O pactl permite controlar o volume do sink padrão com uma
variável mágica: @DEFAULT_SINK@.
# Aumentar 5%
pactl set-sink-volume @DEFAULT_SINK@ +5%
# Diminuir 5%
pactl set-sink-volume @DEFAULT_SINK@ -5%
Isso já é metade do que precisamos!
Passo 3: Alternar entre saídas de áudio
Para mudar a saída padrão:
pactl set-default-sink NOME_DO_SINK
Mas há um problema:
aplicativos que já estão reproduzindo áudio não mudam sozinhos.
Precisamos mover manualmente os streams ativos:
# Lista todos os streams de áudio
pactl list short sink-inputs
# Move um stream específico
pactl move-sink-input ID_DO_STREAM NOVO_SINK
Juntando tudo:
move_all_streams() {
local target_sink="$1"
pactl list short sink-inputs | awk '{print $1}' | xargs -r -I '{}' pactl move-sink-input '{}' "$target_sink"
}
Passo 4: Áudio em dois dispositivos ao mesmo tempo (modo “dual”)
Sim, é possível! O PulseAudio (e PipeWire via compatibilidade) oferece o
módulo module-combine-sink.
Ele cria um sink virtual que espelha o áudio para múltiplos dispositivos:
pactl load-module module-combine-sink \
sink_name=combined_output \
slaves=alsa_output.hdmi,alsa_output.analog \
sink_properties=device.description="Dual_HDMI+Analog"
⚠️ Pode haver leve deslocamento de áudio entre os dispositivos (especialmente HDMI vs. analógico), mas para músicas e vídeos, é imperceptível na maioria dos casos.
Passo 5: O script final — audioctl
Juntei tudo em um único script, chamado audioctl:
#!/bin/bash
SINK_HDMI="alsa_output.pci-0000_01_00.1.hdmi-stereo"
SINK_ANALOG="alsa_output.pci-0000_09_00.6.analog-stereo"
SINK_COMBINED="combined_output"
move_all_streams() {
local target_sink="$1"
pactl list short sink-inputs | awk '{print $1}' | xargs -r -I '{}' pactl move-sink-input '{}' "$target_sink" 2>/dev/null
}
create_combined_sink() {
MODULE_ID=$(pactl list short modules | grep 'combined_output' | awk '{print $1}')
if [ -n "$MODULE_ID" ]; then
pactl unload-module "$MODULE_ID" >/dev/null 2>&1
fi
pactl load-module module-combine-sink \
sink_name="$SINK_COMBINED" \
slaves="$SINK_HDMI,$SINK_ANALOG" \
sink_properties=device.description="Dual_HDMI+Analog" >/dev/null 2>&1
}
if [ "$1" = "toggle" ]; then
CURRENT=$(pactl get-default-sink)
if [ "$CURRENT" = "$SINK_HDMI" ]; then
pactl set-default-sink "$SINK_ANALOG"
move_all_streams "$SINK_ANALOG"
echo "🔊 Saída: Caixas de som (analógico)"
else
pactl set-default-sink "$SINK_HDMI"
move_all_streams "$SINK_HDMI"
echo "🎧 Saída: Fone via HDMI (monitor)"
fi
elif [ "$1" = "dual" ]; then
create_combined_sink
pactl set-default-sink "$SINK_COMBINED"
move_all_streams "$SINK_COMBINED"
echo "🔁 Saída: Fone (HDMI) + Caixas (Analógico) ao mesmo tempo"
elif [ "$1" = "up" ]; then
pactl set-sink-volume @DEFAULT_SINK@ +5%
elif [ "$1" = "down" ]; then
pactl set-sink-volume @DEFAULT_SINK@ -5%
else
echo "Uso:"
echo " audioctl toggle → alterna entre HDMI e analógico"
echo " audioctl dual → áudio em ambos ao mesmo tempo"
echo " audioctl up → aumenta volume"
echo " audioctl down → diminui volume"
exit 1
fi
Como instalar
-
Salve o script em um local como
~/projetos/audioctl. -
Torne-o executável:
chmod +x ~/projetos/audioctl -
Crie um link simbólico em
~/bin(ou outro diretório noPATH):mkdir -p ~/bin ln -sf ~/projetos/audioctl ~/bin/audioctl -
Garanta que
~/binestá noPATH(adicione ao~/.bashrcou~/.zshrc):export PATH="$HOME/bin:$PATH" -
Recarregue o shell:
source ~/.bashrc
Pronto! Agora você pode usar de qualquer diretório:
audioctl toggle # alterna
audioctl dual # ambos
audioctl up # + volume
Dicas extras
🧪 Teste com áudio contínuo
Se o som não muda, é porque nenhum stream está ativo. Use:
speaker-test -t wav -c 2
para gerar áudio de teste.
🎮 Atalhos de teclado
No GNOME/KDE/i3, associe:
Super + F11→audioctl toggleSuper + F12→audioctl dual
Apêndice: Debug e Referências Úteis
Se algo não estiver funcionando como esperado, esses comandos ajudam a diagnosticar o estado do áudio no seu sistema:
Comandos de debug rápido
# Listar todos os sinks (saídas de áudio)
pactl list sinks short
# Ver o sink padrão atual
pactl get-default-sink
# Listar streams de áudio ativos
pactl list short sink-inputs
# Ver detalhes completos dos cards de áudio (útil para perfis)
pactl list cards
Referências oficiais
-
Manual do
pactl:man pactl(no terminal) ou online via PulseAudio CLI docs - Documentação do PipeWire: https://pipewire.org/ — o futuro do áudio e vídeo no Linux, com compatibilidade total com comandos do PulseAudio.
-
Sobre o
module-combine-sink: Embora a documentação oficial seja escassa, o módulo é herdado do PulseAudio e amplamente usado para espelhamento de áudio. Mais detalhes na página de módulos do PulseAudio.
Esses recursos são valiosos se você quiser ir além — como adicionar suporte a Bluetooth, configurar perfis personalizados ou automatizar com systemd.
Conclusão
Com menos de 60 linhas de Bash, resolvi um problema real do meu dia a dia — e ganhei flexibilidade que nenhum app gráfico oferece.
O melhor do Linux não é só fazer funcionar, mas
fazer do seu jeito.
Seu setup é diferente? Ótimo! Adapte os nomes dos sinks, adicione Bluetooth,
USB, ou até três saídas. O princípio é o mesmo.
✨ O controle está nas suas mãos — e no terminal.
Quer o código?
O script completo está disponível neste
Gist
Fique à vontade para forkar, melhorar e compartilhar!
E você? Já criou alguma automação de áudio no Linux? Conta nos comentários! 👇
🎧🔊🐧

0 Comentários