OSDN Git Service

hciattach_rtk: fix cast-align errors
[android-x86/external-bluetooth-bluez.git] / test / simple-player
1 #!/usr/bin/python
2
3 from __future__ import print_function
4
5 import os
6 import sys
7 import dbus
8 import dbus.service
9 import dbus.mainloop.glib
10 try:
11   from gi.repository import GObject
12 except ImportError:
13   import gobject as GObject
14 import bluezutils
15
16 class Player(dbus.service.Object):
17         properties = None
18         metadata = None
19
20         def set_object(self, obj = None):
21                 if obj != None:
22                         bus = dbus.SystemBus()
23                         mp = dbus.Interface(bus.get_object("org.bluez", obj),
24                                                 "org.bluez.MediaPlayer1")
25                         prop = dbus.Interface(bus.get_object("org.bluez", obj),
26                                                 "org.freedesktop.DBus.Properties")
27
28                         self.properties = prop.GetAll("org.bluez.MediaPlayer1")
29
30                         bus.add_signal_receiver(self.properties_changed,
31                                 path = obj,
32                                 dbus_interface = "org.freedesktop.DBus.Properties",
33                                 signal_name = "PropertiesChanged")
34                 else:
35                         track = dbus.Dictionary({
36                                         "xesam:title" : "Title",
37                                         "xesam:artist" : ["Artist"],
38                                         "xesam:album" : "Album",
39                                         "xesam:genre" : ["Genre"],
40                                         "xesam:trackNumber" : dbus.Int32(1),
41                                         "mpris:length" : dbus.Int64(10000) },
42                                         signature="sv")
43
44                         self.properties = dbus.Dictionary({
45                                         "PlaybackStatus" : "playing",
46                                         "Identity" : "SimplePlayer",
47                                         "LoopStatus" : "None",
48                                         "Rate" : dbus.Double(1.0),
49                                         "Shuffle" : dbus.Boolean(False),
50                                         "Metadata" : track,
51                                         "Volume" : dbus.Double(1.0),
52                                         "Position" : dbus.Int64(0),
53                                         "MinimumRate" : dbus.Double(1.0),
54                                         "MaximumRate" : dbus.Double(1.0),
55                                         "CanGoNext" : dbus.Boolean(False),
56                                         "CanGoPrevious" : dbus.Boolean(False),
57                                         "CanPlay" : dbus.Boolean(False),
58                                         "CanSeek" : dbus.Boolean(False),
59                                         "CanControl" : dbus.Boolean(False),
60                                         },
61                                         signature="sv")
62
63                         handler = InputHandler(self)
64                         GObject.io_add_watch(sys.stdin, GObject.IO_IN,
65                                                         handler.handle)
66
67         @dbus.service.method("org.freedesktop.DBus.Properties",
68                                         in_signature="ssv", out_signature="")
69         def Set(self, interface, key, value):
70                 print("Set (%s, %s)" % (key, value), file=sys.stderr)
71                 return
72
73         @dbus.service.signal("org.freedesktop.DBus.Properties",
74                                                         signature="sa{sv}as")
75         def PropertiesChanged(self, interface, properties,
76                                                 invalidated = dbus.Array()):
77                 """PropertiesChanged(interface, properties, invalidated)
78
79                 Send a PropertiesChanged signal. 'properties' is a dictionary
80                 containing string parameters as specified in doc/media-api.txt.
81                 """
82                 pass
83
84         def help(self, func):
85                 help(self.__class__.__dict__[func])
86
87         def properties_changed(self, interface, properties, invalidated):
88                 print("properties_changed(%s, %s)" % (properties, invalidated))
89
90                 self.PropertiesChanged(interface, properties, invalidated)
91
92 class InputHandler:
93         commands = { 'PropertiesChanged': '(interface, properties)',
94                         'help': '(cmd)' }
95         def __init__(self, player):
96                 self.player = player
97                 print('\n\nAvailable commands:')
98                 for cmd in self.commands:
99                         print('\t', cmd, self.commands[cmd], sep='')
100
101                 print("\nUse python syntax to pass arguments to available methods.\n" \
102                 "E.g.: PropertiesChanged({'Metadata' : {'Title': 'My title', \
103                 'Album': 'my album' }})")
104                 self.prompt()
105
106         def prompt(self):
107                 print('\n>>> ', end='')
108                 sys.stdout.flush()
109
110         def handle(self, fd, condition):
111                 s = os.read(fd.fileno(), 1024).strip()
112                 try:
113                         cmd = s[:s.find('(')]
114                         if not cmd in self.commands:
115                                 print("Unknown command ", cmd)
116                 except ValueError:
117                         print("Malformed command")
118                         return True
119
120                 try:
121                         exec "self.player.%s" % s
122                 except Exception as e:
123                         print(e)
124                         pass
125                 self.prompt()
126                 return True
127
128
129 if __name__ == '__main__':
130         dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
131
132         bus = dbus.SystemBus()
133
134         if len(sys.argv) > 1:
135                 path = bluezutils.find_adapter(sys.argv[1]).object_path
136         else:
137                 path = bluezutils.find_adapter().object_path
138
139         media = dbus.Interface(bus.get_object("org.bluez", path),
140                                                 "org.bluez.Media1")
141
142         path = "/test/player"
143         player = Player(bus, path)
144         mainloop = GObject.MainLoop()
145
146         if len(sys.argv) > 2:
147                 player.set_object(sys.argv[2])
148         else:
149                 player.set_object()
150
151         print('Register media player with:\n\tProperties: %s' \
152                                                 % (player.properties))
153
154         media.RegisterPlayer(dbus.ObjectPath(path), player.properties)
155
156         mainloop.run()