• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/python
2
3import sys
4import dbus
5import dbus.service
6import dbus.mainloop.glib
7import gobject
8
9A2DP_SOURCE_UUID = "0000110A-0000-1000-8000-00805F9B34FB"
10A2DP_SINK_UUID = "0000110B-0000-1000-8000-00805F9B34FB"
11HFP_AG_UUID = "0000111F-0000-1000-8000-00805F9B34FB"
12HSP_AG_UUID = "00001112-0000-1000-8000-00805F9B34FB"
13
14SBC_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
20SBC_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
22SBC_CONFIGURATION = dbus.Array([dbus.Byte(0x21), dbus.Byte(0x15), dbus.Byte(2), dbus.Byte(32)])
23
24MP3_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
32MP3_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
34MP3_CONFIGURATION = dbus.Array([dbus.Byte(0x21), dbus.Byte(0x02), dbus.Byte(0x00), dbus.Byte(0x80)])
35
36PCM_CODEC = dbus.Byte(0x00)
37PCM_CONFIGURATION = dbus.Array([], signature="ay")
38
39class Rejected(dbus.DBusException):
40	_dbus_error_name = "org.bluez.Error.Rejected"
41
42class 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
76if __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