Como posso alternar entre diferentes hardwares de saída de áudio usando o shell?

29

Eu uso meu laptop com um monitor externo que tem alto-falantes. Quando o monitor é conectado via HDMI, posso alternar (usando a GUI: Sound Setting - > Hardware) entre a saída de áudio normal do laptop e a saída do monitor.

Repito esse procedimento muito tempo e comecei a me perguntar se posso automatizá-lo ou, de qualquer maneira, executá-lo de maneira mais rápida usando o shell.

Minha distro é Ubuntu 12.04 com o gnome 3.

EDITAR:

Eu tentei usar o pacmd, mas os coletores de lista fornecem apenas o dispositivo que estou usando no momento:

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.hdmi-stereo>

Depois de mudar de interface:

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>

E se eu tentar mudar, fico:

pacmd set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
Welcome to PulseAudio! Use "help" for usage information.
Sink alsa_output.pci-0000_00_1b.0.hdmi-stereo does not exist.
    
por Luigi Massa Gallerano 28.01.2013 / 11:12

7 respostas

25

Neste caso, o cartão é sempre o mesmo. O que está mudando entre um switch e outro é o "card-profile".

Então a solução que realmente funcionou é:

pacmd set-card-profile <cardindex> <profilename>

No meu caso, encontrei todos os perfis de cartões com:

pacmd list-cards

Depois de poder alternar entre alto-falantes do monitor e do laptop com:

pacmd set-card-profile 0 output:hdmi-stereo

E:

pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo

Onde 0 é o índice do cartão:

pacmd list-cards
Welcome to PulseAudio! Use "help" for usage information.
>>> 1 card(s) available.
    index: 0
    name: <alsa_card.pci-0000_00_1b.0>

E, finalmente, para tornar o switch mais rápido, eu configurei dois alias no meu arquivo .bashrc:

alias audio-hdmi='pacmd set-card-profile 0 output:hdmi-stereo+input:analog-stereo'
alias audio-laptop='pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo'

Dessa forma, posso alternar entre o áudio do monitor ou do laptop (fones de ouvido) digitando no shell: audio-hdmi ou audio-laptop

    
por 28.01.2013 / 15:24
5

Eu escrevi um miniaplicativo de indicadores que permite alternar a saída de som. Nenhum script de shell, mas talvez seja útil para você ou para outros leitores.

link

    
por 21.12.2013 / 13:15
2

Você pode usar pactl , ler sua página de manual para mais informações.

    
por 28.01.2013 / 11:25
2

Eu criei um script muito pequeno baseado nos anteriores, que não apenas altera o áudio, mas também a saída de vídeo. Ele usa o disper para alternar entre exibições.

Aqui está o código:

#!/bin/bash

CURRENT_PROFILE=$(pacmd list-cards | grep "active profile" | cut -d ' ' -f 3-)

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo>" ]; then
        pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo"
        disper -s
else 
        pacmd set-card-profile 0 "output:hdmi-stereo"
        disper -S        
fi

Para mim, é especialmente útil, pois não gosto de clonar os monitores. Eu uso um ou outro. Pode ser necessário adaptar os perfis de áudio ao seu sistema específico.

    
por 13.01.2014 / 20:38
2

O script python do Lukas ( link , postado acima) para implementar um applet notificador funciona bem. Precisa do pacote appindicator. Isso pode ser instalado com

sudo apt-get install python-appindicator
    
por 22.08.2014 / 13:06
1

Você pode experimentar este script: link

Testado no Ubuntu 10.04 - 13.04 e Arch Linux

    
por 19.06.2013 / 05:41
0

Como eu disse aqui (provavelmente uma duplicata), uma alternativa para Indicador do comutador de som (que requer a adição de um PPA):

Em uma linha

No meu caso foi hdmi-stereo-extra1+input profile, então em uma linha seria: [[ $(pacmd list-cards | grep "active profile" | cut -d " " -f 3-) = "<output:hdmi-stereo-extra1+input:analog-stereo>" ]] && pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo" || pacmd set-card-profile 0 "output:hdmi-stereo-extra1+input:analog-stereo" .

Você pode usar um atalho personalizado para executá-lo com bash -c (avisará se houver algum conflito com outro atalho):

Vocêtambémpodeadicionarumaliasaoseu.bashrc.

Emumscript

Eufizalgumasalteraçõescombasenaresposta@user829996(eaqui@user56655):

#!/bin/bash set -euo pipefail # strict mode activeProfile() { pacmd list-cards | grep "active profile" | cut -d " " -f 3-; } CURRENT_PROFILE="$(eval activeProfile)" # If it doesn't work run pacmd list-cards and try the other outputs from profile section ANALOG_PROFILE="output:analog-stereo+input:analog-stereo" HDMI_PROFILE="output:hdmi-stereo-extra1+input:analog-stereo" if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo-extra1+input:analog-stereo>" ] ; then pacmd set-card-profile 0 "$ANALOG_PROFILE" else pacmd set-card-profile 0 "$HDMI_PROFILE" fi activeProfile     
por 31.03.2017 / 00:35