Alternar entre alto-falante, estéreo Bluetooth, mono Bluetooth

3

Usando um fone de ouvido bluetooth que faz Stereo (somente out), mono (entrada / saída) e alto-falantes. Alternar entre os 3 é um monte de cliques. O que eu quero fazer: - execute o estéreo no alto-falante ou fone de ouvido - quando faço ou aceito uma chamada de voip (Skype, gTalk, etc): mude para o perfil Bluetooth com a entrada ativada - voltar depois da chamada

.ou. Tem um menu simples (indicador?) Que me permite alternar entre combinações predefinidas de entrada / saída

Como faço isso?

    
por stwissel 03.07.2012 / 13:42

2 respostas

1

De acordo com o meu conhecimento, não há uma solução simples de um clique que nos permita alternar rapidamente de áudio interno para perfil de áudio Bluetooth A2DP e perfil de fone de ouvido Bluetooth HSP.

No entanto, podemos alterar a saída de som da linha de comando, o que nos dá a oportunidade de criar um script para alternar a saída de áudio. Os comandos que precisamos são os seguintes:

  • pacmd list-cards em listará os cartões disponíveis. Assim que um fone de ouvido for conectado, teremos acesso às propriedades de áudio do Bluetooth. Além disso, podemos agora descobrir o índice da placa pulseaudio e possíveis perfis para os seguintes comandos.

  • pacmd set-card-profile <index> <profile> em altera o perfil de um número de cartão <index> . Para um cartão Bluetooth, o perfil em questão será de a2dp para o perfil de áudio e hsp para o perfil de telefonia do fone de ouvido.

  • pacmd set-default-sink e pacmd set-default-source em vai mudar a saída resp. entrada usada pelo pulseaudio. Isso não pode ser feito durante a reprodução. Veja esta resposta para detalhes sobre como fazer isso.

Abaixo, há um script de exemplo que pode ser usado para alternar a saída de som de um fone de ouvido Bluetooth:

#!/bin/bash
# CLI options:  'a2dp': Audio Profile
#               'hsp':  Telephony Profile
#               <Index> Default Sink (try '0' or '1')

SINK=$( pacmd list-cards | grep -B 1 bluez )
INDEX=${SINK:10:2}
SINK=$( pacmd list-cards | grep bluez )
MAC=${SINK:19:17}
BT_SINK="bluez_sink.$MAC"
BT_SOURCE="bluez_source.$MAC"

if [ $1 = a2dp ]; then
    echo Setting A2DP audio sink $BT_SINK
    pacmd set-card-profile $INDEX a2dp
    pacmd set-default-sink $BT_SINK
elif [ $1 = hsp ]; then
    echo Setting HSP headset sink $BT_SOURCE
    pacmd set-card-profile $INDEX hsp
    pacmd set-default-sink $BT_SINK
    pacmd set-default-source $BT_SOURCE
else
    echo Resetting to internal audio
    pacmd set-default-sink $1
    pacmd set-default-source $1
fi

Copie o script, salve-o como switch-sink e conceda permissão executável. Em um terminal, mude para o diretório de script e emita o script com as seguintes opções:

switch-sink a2dp    # switches to audio profile
switch-sink hsp     # switches to headset/telephony profile
switch-sink <index> # switches to sink <index>, e.g. 0 depending on our default

Indique o caminho completo para o script ao executar a partir de um atalho de teclado ou de um arquivo .desktop (para desktop ou launcher).

Nota adicional na placa de som ÍNDICE:

Caso haja mais de 99 placas de som registradas com pulseaudio, este script não funcionará. Isso pode se tornar um problema, pois o ÍNDICE do cartão será aumentado a cada ativação ou reconexão de um dispositivo Bluetooth. Como solução alternativa, podemos alterar a última condição else para redefinir o servidor pulseaudio (que também carregará nosso coletor de áudio padrão):

else
    pulseaudio -k
fi
    
por Takkat 03.07.2012 / 22:23
3

Acho que encontrei um bug com essa solução. No meu caso, apenas 1 foi definido como índice, por isso recebi este erro > > > Nenhum cartão encontrado por este nome ou índice.

$ pacmd list-cards | grep -B 1 bluez
    index: 10
    name: <bluez_card.00_0D_44_A6_7D_85>
--
        device.string = "00:0D:44:A6:7D:85"
        device.api = "bluez"
--
        device.form_factor = "headset"
        bluez.path = "/org/bluez/1085/hci0/dev_00_0D_44_A6_7D_85"
        bluez.class = "0x240404"
        bluez.name = "Logitech Wireless Headset"
--
    sinks:
        bluez_sink.00_0D_44_A6_7D_85/#11: Logitech Wireless Headset
    sources:
        bluez_sink.00_0D_44_A6_7D_85.monitor/#22: Monitor of Logitech Wireless Headset

Eu mudei o seu script e agora está funcionando bem. (Não é talvez melhor solução)

Isso é o que eu mudei

#SINK=$( pacmd list-cards | grep -B 1 bluez | head -1 )
INDEX=$( pacmd list-cards | grep -B 1 bluez | head -1 | awk ' { print $2 } ' )
#SINK=$( pacmd list-cards | grep bluez )
MAC=$( pacmd list-cards | grep bluez | head -1 | awk -F . ' { print substr($2,0,length($2)) }' )
    
por user104053 20.11.2012 / 13:30