自动连接蓝牙设备


Answers:


26

Pulseaudio> = 1.0

通过编辑,/etc/pulse/default.pa我们可以在将pulseaudio模块呈现给pulseaudio声音服务器后,立即加载pulseaudio模块module-switch-on-connect自动连接至音频接收器。我们需要插入以下行

load-module module-switch-on-connect

以前版本的pulseaudio

蓝牙设备一经出现,便会在PulseAudio中被识别。但是,需要在音频设置中手动进行连接。有一个GUI,允许一键式连接到BT设备(stream2ip)。

编辑:从版本0.2.5 stream2ip允许自动连接到蓝牙设备。

编辑:您可以将bluez设备设置为默认设备(例如,通过使用pacl或在配置设置中),如果不存在蓝牙设备,则回退到内部音频。

编辑:这是一个快速且肮脏的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()

只需复制此脚本并将其另存为bt-autoconnect.py即可。使脚本可执行或通过以下命令从命令行运行(推荐)cd /script/directory,然后键入:

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

用您的蓝牙设备的MAC(例如00:0C:78:4F:B6:B5)替换MAC,并在脚本查找设备时以秒为单位设置所需的超时(例如10)。然后,此脚本将在每个超时秒内监听蓝牙设备的给定MAC,并将其连接到PulseAudio(如果存在)。该脚本将永远运行,直到被杀死或关闭虚拟终端为止。

有时,PulseAudio似乎不知道设备在关闭后再次出现。充满希望pulseaudio -k,使它重新出现。

不花哨,没有GUI,但至少在我的设置中可以正常工作。

为感兴趣的人进行编辑:发行了带有GUI的bt-autoconnect以方便设置。请在此处提交错误或建议。感谢您的测试。


3
您无需发布评论即可添加其他信息。您可以将其编辑为原始答案,然后将其全部放在一个位置。

谢谢,第一个解决方案在Ubuntu 14.04上对我有用。请注意,您仍然需要运行sudo service pulseaudio restart或重新启动才能使更改生效。
塞林2015年

0

不幸的是,我现在才看到塔卡特的答案,这似乎是比我更好的方法。

我想这可能与Pulseaudio <1.0有关。它不使用轮询,而是在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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.