mirror of
				https://github.com/libretro/Lakka-LibreELEC.git
				synced 2025-11-03 23:48:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/python3
 | 
						|
# SPDX-License-Identifier: GPL-2.0
 | 
						|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
 | 
						|
 | 
						|
import sys
 | 
						|
import time
 | 
						|
 | 
						|
import asyncio
 | 
						|
import ravel
 | 
						|
 | 
						|
class BluetoothAudioClient(object):
 | 
						|
 | 
						|
  def __init__(self):
 | 
						|
 | 
						|
    self.devices = {}
 | 
						|
    self.signal_added = None
 | 
						|
    self.signal_removed = None
 | 
						|
 | 
						|
    self._setup_loop()
 | 
						|
 | 
						|
  def _setup_loop(self):
 | 
						|
 | 
						|
    self._loop = asyncio.new_event_loop()
 | 
						|
 | 
						|
    self.bus = ravel.system_bus()
 | 
						|
    self.bus.attach_asyncio(self._loop)
 | 
						|
    self.bus.listen_objects_added(self.object_added)
 | 
						|
    self.bus.listen_objects_removed(self.object_removed)
 | 
						|
 | 
						|
  def run(self):
 | 
						|
    self._loop.run_forever()
 | 
						|
 | 
						|
  @ravel.signal(name = "InterfacesAdded", in_signature = "oa{sa{sv}}",
 | 
						|
                arg_keys = ("device_path", "args"))
 | 
						|
  def object_added(self, device_path, args) :
 | 
						|
    if 'org.bluez.MediaTransport1' in args:
 | 
						|
      self.devices[device_path] = {
 | 
						|
        'Connected': '',
 | 
						|
        'Device': str(args['org.bluez.MediaTransport1']['Device'][1]),
 | 
						|
        'Class': '',
 | 
						|
      }
 | 
						|
 | 
						|
      audio_device_iface = self.bus['org.bluez'][self.devices[device_path]['Device']].get_interface('org.bluez.Device1')
 | 
						|
      self.devices[device_path]['Class'] = audio_device_iface.Class
 | 
						|
      self.devices[device_path]['Connected'] = audio_device_iface.Connected
 | 
						|
 | 
						|
      if self.devices[device_path]['Class'] & (1 << 21):
 | 
						|
        print('bluetooth')
 | 
						|
        sys.stdout.flush()
 | 
						|
 | 
						|
  @ravel.signal(name = "InterfacesRemoved", in_signature = "oas",
 | 
						|
                arg_keys = ("device_path", "args"))
 | 
						|
  def object_removed(self, device_path, args) :
 | 
						|
    if device_path in self.devices and self.devices[device_path]['Class'] & (1 << 21):
 | 
						|
      audio_device_iface = self.bus['org.bluez'][self.devices[device_path]['Device']].get_interface('org.bluez.Device1')
 | 
						|
      self.devices[device_path]['Connected'] = audio_device_iface.Connected
 | 
						|
 | 
						|
      while self.devices[device_path]['Connected']:
 | 
						|
        self.devices[device_path]['Connected'] = audio_device_iface.Connected
 | 
						|
        time.sleep(0.1)
 | 
						|
 | 
						|
      for path in self.devices:
 | 
						|
        if self.devices[path]['Connected'] and self.devices[path]['Class'] & (1 << 21):
 | 
						|
          return
 | 
						|
 | 
						|
      print('default')
 | 
						|
      sys.stdout.flush()
 | 
						|
 | 
						|
 | 
						|
client = BluetoothAudioClient()
 | 
						|
 | 
						|
client.run()
 | 
						|
 | 
						|
del BluetoothAudioClient
 |