diff --git a/mopidy/core.py b/mopidy/core.py index 3296fa6b..260c8f8c 100644 --- a/mopidy/core.py +++ b/mopidy/core.py @@ -6,7 +6,7 @@ from mopidy import get_version, settings from mopidy.utils import get_class from mopidy.utils.log import setup_logging from mopidy.utils.path import get_or_create_folder, get_or_create_file -from mopidy.utils.process import BaseProcess, unpickle_connection +from mopidy.utils.process import BaseProcess from mopidy.utils.settings import list_settings_optparse_callback logger = logging.getLogger('mopidy.core') @@ -67,19 +67,15 @@ class CoreProcess(BaseProcess): return get_class(settings.BACKENDS[0])(core_queue, output_queue) def setup_frontend(self, core_queue, backend): - frontend = get_class(settings.FRONTENDS[0])() - frontend.start_server(core_queue) - frontend.create_dispatcher(backend) + frontend = get_class(settings.FRONTENDS[0])(core_queue, backend) + frontend.start() return frontend def process_message(self, message): if message.get('to') == 'output': self.output_queue.put(message) - elif message['command'] == 'mpd_request': - response = self.frontend.dispatcher.handle_request( - message['request']) - connection = unpickle_connection(message['reply_to']) - connection.send(response) + elif message.get('to') == 'frontend': + self.frontend.process_message(message) elif message['command'] == 'end_of_track': self.backend.playback.on_end_of_track() elif message['command'] == 'stop_playback': diff --git a/mopidy/frontends/mpd/__init__.py b/mopidy/frontends/mpd/__init__.py index 6c06279f..8e7d65ab 100644 --- a/mopidy/frontends/mpd/__init__.py +++ b/mopidy/frontends/mpd/__init__.py @@ -1,5 +1,10 @@ +import logging + from mopidy.frontends.mpd.dispatcher import MpdDispatcher from mopidy.frontends.mpd.process import MpdProcess +from mopidy.utils.process import unpickle_connection + +logger = logging.getLogger('mopidy.frontends.mpd') class MpdFrontend(object): """ @@ -11,27 +16,28 @@ class MpdFrontend(object): - :attr:`mopidy.settings.MPD_SERVER_PORT` """ - def __init__(self): + def __init__(self, core_queue, backend): + self.core_queue = core_queue self.process = None - self.dispatcher = None + self.dispatcher = MpdDispatcher(backend) - def start_server(self, core_queue): - """ - Starts the MPD server. - - :param core_queue: the core queue - :type core_queue: :class:`multiprocessing.Queue` - """ - self.process = MpdProcess(core_queue) + def start(self): + """Starts the MPD server.""" + self.process = MpdProcess(self.core_queue) self.process.start() - def create_dispatcher(self, backend): + def process_message(self, message): """ - Creates a dispatcher for MPD requests. + Processes messages with the MPD frontend as destination. - :param backend: the backend - :type backend: :class:`mopidy.backends.base.BaseBackend` - :rtype: :class:`mopidy.frontends.mpd.dispatcher.MpdDispatcher` + :param message: the message + :type message: dict """ - self.dispatcher = MpdDispatcher(backend) - return self.dispatcher + assert message['to'] == 'frontend', \ + u'Message recipient must be "frontend".' + if message['command'] == 'mpd_request': + response = self.dispatcher.handle_request(message['request']) + connection = unpickle_connection(message['reply_to']) + connection.send(response) + else: + logger.warning(u'Cannot handle message: %s', message) diff --git a/mopidy/frontends/mpd/session.py b/mopidy/frontends/mpd/session.py index 72a1f845..580b5905 100644 --- a/mopidy/frontends/mpd/session.py +++ b/mopidy/frontends/mpd/session.py @@ -48,6 +48,7 @@ class MpdSession(asynchat.async_chat): """Handle request by sending it to the MPD frontend.""" my_end, other_end = multiprocessing.Pipe() self.core_queue.put({ + 'to': 'frontend', 'command': 'mpd_request', 'request': request, 'reply_to': pickle_connection(other_end),