1 #!/usr/bin/python 2 3 import sys 4 import dbus 5 import dbus.service 6 import dbus.mainloop.glib 7 import gobject 8 9 A2DP_SOURCE_UUID = "0000110A-0000-1000-8000-00805F9B34FB" 10 A2DP_SINK_UUID = "0000110B-0000-1000-8000-00805F9B34FB" 11 HFP_AG_UUID = "0000111F-0000-1000-8000-00805F9B34FB" 12 HSP_AG_UUID = "00001112-0000-1000-8000-00805F9B34FB" 13 14 SBC_CODEC = dbus.Byte(0x00) 15 #Channel Modes: Mono DualChannel Stereo JointStereo 16 #Frequencies: 16Khz 32Khz 44.1Khz 48Khz 17 #Subbands: 4 8 18 #Blocks: 4 8 12 16 19 #Bitpool Range: 2-64 20 SBC_CAPABILITIES = dbus.Array([dbus.Byte(0xff), dbus.Byte(0xff), dbus.Byte(2), dbus.Byte(64)]) 21 # JointStereo 44.1Khz Subbands: Blocks: 16 Bitpool Range: 2-32 22 SBC_CONFIGURATION = dbus.Array([dbus.Byte(0x21), dbus.Byte(0x15), dbus.Byte(2), dbus.Byte(32)]) 23 24 MP3_CODEC = dbus.Byte(0x01) 25 #Channel Modes: Mono DualChannel Stereo JointStereo 26 #Frequencies: 32Khz 44.1Khz 48Khz 27 #CRC: YES 28 #Layer: 3 29 #Bit Rate: All except Free format 30 #VBR: Yes 31 #Payload Format: RFC-2250 32 MP3_CAPABILITIES = dbus.Array([dbus.Byte(0x3f), dbus.Byte(0x07), dbus.Byte(0xff), dbus.Byte(0xfe)]) 33 # JointStereo 44.1Khz Layer: 3 Bit Rate: VBR Format: RFC-2250 34 MP3_CONFIGURATION = dbus.Array([dbus.Byte(0x21), dbus.Byte(0x02), dbus.Byte(0x00), dbus.Byte(0x80)]) 35 36 PCM_CODEC = dbus.Byte(0x00) 37 PCM_CONFIGURATION = dbus.Array([], signature="ay") 38 39 class Rejected(dbus.DBusException): 40 _dbus_error_name = "org.bluez.Error.Rejected" 41 42 class Endpoint(dbus.service.Object): 43 exit_on_release = True 44 configuration = SBC_CONFIGURATION 45 46 def set_exit_on_release(self, exit_on_release): 47 self.exit_on_release = exit_on_release 48 49 def default_configuration(self, configuration): 50 self.configuration = configuration 51 52 @dbus.service.method("org.bluez.MediaEndpoint", 53 in_signature="", out_signature="") 54 def Release(self): 55 print "Release" 56 if self.exit_on_release: 57 mainloop.quit() 58 59 @dbus.service.method("org.bluez.MediaEndpoint", 60 in_signature="", out_signature="") 61 def ClearConfiguration(self): 62 print "ClearConfiguration" 63 64 @dbus.service.method("org.bluez.MediaEndpoint", 65 in_signature="oay", out_signature="") 66 def SetConfiguration(self, transport, config): 67 print "SetConfiguration (%s, %s)" % (transport, config) 68 return 69 70 @dbus.service.method("org.bluez.MediaEndpoint", 71 in_signature="ay", out_signature="ay") 72 def SelectConfiguration(self, caps): 73 print "SelectConfiguration (%s)" % (caps) 74 return self.configuration 75 76 if __name__ == '__main__': 77 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 78 79 bus = dbus.SystemBus() 80 manager = dbus.Interface(bus.get_object("org.bluez", "/"), 81 "org.bluez.Manager") 82 83 if len(sys.argv) > 1: 84 path = manager.FindAdapter(sys.argv[1]) 85 else: 86 path = manager.DefaultAdapter() 87 88 media = dbus.Interface(bus.get_object("org.bluez", path), 89 "org.bluez.Media") 90 91 path = "/test/endpoint" 92 endpoint = Endpoint(bus, path) 93 mainloop = gobject.MainLoop() 94 95 properties = dbus.Dictionary({ "UUID" : A2DP_SOURCE_UUID, 96 "Codec" : SBC_CODEC, 97 "DelayReporting" : True, 98 "Capabilities" : SBC_CAPABILITIES }) 99 100 if len(sys.argv) > 2: 101 if sys.argv[2] == "sbcsink": 102 properties = dbus.Dictionary({ "UUID" : A2DP_SINK_UUID, 103 "Codec" : SBC_CODEC, 104 "DelayReporting" : True, 105 "Capabilities" : SBC_CAPABILITIES }) 106 if sys.argv[2] == "mp3source": 107 properties = dbus.Dictionary({ "UUID" : A2DP_SOURCE_UUID, 108 "Codec" : MP3_CODEC, 109 "Capabilities" : MP3_CAPABILITIES }) 110 endpoint.default_configuration(MP3_CONFIGURATION) 111 if sys.argv[2] == "mp3sink": 112 properties = dbus.Dictionary({ "UUID" : A2DP_SINK_UUID, 113 "Codec" : MP3_CODEC, 114 "Capabilities" : MP3_CAPABILITIES }) 115 endpoint.default_configuration(MP3_CONFIGURATION) 116 if sys.argv[2] == "hfpag" or sys.argv[2] == "hspag": 117 properties = dbus.Dictionary({ "UUID" : HFP_AG_UUID, 118 "Codec" : PCM_CODEC, 119 "Capabilities" : PCM_CONFIGURATION }) 120 endpoint.default_configuration(dbus.Array([])) 121 122 print properties 123 124 media.RegisterEndpoint(path, properties) 125 126 mainloop.run() 127