Чи є спосіб встановити Bluetooth в Ubuntu для автоматичного підключення до пристроїв, до яких він підключений при його включенні. Крім того, чи є спосіб автоматично змінити вихідний звук на гарнітуру Bluetooth?
Чи є спосіб встановити Bluetooth в Ubuntu для автоматичного підключення до пристроїв, до яких він підключений при його включенні. Крім того, чи є спосіб автоматично змінити вихідний звук на гарнітуру Bluetooth?
Відповіді:
Редагуючи, /etc/pulse/default.pa
ми можемо завантажити модуль імпульсного модуля-увімкнути-підключити до автоматичного підключення до звукової раковини, як тільки він буде представлений на сервер імпульсного звуку. Нам потрібно вставити наступний рядок
load-module module-switch-on-connect
Bluetooth-пристрої розпізнаються в PulseAudio, як тільки вони є. Однак підключення потрібно робити вручну в налаштуваннях звуку. Існує графічний інтерфейс, який дозволяє підключення одним клацанням до пристроїв BT ( stream2ip ).
Редагувати: З версії 0.2.5 stream2ip дозволяє автоматично підключатися до пристроїв Bluetooth.
Редагувати: ви можете налаштувати свій пристрій bluez як пристрій за замовчуванням (наприклад, за допомогою 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()
Просто скопіюйте цей скрипт і збережіть його як bt-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
змушує її знову з’являтися.
Не фантазії, немає графічного інтерфейсу, але принаймні в моїх налаштуваннях він працював нормально.
Редагування для тих, хто цікавиться: випускається bt-autoconnect з GUI для зручного налаштування. Будь ласка, подайте туди помилки чи пропозиції. Дякую за тестування
sudo service pulseaudio restart
або перезавантажити, щоб зміни вступили в силу.
На жаль, я тільки зараз бачив відповідь від Такката, здається, це кращий спосіб, ніж мій.
Я думаю, це все ще може бути актуальним для 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()