web-dev-qa-db-ja.com

Bluetoothデバイスの自動接続

UbuntuでBluetoothを設定して、電源を入れたときにペアになっているデバイスに自動接続する方法はありますか。さらに、接続時にBluetoothヘッドセットへの音声出力を自動的に変更する方法はありますか?

28
Casey Keller

Pulseaudio> = 1.0

/etc/Pulse/default.paを編集することにより、pulseaudioモジュールmodule-switch-on-connectをロードして、すぐにオーディオシンクに自動接続できます。 pulseaudioサウンドサーバーに提示されます。次の行を挿入する必要があります

load-module module-switch-on-connect

Pulseaudioの以前のバージョン

Bluetoothデバイスは、存在するとすぐにPulseAudioで認識されます。ただし、音声設定で手動で接続する必要があります。 BTデバイスへのワンクリック接続を可能にするGUIがあります( stream2ip )。

Edit:バージョン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 __== "__main__":
    main()

このスクリプトをコピーして、bt-autoconnect.pyとして保存します。スクリプトを実行可能にするか、cd /script/directoryによってコマンドラインから実行する(推奨)後、次を入力します。

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

MACをBluetoothデバイスのMAC(例:00:0C:78:4F:B6:B5)に置き換えて、希望のtimeout(例:10)スクリプトがデバイスを探す秒単位。このスクリプトは、指定されたMACをBluetoothデバイスのtimeout秒ごとにリッスンし、PulseAudioに接続します(存在する場合)。スクリプトは、強制終了されるか、仮想端末が閉じられるまで永久に実行されます。

場合によっては、PulseAudioは、スイッチが切られた後、デバイスが再び存在することを認識していないようです。 pulseaudio -kを使用すると、再表示されます。

派手ではなく、GUIはありませんが、少なくとも私の設定ではうまくいきました。

Edit興味のある方へ: bt-autoconnect 便利なセットアップのためのGUIがリリースされました。そこにバグや提案を提出してください。テストしていただきありがとうございます。

26
Takkat

残念ながら、私はタックカットからの答えを見たばかりです。それは私のものよりも良い方法のようです。

これは、Pulseaudio <1.0に関連する可能性があると思います。ポーリングは使用しませんが、dbusでBluetoothイベントをリッスンします。

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