From bae002abcae4289022e8db6f771ed02e123f6e35 Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Wed, 28 Jun 2017 09:53:31 -0700 Subject: [PATCH] bluetooth-audio: initial add-on --- .../service/bluetooth-audio/changelog.txt | 2 + .../service/bluetooth-audio/icon/icon.png | Bin 0 -> 22745 bytes .../addons/service/bluetooth-audio/package.mk | 46 +++++ .../service/bluetooth-audio/source/default.py | 192 ++++++++++++++++++ .../resources/language/English/strings.po | 11 + .../source/resources/settings.xml | 7 + 6 files changed, 258 insertions(+) create mode 100644 packages/addons/service/bluetooth-audio/changelog.txt create mode 100644 packages/addons/service/bluetooth-audio/icon/icon.png create mode 100644 packages/addons/service/bluetooth-audio/package.mk create mode 100644 packages/addons/service/bluetooth-audio/source/default.py create mode 100644 packages/addons/service/bluetooth-audio/source/resources/language/English/strings.po create mode 100644 packages/addons/service/bluetooth-audio/source/resources/settings.xml diff --git a/packages/addons/service/bluetooth-audio/changelog.txt b/packages/addons/service/bluetooth-audio/changelog.txt new file mode 100644 index 0000000000..fe01f1b4fe --- /dev/null +++ b/packages/addons/service/bluetooth-audio/changelog.txt @@ -0,0 +1,2 @@ +100 +- Initial release diff --git a/packages/addons/service/bluetooth-audio/icon/icon.png b/packages/addons/service/bluetooth-audio/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5d57247f6ecb845b9f1979a3922147c7d91f61b7 GIT binary patch literal 22745 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 q690#H|H=H7`v0>iknUcSFam^<wrCiA_. +################################################################################ + +PKG_NAME="bluetooth-audio" +PKG_VERSION="0" +PKG_REV="100" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="" +PKG_URL="" +PKG_DEPENDS_TARGET="toolchain" +PKG_SECTION="service" +PKG_SHORTDESC="Provides the ability to change the kodi audio device if a bluetooth audio device is connected" +PKG_LONGDESC="Provides the ability to change the kodi audio device if a bluetooth audio device is connected" +PKG_AUTORECONF="no" + +PKG_IS_ADDON="yes" +PKG_ADDON_NAME="Bluetooth Audio Device Changer" +PKG_ADDON_TYPE="xbmc.service" + +make_target() { + : +} + +makeinstall_target() { + : +} + +addon() { + : +} diff --git a/packages/addons/service/bluetooth-audio/source/default.py b/packages/addons/service/bluetooth-audio/source/default.py new file mode 100644 index 0000000000..e330adca8b --- /dev/null +++ b/packages/addons/service/bluetooth-audio/source/default.py @@ -0,0 +1,192 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2016-present Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +import dbus +import gobject +import json +import threading +import time +import xbmc +import xbmcaddon + +__addon__ = xbmcaddon.Addon() +__addonid__ = __addon__.getAddonInfo('id') + +gobject.threads_init() + +class KodiFunctions(object): + + def __init__(self): + + self.getjson = { + "jsonrpc": "2.0", + "method": "Settings.GetSettingValue", + "params": { + "setting": "audiooutput.audiodevice", + }, + "id": 1, + } + + self.setjson = { + "jsonrpc": "2.0", + "method": "Settings.SetSettingValue", + "params": { + "setting": "audiooutput.audiodevice", + "value": "", + }, + "id": 1, + } + + if __addon__.getSetting('audiodevice') == '': + self.audiodevice = json.loads(xbmc.executeJSONRPC(json.dumps(self.getjson)))['result']['value'] + __addon__.setSetting('audiodevice', self.audiodevice) + else: + self.audiodevice = __addon__.getSetting('audiodevice') + self.pulsedevice = 'PULSE:Default' + + self.select_default() + + def select_default(self): + + self.setjson['params']['value'] = self.audiodevice + xbmc.executeJSONRPC(json.dumps(self.setjson)) + + def select_pulse(self): + + self.setjson['params']['value'] = self.pulsedevice + xbmc.executeJSONRPC(json.dumps(self.setjson)) + +class BluetoothAudioClient(object): + + def __init__(self): + + xbmc.log('%s: starting add-on' % __addonid__, xbmc.LOGNOTICE) + + self.devices = {} + self.signal_added = None + self.signal_removed = None + + self.kodi = KodiFunctions() + + self._setup_loop() + self._setup_bus() + self._setup_signals() + + def quit(self): + + xbmc.log('%s: stopping add-on' % __addonid__, xbmc.LOGNOTICE) + + self.kodi.select_default() + + self.signal_added.remove() + self.signal_removed.remove() + + self._loop.quit() + + def _setup_loop(self): + + self._loop = gobject.MainLoop() + + self._thread = threading.Thread(target=self._loop.run) + self._thread.start() + + def _setup_bus(self): + + self._bus = dbus.SystemBus() + + def _setup_signals(self): + + self.signal_added = self._bus.add_signal_receiver(handler_function=self.switch_audio, + signal_name='InterfacesAdded', + dbus_interface='org.freedesktop.DBus.ObjectManager', + bus_name='org.bluez', + member_keyword='signal') + + self.signal_removed = self._bus.add_signal_receiver(handler_function=self.switch_audio, + signal_name='InterfacesRemoved', + dbus_interface='org.freedesktop.DBus.ObjectManager', + bus_name='org.bluez', + member_keyword='signal') + + def switch_audio(self, *args, **kwargs): + + device_path = args[0] + + try: + if kwargs['signal'] == 'InterfacesAdded': + + self.devices[device_path] = { + 'Connected': '', + 'Device': '', + 'Class': '', + } + + device = self._bus.get_object('org.bluez', device_path) + device_iface = dbus.Interface(device, dbus.PROPERTIES_IFACE) + self.devices[device_path]['Device'] = device_iface.Get('org.bluez.MediaTransport1', 'Device') + + audio_device_path = self._bus.get_object('org.bluez', self.devices[device_path]['Device']) + audio_device_iface = dbus.Interface(audio_device_path, dbus.PROPERTIES_IFACE) + self.devices[device_path]['Class'] = audio_device_iface.Get('org.bluez.Device1', 'Class') + self.devices[device_path]['Connected'] = audio_device_iface.Get('org.bluez.Device1', 'Connected') + + if self.devices[device_path]['Class'] & (1 << 21): + xbmc.log('%s: bluetooth audio device connected' % __addonid__, xbmc.LOGNOTICE) + xbmc.log('%s: switching to bluetooth audio device' % __addonid__, xbmc.LOGNOTICE) + self.kodi.select_pulse() + + elif kwargs['signal'] == 'InterfacesRemoved': + if self.devices[device_path]['Device'] is not None and self.devices[device_path]['Class'] & (1 << 21): + audio_device_path = self._bus.get_object('org.bluez', self.devices[device_path]['Device']) + audio_device_iface = dbus.Interface(audio_device_path, dbus.PROPERTIES_IFACE) + self.devices[device_path]['Connected'] = audio_device_iface.Get('org.bluez.Device1', 'Connected') + + while self.devices[device_path]['Connected']: + self.devices[device_path]['Connected'] = audio_device_iface.Get('org.bluez.Device1', 'Connected') + time.sleep(0.1) + + xbmc.log('%s: bluetooth audio device disconnected' % __addonid__, xbmc.LOGNOTICE) + xbmc.log('%s: checking for other connected devices' % __addonid__, xbmc.LOGNOTICE) + + for path in self.devices: + if self.devices[path]['Connected'] and self.devices[path]['Class'] & (1 << 21): + xbmc.log('%s: found connected bluetooth audio device' % __addonid__, xbmc.LOGNOTICE) + return + + xbmc.log('%s: switching to default audio device' % __addonid__, xbmc.LOGNOTICE) + self.kodi.select_default() + + except (TypeError, KeyError, dbus.exceptions.DBusException) as e: + xbmc.log('%s: ' % __addonid__ + unicode(e), xbmc.LOGERROR) + +class BluetoothMonitor(xbmc.Monitor): + + def __init__(self, *args, **kwargs): + + xbmc.Monitor.__init__(self) + +if (__name__ == "__main__"): + monitor = BluetoothMonitor() + client = BluetoothAudioClient() + + monitor.waitForAbort() + + client.quit() + + del BluetoothAudioClient + del BluetoothMonitor diff --git a/packages/addons/service/bluetooth-audio/source/resources/language/English/strings.po b/packages/addons/service/bluetooth-audio/source/resources/language/English/strings.po new file mode 100644 index 0000000000..f9c9babc09 --- /dev/null +++ b/packages/addons/service/bluetooth-audio/source/resources/language/English/strings.po @@ -0,0 +1,11 @@ +# Kodi Media Center language file +# Addon Name: bluetooth-audio +# Addon id: service.bluetooth-audio + +msgctxt "#30000" +msgid "Settings" +msgstr "" + +msgctxt "#30001" +msgid "Audio Device" +msgstr "" diff --git a/packages/addons/service/bluetooth-audio/source/resources/settings.xml b/packages/addons/service/bluetooth-audio/source/resources/settings.xml new file mode 100644 index 0000000000..90a80bfae8 --- /dev/null +++ b/packages/addons/service/bluetooth-audio/source/resources/settings.xml @@ -0,0 +1,7 @@ + + + + + + +