diff --git a/mopidy/core.py b/mopidy/core.py index 51a0b737..c687aed1 100644 --- a/mopidy/core.py +++ b/mopidy/core.py @@ -64,8 +64,7 @@ def setup_frontends(): frontends = [] for frontend_class_name in settings.FRONTENDS: try: - frontend = get_class(frontend_class_name)() - frontend.start() + frontend = get_class(frontend_class_name).start_proxy() frontends.append(frontend) except OptionalDependencyError as e: logger.info(u'Disabled: %s (%s)', frontend_class_name, e) diff --git a/mopidy/frontends/mpd/__init__.py b/mopidy/frontends/mpd/__init__.py index 2f87088c..b3d5b5e8 100644 --- a/mopidy/frontends/mpd/__init__.py +++ b/mopidy/frontends/mpd/__init__.py @@ -1,13 +1,15 @@ +import asyncore import logging +from pykka.actor import ThreadingActor + from mopidy.frontends.base import BaseFrontend -from mopidy.frontends.mpd.dispatcher import MpdDispatcher -from mopidy.frontends.mpd.thread import MpdThread -from mopidy.utils.process import unpickle_connection +from mopidy.frontends.mpd.server import MpdServer +from mopidy.utils.process import BaseThread logger = logging.getLogger('mopidy.frontends.mpd') -class MpdFrontend(BaseFrontend): +class MpdFrontend(ThreadingActor, BaseFrontend): """ The MPD frontend. @@ -18,32 +20,23 @@ class MpdFrontend(BaseFrontend): - :attr:`mopidy.settings.MPD_SERVER_PORT` """ - def __init__(self, *args, **kwargs): - super(MpdFrontend, self).__init__(*args, **kwargs) - self.thread = None - self.dispatcher = MpdDispatcher(self.backend) - - def start(self): - """Starts the MPD server.""" - self.thread = MpdThread(self.core_queue) - self.thread.start() + def __init__(self): + # XXX Do setup after actor starts? + self._thread = MpdThread() + self._thread.start() def destroy(self): """Destroys the MPD server.""" - self.thread.destroy() + self._thread.destroy() - def process_message(self, message): - """ - Processes messages with the MPD frontend as destination. - :param message: the message - :type message: dict - """ - 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: - pass # Ignore messages for other frontends +class MpdThread(BaseThread): + def __init__(self): + super(BaseThread, self).__init__() + self.name = u'MpdThread' + + def run_inside_try(self): + logger.debug(u'Starting MPD server thread') + server = MpdServer(self.core_queue) + server.start() + asyncore.loop() diff --git a/mopidy/frontends/mpd/session.py b/mopidy/frontends/mpd/session.py index e8e3291d..349fceb9 100644 --- a/mopidy/frontends/mpd/session.py +++ b/mopidy/frontends/mpd/session.py @@ -5,7 +5,6 @@ import multiprocessing from mopidy import settings from mopidy.frontends.mpd.protocol import ENCODING, LINE_TERMINATOR, VERSION from mopidy.utils.log import indent -from mopidy.utils.process import pickle_connection logger = logging.getLogger('mopidy.frontends.mpd.session') @@ -53,15 +52,7 @@ class MpdSession(asynchat.async_chat): if response is not None: self.send_response(response) return - my_end, other_end = multiprocessing.Pipe() - self.core_queue.put({ - 'to': 'frontend', - 'command': 'mpd_request', - 'request': request, - 'reply_to': pickle_connection(other_end), - }) - my_end.poll(None) - response = my_end.recv() + # TODO-PYKKA: Process request using MpdDispatcher/backend if response is not None: self.handle_response(response) diff --git a/mopidy/frontends/mpd/thread.py b/mopidy/frontends/mpd/thread.py deleted file mode 100644 index 0ad5ee68..00000000 --- a/mopidy/frontends/mpd/thread.py +++ /dev/null @@ -1,18 +0,0 @@ -import asyncore -import logging - -from mopidy.frontends.mpd.server import MpdServer -from mopidy.utils.process import BaseThread - -logger = logging.getLogger('mopidy.frontends.mpd.thread') - -class MpdThread(BaseThread): - def __init__(self, core_queue): - super(MpdThread, self).__init__(core_queue) - self.name = u'MpdThread' - - def run_inside_try(self): - logger.debug(u'Starting MPD server thread') - server = MpdServer(self.core_queue) - server.start() - asyncore.loop()