Atalho para alternar entre saída estéreo analógica e saída de áudio HDMI


18

Para alternar para a saída de áudio HDMI (do monitor) e retornar à saída de áudio normal da tomada de áudio do sistema (para fones de ouvido, pois meu monitor não possui saída de áudio), eu me pego abrindo as preferências de som e selecionando o canal certo sempre. Existe alguma maneira de criar um botão de alternância no painel ou atribuir alguma tecla de atalho para alternar, pois faço a alternância com tanta frequência.

:aplay -l 
**** List of PLAYBACK Hardware Devices ****
card 0: Intel [HDA Intel], device 0: STAC92xx Analog [STAC92xx Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 3: HDMI 0 [HDMI 0]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 7: STAC92xx Digital [STAC92xx Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

insira a descrição da imagem aqui


11
+1 Seria incrível se eu pudesse mudar para o modo de saída de vídeo HDMI correto e o modo de som com um toque de tecla.
precisa

O que seria melhor ainda é que, quando detectar esse canal de áudio da porta de exibição / HDMI, ele o troque automaticamente. É para isso que serve o encaixe. Parece que me lembro de algum código de encaixe há um tempo que mudará a configuração com base em determinadas IDs de hardware (MAC). Alguém sabe o que é chamado de novo?
Elias Lynn

Respostas:


10

Com o pulseaudio, podemos selecionar o coletor de saída na linha de comando:

pacmd set-default-sink "SINKNAME"

Este comando pode ser usado em um iniciador, script ou mesmo atribuído a um atalho de teclado para alternar rapidamente entre diferentes coletores. Substitua "SINKNAME" pelo nome ou número do coletor desejado. Uma lista de sumidouros conhecidos com seus números e nomes associados é fornecida pelo comando:

pacmd list-sinks

Nota: A alteração do coletor de saída pela interface da linha de comandos somente terá efeito se a leitura do dispositivo de destino do fluxo estiver desativada. Isso pode ser feito editando a linha correspondente em /etc/pulse/default.pa:

load-module module-stream-restore restore_device=false

Como alternativa, poderíamos executar o pulseaudio para emitir simultaneamente o som para o dispositivo de áudio interno e para o dispositivo HDMI executando paprefs com a opção de adicionar um dispositivo de saída virtual:

paprefs


2
pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.analog-stereo"e pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.hdmi-stereo"funciona somente depois de selecionar o perfil correspondente em Preferências de som. Se eu estiver com o HDMI configurado e executar o comando pacmd para estéreo analógico, estou recebendo o erro. Sink alsa_output.pci-0000_00_1b.0.analog-stereo does not exist.Mas se eu selecionar manualmente o perfil na GUI de preferências de som e executar o mesmo comando, não estou recebendo o erro. Portanto, não está ajudando a mudar.
IJeeves

@ iJeeves: veja editar para atualização.
Takkat

Problema semelhante. Se eu executar o comando, ele mudará visualmente na GUI, mas o som não será redirecionado. Eu tenho que alternar manualmente na GUI para que ele funcione. Alguma ideia?
Elias Lynn

11
@ElijahLynn: Talvez você também precise mover o stream: askubuntu.com/questions/71863/…
Takkat 15/01/14

@ Takkat: Eu não tentei ainda, mas esse parece ser o problema exato que eu estava tendo. Muito obrigado!
Elias Lynn

7

Achei isso muito irritante e escrevi um script para alternar a saída:

#!/bin/bash

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

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

e depois vincule uma tecla não usada no meu teclado para executá-la (consulte Como vincular comandos personalizados a atalhos de teclado? )


Embora você não
conecte-se há

Como fazer isso se precisar alternar entre dois cartões, e não apenas dois perfis de um cartão?
Oebele

2

Ainda outro script de comutador de pia

testado no Ubuntu 16.04


Mas este permite alternar apenas o áudio do aplicativo que você deseja.

USO: concentre o aplicativo que você deseja alterar seu coletor e execute este script. É isso aí!!!

Esse script detecta o aplicativo que está em foco, localiza todos os áudios reproduzidos nele e os muda para o próximo coletor disponível.

https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3

Explicando o script

Precisamos encontrar o PID do aplicativo em foco

Mas primeiro precisamos do xid

xprop -root _NET_ACTIVE_WINDOW 

Em seguida, insira-o aqui $xidpara obter o pid da aplicação

xprop -id $xid _NET_WM_PID

Agora precisamos encontrar as entradas de coletor relacionadas a esse PID

Primeiro, vamos linearizar a saída do comando pacmd list-sink-inputspara listar uma entrada de coletor por linha, mostrando seu índice, coletor e pid na mesma linha

pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2

vamos analisá-lo passo a passo:

grep -E 'index:|sink:|process.idsó manter linhas que contêm index:, sink:ouprocess.id

tr '\n' ' ' junta todas as linhas

tr -d '"'remove todos os "caracteres. Necessário para receber o pid sem aspas

sed -e 's/index:/\n/g'substitui todas as index:ocorrências por um novo caractere de linha\n

tail -n +2 remove a primeira linha porque está vazia

E o resultado é algo como isto:

  180 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 3521
  181 sink: 1 <alsa_output.pci-0000_00_01.0.analog-stereo> application.process.id = 2733
  182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

Vamos analisar uma linha para entender o que isso significa:

  # 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

182é o índice de entrada do coletor, 0é o índice do coletor e, 13752no final, é o pid do aplicativo pertencente

Então iteramos através de cada linha

... | while IFS= read -r line || [ -n "$line" ]; do
  sink_input_pid=$(echo $line | awk '{print $NF}')

E, finalmente, filtre apenas o pid da entrada do coletor que corresponde ao pid do aplicativo focado

  if [ $sink_input_pid = $app_pid ]; then

Extraindo dados

Com awkpodemos obter os elementos que precisamos

sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')

Obtenha o número de sumidouros para saber quando a rotação dos sumidouros deve reiniciar de 0.

sink_list_size=${#sink_list_array[@]}

Para encontrar o próximo coletor, precisamos percorrer a lista de coletores, para saber qual deles corresponde a current_sink_index e para saber o índice do próximo coletor.

i=0
for sink in "${sink_list_array[@]}"; do
  i=$((($i+1)%sink_list_size))  # i++ mod(#sinks)
  if [ $sink = $current_sink_index ]; then
    next_sink_index=${sink_list_array[i]}
    break
  fi
done

E, finalmente, movemos a entrada do coletor para tocar no next_sink_index

pacmd move-sink-input $sink_input_index $next_sink_index

Nota no Ubuntu 16.04:

Ao configurar a tecla de atalho, não consegui fazê-lo funcionar com o gerenciador de atalhos do ubuntu. Então eu tive que instalar o compizconfig-settings-manager

sudo apt-get install compizconfig-settings-manager

+1 para obter a primeira resposta ótima como novo usuário. Como a pergunta original era para o Ubuntu 11.04, você deveria indicar qual versão foi testada.
WinEunuuchs2Unix 7/17/17

@ WinEunuuchs2Unix Uau! obrigado :). Eu adicionei a versão do Ubuntu abaixo do título.
Madacol


1

Como existe apenas uma placa de som visível na captura de tela, acho que a saída dessa placa de som deve ser alterada.

Por exemplo: Eu tenho um notebook com uma placa de som integrada, mas ela possui uma saída digital (SPDIF) quando encaixada.

Então, o que eu queria fazer era mudar a saída ativa ou "Perfil" no pulseaudio.

Encontrei os comandos que fazem exatamente isso:

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

O que fiz para obter os nomes corretos para a configuração de saída desejada - aqui, saída digital, mas entrada (micro) analógica - foi:

pacmd list | grep output

1

Eu tenho tentado encontrar uma solução para esse problema também. No Ubuntu 11.04, isso não parece ser possível diretamente, encontrei este guia apenas para adicionar HDMI e Analógico como saídas separadas; portanto, o pacmd mostra três pias agora. Então é possível alternar entre pias usando os comandos acima. ( veja também )

Mas, aparentemente, o Ubuntu 11.11 terá um PulseAudio com sistema de detecção de jack. De acordo com o site abaixo, David Henningsson codificou uma detecção via udev para que o áudio de pulso seja alternado automaticamente para a última saída adicionada, incluindo a alternância entre diferentes perfis da mesma placa de som (como é o caso da sua e da minha instalação). (veja aqui )

Então, espero que isso funcione, quando experimentar a versão final na próxima sexta-feira.


1

Com base em muitas das respostas anteriores, escrevi um script que define o coletor de reprodução alternando entre as disponíveis.

A melhor maneira de usá-lo é criando um atalho de teclado para executá-lo; assim, toda vez que você pressionar essa combinação de teclas, o áudio será redirecionado para o próximo coletor disponível.

O código está disponível aqui: https://gist.github.com/germank/7fa2fb07d45a838bf890addadd8bea8c


0

No meu caso, as opções analógicas não estão na lista. Instale o pavucontrol: sudo apt install pavucontrol

Pode corrigir o problema iniciando o aplicativo:

  1. Inicie o aplicativo via terminal, digitando: pavucontrol(enter)
  2. Vá para a guia 'Configuração'.
  3. Selecione o perfil de saída estéreo analógico no Intern Sound

insira a descrição da imagem aqui

Agora eu podia ouvir e selecionar diferentes perfis (no Linux Mint):

insira a descrição da imagem aqui


0

Uma alternativa ao Sound Switcher Indicator (que requer a adição de um PPA) é criar um comando (ou um script) e chamá-lo com um atalho:

No meu caso era hdmi-stereo-extra1+inputperfil, 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 ( gnome-control-center keyboard) para executá-lo bash -c(avisará se houver algum conflito com outro atalho):

captura de tela

captura de tela

Eu uso:

  • Super + Alt + o: Alterne a saída entre fones de ouvido e HDMI.
  • Super + Alt + Up: Aumentar volume
  • Super + Alt + Down: Vol Down

Além disso, você pode adicionar um aliasao seu .bashrc.

Testado no Ubuntu 16.04 e 18.04


Se você não estava acima do comportamento em um script, fiz algumas alterações com base na resposta @ user829996:

#!/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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.