Autoconexão de dispositivos Bluetooth

28

Existe uma maneira de configurar o Bluetooth no Ubuntu para se conectar automaticamente aos dispositivos com os quais ele está emparelhado quando está ativado. Além disso, existe uma maneira de alterar automaticamente a saída de som para um fone de ouvido Bluetooth na conexão?

    
por Casey Keller 20.10.2010 / 06:20

2 respostas

26

Pulseaudio > = 1,0

Ao editar o /etc/pulse/default.pa , podemos carregar o módulo pulseaudio module-switch-on-connect para fazer a autoconexão em um coletor de áudio assim que ele for apresentado ao servidor de som pulseaudio. Precisamos inserir a seguinte linha

load-module module-switch-on-connect

Versões anteriores do pulseaudio

Os dispositivos Bluetooth são reconhecidos no PulseAudio assim que estão presentes. No entanto, a conexão precisa ser feita manualmente nas configurações de áudio. Existe uma GUI que permite conexão com um clique para dispositivos BT ( stream2ip ).

Editar: A partir da versão 0.2.5, o stream2ip permite a conexão automática a dispositivos Bluetooth.

Editar: você pode configurar seu dispositivo bluez como dispositivo padrão (por exemplo, usando pactl ou nas configurações de configuração) com fallback para áudio interno se nenhum dispositivo Bluetooth estiver presente.

Editar: Aqui está um script Python rápido e sujo para você ter uma ideia de como fazer o trabalho:

#!/usr/bin/env python
#-*- coding: utf-8 -*-
#
# bt-autoconnect
# Autoconnects Bluetooth Devices to PulseAudio
# (c) Takkat Nebuk
# Licence: GPLv3
# usage:
# bt-autoconnect <MAC> <timeout>

import subprocess
import time
import sys
import string

cli_options = sys.argv

def main():
    MAC = cli_options[1]
    timeout = cli_options[2]
    PMAC = string.replace(MAC,':','_') # PA don't know ':', needs '_'
    pa_args = ['pacmd set-default-sink bluez_sink.' + PMAC]
    bt_args = ['sdptool browse ' + MAC]
    err = False
    while err == False:
        if subprocess.call(bt_args, shell=True) == 0:
            err = subprocess.call(pa_args, shell=True)
        time.sleep(int(timeout))
    exit()

if __name__ == "__main__":
    main()

Copie esse script e salve-o como bt-autoconnect.py . Torne o script executável ou execute-o a partir da linha de comando (recomendado) por cd /script/directory e, em seguida, digite:

python bt-autoconnect.py [MAC] [timeout]

Substitua MAC pelo MAC do seu dispositivo Bluetooth (por exemplo, 00: 0C: 78: 4F: B6: B5) e defina um tempo limite desejado (por exemplo, 10) segundos quando o script procura pelo dispositivo. Este script irá então escutar o MAC todo tempo limite segundos para um dispositivo Bluetooth e conectá-lo ao PulseAudio, se presente. O script será executado para sempre até que esteja sendo eliminado ou o terminal virtual esteja fechado.

Às vezes, o PulseAudio parece não estar ciente de que o dispositivo está presente novamente depois de ter sido desligado. Com alguma esperança pulseaudio -k faz reaparecer.

Não é extravagante, não tem interface gráfica, mas pelo menos nas minhas configurações funcionou o.k ..

Editar para os interessados: o bt-autoconnect com GUI para instalação conveniente é liberado. Por favor arquive erros ou sugestões lá. Obrigado por testar.

    
por Takkat 20.10.2010 / 09:59
0

Infelizmente, só agora vi a resposta do Takkat. Parece ser o melhor caminho que o meu.

Acho que isso ainda pode ser relevante para a Pulseaudio < 1,0. Não usa polling, mas ouve eventos Bluetooth no dbus:

#!/usr/bin/python

# based on monitor-bluetooth
# Changes by Domen Puncer <[email protected]>

import gobject
import dbus
import dbus.mainloop.glib
import os


# we want this event: {AudioSource.PropertyChanged} [/org/bluez/16797/hci0/dev_00_24_7E_51_F7_52] State = playing
# and when that happens: pactl load-module module-loopback source=bluez_source.00_24_7E_51_F7_52 sink=alsa_output.pci-0000_00_1b.0.analog-stereo
def property_changed(name, value, path, interface):
    iface = interface[interface.rfind(".") + 1:]
    val = str(value)
    print "{%s.PropertyChanged} [%s] %s = %s" % (iface, path, name, val)
    if iface == "AudioSource" and name == "State" and val == "playing":
        bt_addr = "_".join(path.split('/')[-1].split('_')[1:])
        cmd = "pactl load-module module-loopback source=bluez_source.%s sink=alsa_output.pci-0000_00_1b.0.analog-stereo" % bt_addr
        os.system(cmd)


def object_signal(value, path, interface, member):
    iface = interface[interface.rfind(".") + 1:]
    val = str(value)
    print "{%s.%s} [%s] Path = %s" % (iface, member, path, val)

if __name__ == '__main__':
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

    bus = dbus.SystemBus()

    bus.add_signal_receiver(property_changed, bus_name="org.bluez", signal_name = "PropertyChanged", path_keyword="path", interface_keyword="interface")

    mainloop = gobject.MainLoop()
    mainloop.run()
    
por domen 21.03.2013 / 09:08