Dispositivo de saída de áudio, interruptor rápido?

19

Dependendo da situação, eu uso meus alto-falantes ou meu fone de ouvido para saída de áudio. Como meu fone de ouvido é um fone de ouvido USB, ele se comporta como seu próprio dispositivo de áudio.

Atualmente, alterno entre os dispositivos de saída de áudio clicando no ícone do alto-falante na bandeja superior direita, onde seleciono Configurações de som, vou para a guia Saída e escolhe o dispositivo que desejo.

O que eu me pergunto é se pode haver alguma maneira mais fácil / rápida de alternar para o meu fone de ouvido USB? Talvez um ícone de bandeja dedicado, um mapeamento de teclas ou algo assim?

Estou executando o Ubuntu 10.04, com a área de trabalho padrão do Gnome.

andol
fonte

Respostas:

11

Para alterar o dispositivo de saída de áudio padrão na linha de comando, você pode usar o pacmdutilitário de linha de comando Pulse Audio.

Encontrei a necessidade de fazer o mesmo hoje, querendo alternar entre fones de ouvido e alto-falantes, ambos conectados a placas de áudio separadas. Aqui está o script de shell que escrevi para fazer isso:

#!/usr/bin/env bash

sinks=($(pacmd list-sinks | grep index | \
    awk '{ if ($1 == "*") print "1",$3; else print "0",$2 }'))
inputs=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

[[ ${sinks[0]} = 0 ]] && swap=${sinks[1]} || swap=${sinks[3]}

pacmd set-default-sink $swap &> /dev/null
for i in ${inputs[*]}; do pacmd move-sink-input $i $swap &> /dev/null; done

Notas:

  • Isso alterna entre os dois primeiros dispositivos de saída de áudio pacmdlistados pelo utilitário. Se você possui mais de dois dispositivos de áudio e deseja trocar por outro, precisará substituir a lógica na linha 7 por alguns condicionais.
  • Apenas trocar o dispositivo coletor padrão não faz nada para os aplicativos atualmente em execução - eles continuarão sendo enviados para o dispositivo anterior. Esse script também move o destino do coletor para todas as entradas existentes. Ou seja, se você executar esse script com música tocando em um dispositivo, ele será instantaneamente trocado pelo outro. Se você deseja que os aplicativos existentes continuem no dispositivo anterior, comente a última linha (e a linha 5, se desejar).
Andrew
fonte
7

Bem, você pode instalar pavucontrol, ele mostra aplicativos com seleção de dispositivo de som na primeira guia, economizando um pouco de esforço. Mas o que você realmente deseja é marcar o fone de ouvido USB como dispositivo padrão, toda vez que você conectá-lo, todo o som será redirecionado para ele e, quando você conectá-lo, ele voltará para os alto-falantes. Sem esforço, realmente.

vava
fonte
2
Como você define o dispositivo padrão no Ubuntu Precise?
blueyed
3

A pergunta é bastante antiga, mas minha resposta ainda pode ser útil para usuários do GNOME 2. Usei o PulseAudio Mixer Applet para o problema exato descrito aqui. Você pode alterar os dispositivos de entrada e saída diretamente no menu do painel. É a maneira mais conveniente que encontrei.

dAnjou
fonte
3

É claro que a troca de dispositivos usando o Applet também está funcionando bem. Mas o legal de escrever um script é que é super rápido. Coloquei o meu, por exemplo, no atalho de teclado alt + s. portanto, quando eu quero mudar de fones de ouvido para alto-falantes, só preciso pressionar alt + s.

De qualquer forma. Andrew disse:

Se você possui mais de dois dispositivos de áudio e deseja trocar por outro, precisará substituir a lógica na linha 7 por alguns condicionais.

Isso é o que eu fiz. Eu o compartilho, caso alguém tenha problemas com ele:

#!/usr/bin/env bash

#sinks=($(pacmd list-sinks | grep index | \
#    awk '{ if ($1 == "*") print "1",$3; else print "0",$2 }'))
sinks=($(pacmd list-sinks | grep index | \
    awk '{ if ($1 == "*") print "1"; else print "0" }'))
inputs=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

#find active sink
active=0
for i in ${sinks[*]}
do
    if [ $i -eq 0 ]
        then active=$((active+1))
        else break
    fi
done

