Conexão automática de dispositivos Bluetooth

28

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

Casey Keller
fonte

Respostas:

26

Pulseaudio> = 1.0

Ao editar o /etc/pulse/default.pa, podemos carregar o módulo pulseaudio module -on-connect para conectar-se automaticamente a 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. Há uma GUI que permite a conexão com um clique aos dispositivos BT ( stream2ip ).

Editar: A partir da versão 0.2.5, 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) com fallback para o áudio interno, se nenhum dispositivo bluetooth estiver presente.

Edit: Aqui está um script Python rápido e sujo para lhe dar uma idéia 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()

Apenas copie esse script e salve-o como bt-autoconnect.py . Torne o script executável ou execute-o na linha de comando (recomendado) cd /script/directorye digite:

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

Substitua o MAC pelo MAC do seu dispositivo Bluetooth (por exemplo, 00: 0C: 78: 4F: B6: B5) e defina o tempo limite desejado (por exemplo, 10) em segundos quando o script procurar o dispositivo. Esse script ouvirá o MAC fornecido a cada segundo de tempo limite para um dispositivo Bluetooth e o conectará ao PulseAudio, se presente. O script será executado para sempre até ser morto ou o terminal virtual ser fechado.

Às vezes, o PulseAudio parece não estar ciente de que o dispositivo está presente novamente após ter sido desligado. Com alguma esperança, pulseaudio -kfaz com que reapareça.

Não é chique, sem interface gráfica, mas pelo menos nas minhas configurações funcionou bem.

Edite para os interessados: o bt-autoconnect com GUI para configuração conveniente é lançado. Por favor, arquive bugs ou sugestões lá. Obrigado por testar.

Takkat
fonte
3
Você não precisa publicar um comentário para adicionar informações adicionais. Em vez disso, basta editá-lo na resposta original e colocá-lo em um só lugar.
Obrigado, a primeira solução funcionou para mim no Ubuntu 14.04. Embora observe, você ainda precisa executar sudo service pulseaudio restartou reiniciar para que a alteração entre em vigor.
Cerin
0

Infelizmente, só agora vi a resposta de Takkat: parece ser a melhor maneira que a minha.

Eu acho que isso ainda pode ser relevante para o Pulseaudio <1.0. Ele não usa sondagem, 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()
domen
fonte