Start adding idle to frontend, mpd-session and dispatcher

This commit is contained in:
Thomas Adamcik 2011-07-19 03:44:34 +02:00
parent 4f124480c3
commit 8ae0381cd8
3 changed files with 31 additions and 4 deletions

View File

@ -1,15 +1,15 @@
import logging
import sys
from pykka.actor import ThreadingActor
from pykka import registry, actor
from mopidy import settings
from mopidy import listeners, settings
from mopidy.frontends.mpd import dispatcher, protocol
from mopidy.utils import network, process, log
logger = logging.getLogger('mopidy.frontends.mpd')
class MpdFrontend(ThreadingActor):
class MpdFrontend(actor.ThreadingActor, listeners.BackendListener):
"""
The MPD frontend.
@ -39,6 +39,25 @@ class MpdFrontend(ThreadingActor):
def on_stop(self):
process.stop_actors_by_class(MpdSession)
def send_idle(self, subsystem):
# FIXME this should be updated once pykka supports non-blocking calls
# on proxies or some similar solution
registry.ActorRegistry.broadcast({
'command': 'pykka_call',
'attr_path': ('on_idle',),
'args': [subsystem],
'kwargs': {},
}, target_class=MpdSession)
def playback_state_changed(self):
self.send_idle('player')
def playlist_changed(self):
self.send_idle('playlist')
def options_changed(self):
self.send_idle('options')
class MpdSession(network.LineProtocol):
"""
@ -70,5 +89,8 @@ class MpdSession(network.LineProtocol):
self.send_lines(response)
def on_idle(self, subsystem):
self.dispatcher.handle_idle(subsystem)
def close(self):
self.stop()

View File

@ -47,6 +47,9 @@ class MpdDispatcher(object):
]
return self._call_next_filter(request, response, filter_chain)
def handle_idle(self, subsystem):
logger.debug(u'Got idle event for %s', subsystem)
def _call_next_filter(self, request, response, filter_chain):
if filter_chain:
next_filter = filter_chain.pop(0)

View File

@ -14,11 +14,13 @@ class BackendListener(object):
@staticmethod
def send(event, **kwargs):
"""Helper to allow calling of backend listener events"""
# FIXME this should be updated once pykka supports non-blocking calls
# on proxies or some similar solution
registry.ActorRegistry.broadcast({
'command': 'pykka_call',
'attr_path': (event,),
'args': [],
'kwargs': kwargs
'kwargs': kwargs,
}, target_class=BackendListener)
def track_playback_started(self, track):