답변:
편집하여 /etc/pulse/default.pa
펄스 오디오 모듈 모듈-스위치-온- 커넥트를로드하여 오디오 오디오가 펄스 오디오 사운드 서버에 제공되는 즉시 오디오 싱크에 자동 연결 합니다. 다음 줄을 삽입해야합니다
load-module module-switch-on-connect
Bluetooth 장치는 PulseAudio에서 인식되는 즉시 인식됩니다. 그러나 오디오 설정에서 수동으로 연결해야합니다. BT 장치 ( stream2ip )에 한 번의 클릭으로 연결할 수있는 GUI가 있습니다 .
편집 : 버전 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 __name__ == "__main__":
main()
이 스크립트를 복사하여 bt-autoconnect.py 로 저장하십시오 . 스크립트를 실행 가능하게 만들거나 명령 줄에서 실행 (권장) cd /script/directory
하고 다음을 입력하십시오.
python bt-autoconnect.py [MAC] [timeout]
대체 MAC을 (: 0C : 78 : 4 층 : B6 : 예 B5 00)가 블루투스 기기의 MAC 의해 소망 설정된 제한 시간을 초 단위로 (예를 들어, 10) 장치의 경우 스크립트 보인다. 그런 다음이 스크립트는 Bluetooth 장치에 대해 지정된 시간 ( 초) 마다 지정된 MAC 을 수신하고 존재하는 경우 PulseAudio에 연결합니다. 스크립트는 종료되거나 가상 터미널이 닫힐 때까지 영원히 실행됩니다.
때때로 PulseAudio는 장치가 꺼진 후 다시 존재하는 장치를 인식하지 못하는 것 같습니다. 희망 pulseaudio -k
이 있으면 다시 나타납니다.
화려하지는 않지만 GUI는 없지만 적어도 내 설정에서는 정상적으로 작동했습니다.
관심있는 사용자를위한 편집 : 편리한 설정을위한 GUI를 사용한 bt-autoconnect 가 릴리스되었습니다. 거기에 버그 나 제안을 제출하십시오. 테스트 해 주셔서 감사합니다.
sudo service pulseaudio restart
하고 변경 사항을 적용 하려면 여전히 실행 하거나 재부팅해야합니다.
불행히도, 나는 지금 Takkat의 대답을 보았습니다.
이것이 여전히 Pulseaudio <1.0과 관련이 있다고 생각합니다. 폴링을 사용하지 않지만 dbus에서 Bluetooth 이벤트를 수신합니다.
#!/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()