有没有一种方法可以将Ubuntu中的蓝牙设置为在打开时自动连接到与其配对的设备。此外,有没有一种方法可以在连接时自动将声音输出更改为蓝牙耳机?
通过编辑/etc/Pulse/default.pa
,我们可以将pulseaudio模块 module-switch-on-connect 加载到音频接收器,并在将其提供给pulseaudio声音服务器后自动连接。我们需要插入以下行
load-module module-switch-on-connect
蓝牙设备一经出现,便会在PulseAudio中被识别。但是,需要在音频设置中手动进行连接。有一个GUI,允许一键式连接到BT设备( stream2ip )。
编辑:从0.2.5版开始,stream2ip允许自动连接到蓝牙设备。
编辑:如果没有蓝牙设备,您可以将bluez设备设置为默认设备(例如,使用pactl或在配置设置中),并回退到内部音频。
编辑:这是一个快速且肮脏的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 __== "__main__":
main()
只需复制此脚本并将其另存为bt-autoconnect.py。使脚本可执行或通过cd /script/directory
从命令行运行(推荐),然后键入:
python bt-autoconnect.py [MAC] [timeout]
将MAC替换为蓝牙设备的MAC(例如00:0C:78:4F:B6:B5),然后设置所需的超时时间(例如10),在脚本查找设备时以秒为单位。然后,此脚本将为蓝牙设备每隔超时秒听一次给定的MAC,并将其连接到PulseAudio(如果存在)。该脚本将永远运行,直到被杀死或关闭虚拟终端为止。
有时,PulseAudio在关闭电源后似乎不知道该设备再次出现。充满希望pulseaudio -k
使它重新出现。
不花哨,没有GUI,但至少在我的设置中还可以。
编辑针对那些有兴趣的人: 带有GUI的bt-autoconnect 发行,用于方便设置。请在此处提交错误或建议。感谢您的测试。
不幸的是,我现在才看到塔卡特的答案,这似乎是比我更好的方法。
我想这可能与Pulseaudio <1.0有关。它不使用轮询,而是在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 __== '__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()