Connexion automatique des appareils Bluetooth

28

Existe-t-il un moyen de configurer le Bluetooth dans Ubuntu pour qu'il se connecte automatiquement aux appareils auxquels il est couplé lorsqu'il est allumé. De plus, existe-t-il un moyen de changer automatiquement la sortie audio en un casque Bluetooth lors de la connexion?

Casey Keller
la source

Réponses:

26

Pulseaudio> = 1.0

En éditant le /etc/pulse/default.panous pouvons charger le module pulseaudio module -switch-on-connect pour se connecter automatiquement à un récepteur audio dès qu'il est présenté au serveur de son pulseaudio. Nous devons insérer la ligne suivante

load-module module-switch-on-connect

Versions précédentes de pulseaudio

Les appareils Bluetooth sont reconnus dans PulseAudio dès qu'ils sont présents. Cependant, la connexion doit être établie manuellement dans les paramètres audio. Il existe une interface graphique qui permet une connexion en un clic aux périphériques BT ( stream2ip ).

Edit: à partir de la version 0.2.5 stream2ip permet la connexion automatique aux appareils Bluetooth.

Edit: vous pouvez configurer votre périphérique bluez comme périphérique par défaut (par exemple en utilisant pactl ou dans les paramètres de configuration) avec retour à l'audio interne si aucun périphérique Bluetooth n'est présent.

Edit: Voici un script Python rapide et sale pour vous donner une idée sur la façon de faire le travail:

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

Copiez simplement ce script et enregistrez-le sous bt-autoconnect.py . Rendez le script exécutable ou exécutez-le à partir de la ligne de commande (recommandé) par cd /script/directorypuis tapez:

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

Remplacez MAC par le MAC de votre appareil Bluetooth (par exemple 00: 0C: 78: 4F: B6: B5) et définissez un délai d'attente (par exemple 10) en secondes lorsque le script recherche l'appareil. Ce script écoutera ensuite le MAC donné toutes les secondes d' expiration pour un périphérique Bluetooth et le connectera à PulseAudio s'il est présent. Le script s'exécutera indéfiniment jusqu'à ce qu'il soit tué ou que le terminal virtuel soit fermé.

Parfois, PulseAudio ne semble pas être au courant que l'appareil est de nouveau présent après sa mise hors tension. Avec un peu d'espoir, pulseaudio -kil réapparaît.

Pas luxueux, pas d'interface graphique, mais au moins dans mes paramètres, cela fonctionnait bien.

Modifier pour ceux qui sont intéressés: bt-autoconnect avec GUI pour une configuration pratique est publié. Veuillez y déposer des bogues ou des suggestions. Merci pour les tests.

Takkat
la source
3
Vous n'avez pas besoin de poster un commentaire pour ajouter des informations supplémentaires. Au lieu de cela, vous pouvez simplement le modifier dans votre réponse originale et tout avoir en un seul endroit.
Merci, la première solution a fonctionné pour moi sur Ubuntu 14.04. Bien que vous remarquiez, vous devez toujours exécuter sudo service pulseaudio restartou redémarrer pour que la modification prenne effet.
Cerin
0

Malheureusement, je viens de voir la réponse de Takkat, cela semble être la meilleure façon que la mienne.

Je suppose que cela pourrait toujours être pertinent pour Pulseaudio <1.0. Il n'utilise pas d'interrogation, mais écoute les événements Bluetooth sur 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
la source