Audio: keep the popup updated on new/deleted mpris2 clients

This commit is contained in:
Davide Andreoli 2014-08-31 10:13:51 +02:00
parent fd5637b089
commit 192fa721fd
1 changed files with 41 additions and 15 deletions

View File

@ -100,7 +100,7 @@ class Gadget(e.Gadget):
if obj is None: break
# remove the obj from our lists
for name, objs in self.player_objs.items():
for player, objs in self.player_objs.items():
while obj in objs: objs.remove(obj)
# delete the cover image
@ -137,6 +137,21 @@ class Gadget(e.Gadget):
for o in self.player_objs.get(player, []):
self.player_update(o, player)
def player_added(self, player):
for popup in self._popups:
self.popup_player_add(popup, player)
def player_removed(self, player):
if player in self.player_objs:
for o in self.player_objs[player]:
# delete the cover image
cover = o.part_swallow_get('cover.swallow')
if cover: cover.delete()
# delete the edje object
o.delete()
# remove the player from our list
del self.player_objs[player]
def player_update(self, obj, player):
# player name
obj.part_text_set('player_name', player.label or player.name)
@ -241,36 +256,47 @@ class Mpris2_Client(object):
self.players = []
self.bus = dbus.SessionBus(mainloop=DBusEcoreMainLoop())
# update the players list
self.update_players_list()
# build the list of players
for name in self.bus.list_names():
if name.startswith(self.BASE_PATH):
self.player_add(name)
# and keep the list updated when names changes
self.sig1 = self.bus.add_signal_receiver(self.name_owner_changed_cb,
"NameOwnerChanged")
self.bus.add_signal_receiver(self.name_owner_changed_cb,
"NameOwnerChanged")
def name_owner_changed_cb(self, name, old_owner, new_owner):
if name.startswith(self.BASE_PATH):
self.update_players_list()
if new_owner:
self.player_add(name)
else:
self.player_del(name)
def update_players_list(self):
names = [ n for n in self.bus.list_names() if n.startswith(self.BASE_PATH) ]
del self.players[:]
for name in names:
self.players.append(Mpris2_Player(self.bus, name[len(self.BASE_PATH):]))
def player_add(self, obj_path):
player = Mpris2_Player(self.bus, obj_path)
self.players.append(player)
_instance.player_added(player)
def player_del(self, obj_path):
for player in self.players:
if player.obj_path == obj_path:
self.players.remove(player)
_instance.player_removed(player)
del player
break
class Mpris2_Player(object):
MAIN_IFACE = 'org.mpris.MediaPlayer2'
PLAYER_IFACE = 'org.mpris.MediaPlayer2.Player'
def __init__(self, bus, name):
self.name = name
def __init__(self, bus, obj_path):
self.obj_path = obj_path
self.label = None
self.metadata = None # metadata dict as per mpris2 specs
self.playback_status = 'Stopped' # or 'Playing' or 'Paused'
self.volume = 0.0 # range: 0.0 - 1.0
self.proxy = bus.get_object('org.mpris.MediaPlayer2.%s' % name,
'/org/mpris/MediaPlayer2')
self.proxy = bus.get_object(self.obj_path, '/org/mpris/MediaPlayer2')
# self.prop_iface.GetAll(...)
self.prop_iface = dbus.Interface(self.proxy, dbus_interface=dbus.PROPERTIES_IFACE)