#switch to next sink
swap=$(((active+1)%${#sinks[@]}))

pacmd set-default-sink $swap &> /dev/null
for i in ${inputs[*]}; do pacmd move-sink-input $i $swap &> /dev/null; done

O que fiz de diferente foi: a) encontrar o coletor ativo em um loop for. Eb) mude para o próximo coletor aumentando o índice em 1. Então modulo o resultado pelo número de sumidouros. Isso garante que, por exemplo, ao ter 3 pias, (2 + 1)% 3 = 0. Assim, no índice 2 do coletor, mudaríamos para o índice 0.

Dessa maneira, o comutador permite mover-se para cima pelas pias disponíveis.

traumtaenzer
fonte
2

Obrigado pelos scripts! Eu adicionei uma parte para entrada (microfone), caso alguém queira usá-la:

while read line ; do
  case $line in 
    *\*\ index*) x=1 ;;
    index*) x=0 ;;
    name*) 
      source=$(echo $line | sed -e "s/.*<//;s/>.*//")
      if [[ $x = "0" ]] ; then
        pacmd set-default-source $source &> /dev/null
      fi ;;
  esac
done < <(pacmd list-sources | grep -e alsa_input -e index)
Subbeh
fonte
2

Para percorrer sua lista de dispositivos de som, use o seguinte script:

#!/bin/bash

declare -i sinks=(`pacmd list-sinks | sed -n -e 's/\**[[:space:]]index:[[:space:]]\([[:digit:]]\)/\1/p'`)
declare -i sinks_count=${#sinks[*]}
declare -i active_sink_index=`pacmd list-sinks | sed -n -e 's/\*[[:space:]]index:[[:space:]]\([[:digit:]]\)/\1/p'`
declare -i next_sink_index=${sinks[0]}

#find the next sink (not always the next index number)
declare -i ord=0
while [ $ord -lt $sinks_count ];
do
echo ${sinks[$ord]}
if [ ${sinks[$ord]} -gt $active_sink_index ] ; then
    next_sink_index=${sinks[$ord]}
    break
fi
let ord++
done

#change the default sink
pacmd "set-default-sink ${next_sink_index}"

#move all inputs to the new sink
for app in $(pacmd list-sink-inputs | sed -n -e 's/index:[[:space:]]\([[:digit:]]\)/\1/p');
do
pacmd "move-sink-input $app $next_sink_index"
done

#display notification
declare -i ndx=0
pacmd list-sinks | sed -n -e 's/device.description[[:space:]]=[[:space:]]"\(.*\)"/\1/p' | while read line;
do
if [ $(( $ord % $sinks_count )) -eq $ndx ] ; then
    notify-send -i notification-audio-volume-high --hint=string:x-canonical-private-    synchronous: "Sound output switched to" "$line"
    exit
fi
let ndx++
done;

Todo o crédito vai para o tsvetan no fórum Ubuntu .

guttermonk
fonte
1

Eu estava procurando uma maneira de fazer isso para alternar entre os alto-falantes internos do meu laptop e uma estação base do aeroporto da Apple conectada ao meu aparelho de som. Decidi atribuir teclas de atalho para alternar. Eu queria que a janela de preferências de áudio fosse exibida por um segundo para dar uma confirmação visual da opção e usei o wmctrl para fechar a janela depois.

(Eu usei ctrl + F8 e ctrl + F9 como teclas de atalho, pois a função Fn dessas teclas no meu laptop é aumentar e diminuir o volume, de modo que parecia óbvio que as funções ctrl alterassem a saída de áudio.)

Eu usei os 2 scripts a seguir (quase idênticos):

#! /bin/bash
gnome-volume-control -p output &
sleep .7 
pacmd set-default-sink 1
sleep .8 
wmctrl -c "Sound Preferences"
exit

#! /bin/bash
gnome-volume-control -p output &
sleep .7 
pacmd set-default-sink 0
sleep .8 
wmctrl -c "Sound Preferences"
exit

A primeira muda para a estação base da apple (atribuída a ctrl + F9) e a segunda volta para os alto-falantes internos (ctrl + F8). Isso pressupõe que esses são os únicos 2 dispositivos de saída instalados.


fonte
1

Desenvolvi o script de Andrews para usar o notify-osd para anunciar o que acabou de fazer. Edite as linhas com os nomes de acordo com suas necessidades.

#!/usr/bin/env bash

sinks=($(pacmd list-sinks | grep index | \
    awk '{ if ($1 == "*") print "1",$3; else print "0",$2 }'))
inputs=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

[[ ${sinks[0]} = 0 ]] && swap=${sinks[1]} || swap=${sinks[3]}

pacmd set-default-sink $swap 

for i in ${inputs[*]}; do pacmd move-sink-input $i $swap &> /dev/null; done

if [ "$swap" = "0" ]; then
notify-send -u normal -i audio-volume-medium-symbolic "Sound output changed. Now using: Corsair 2.1 Speakers!" 

else
notify-send -u normal -i audio-volume-medium-symbolic "Sound output changed. Now using: Logitech G930 Headset!" 

fi
Kveras
fonte