Автоматическое подключение устройств Bluetooth

Есть ли способ настроить Bluetooth в Ubuntu для автоматического подключения к устройствам, к которым он подключен, когда он включен. Кроме того, есть ли способ автоматически переключать вывод звука на гарнитуру Bluetooth при подключении?

28
задан 1 November 2010 в 06:43

2 ответа

Pulseaudio> = 1.0

Путем редактирования /etc/pulse/default.pa мы можем загрузить pulseaudio модуль module-switch-on-connect для автосоединений с аудио приемником, как только он представлен серверу звука pulseaudio. Мы должны вставить следующую строку

load-module module-switch-on-connect

Предыдущие версии pulseaudio

Bluetooth-устройства распознаны в PulseAudio, как только они присутствуют. Однако связь должна быть установлена вручную в параметрах звука. Существует GUI, который позволяет соединение с одним щелчком с устройствами BT (stream2ip).

Править: От версии 0.2.5 stream2ip позволяет автосоединяться с bluetooth-устройствами.

Править: можно настроить устройство блюза как устройство по умолчанию (например, при помощи pactl или в настройках конфигурации) с нейтрализацией к внутреннему аудио, если никакое bluetooth-устройство не присутствует.

Править: Вот быстрый и грязный сценарий Python для давания Вам общее представление относительно того, как сделать задание:

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

Просто скопируйте этот сценарий и сохраните его как купленный-autoconnect.py. Сделайте исполняемый файл сценария или выполните его из командной строки (рекомендуемой) cd /script/directory и затем тип:

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

Замените MAC MAC Вашего bluetooth-устройства (например, 00:0C:78:4F:B6:B5) и установите желаемый тайм-аут (например, 10) в секундах, когда сценарий будет искать устройство. Этот сценарий будет затем слушать данный MAC каждый тайм-аут секунды для bluetooth-устройства и подключает его к PulseAudio если существующий. Сценарий будет работать навсегда, пока он не будет уничтожен, или виртуальный терминал был закрыт.

Иногда PulseAudio, кажется, не знает, что устройство присутствует снова после того, как он был выключен. С некоторой надеждой pulseaudio -k заставляет его вновь появиться.

Не необычный, никакой GUI, но по крайней мере в моих настройках это работало хорошо..

Редактирование для заинтересованных: купленное автоподключение с GUI для удобной установки выпущено. Ошибки файла или предложения там. Спасибо за тестирование.

26
ответ дан 1 November 2010 в 06:43

К сожалению, я только теперь видел ответ от Takkat, Это, кажется, лучший путь, чем мой.

Я предполагаю, что это могло бы все еще быть важно для Pulseaudio <1.0. Это не использует опрос, но слушает события Bluetooth на dbus:

#!/usr/bin/python

# based on monitor-bluetooth
# Changes by Domen Puncer <domen@cba.si>

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()
0
ответ дан 1 November 2010 в 06:43

Другие вопросы по тегам:

Похожие вопросы: