Advertisement

Responsive Advertisement

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

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

  1. Salve o script em um local como ~/projetos/audioctl.
  2. Torne-o executável:
    chmod +x ~/projetos/audioctl
  3. Crie um link simbólico em ~/bin (ou outro diretório no PATH):
    mkdir -p ~/bin
    ln -sf ~/projetos/audioctl ~/bin/audioctl
  4. Garanta que ~/bin está no PATH (adicione ao ~/.bashrc ou ~/.zshrc):
    export PATH="$HOME/bin:$PATH"
  5. 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 + F11audioctl toggle
  • Super + F12audioctl 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! 👇

🎧🔊🐧

Postar um comentário

0 Comentários