1+ import asyncio
12import logging
3+ import threading
24from typing import Any
35
46import pykka
@@ -37,7 +39,11 @@ def __init__(self, config: types.Config, core: CoreProxy) -> None:
3739 self .zeroconf_service = None
3840
3941 self .uri_map = uri_mapper .MpdUriMapper (core )
42+ self .loop = asyncio .new_event_loop ()
43+ asyncio .set_event_loop (self .loop )
44+
4045 self .server = self ._setup_server (config , core )
46+ self .server_thread = threading .Thread (target = self ._run_server )
4147
4248 def _setup_server (self , config : types .Config , core : CoreProxy ) -> network .Server :
4349 try :
@@ -54,11 +60,16 @@ def _setup_server(self, config: types.Config, core: CoreProxy) -> network.Server
5460 except OSError as exc :
5561 raise exceptions .FrontendError (f"MPD server startup failed: { exc } " ) from exc
5662
57- logger .info (f "MPD server running at { network .format_address (server .address )} " )
63+ logger .info ("MPD server running at %s" , network .format_address (server .address ))
5864
5965 return server
6066
67+ def _run_server (self ) -> None :
68+ self .loop .run_until_complete (self .server .run ())
69+
6170 def on_start (self ) -> None :
71+ self .server_thread .start ()
72+
6273 if self .zeroconf_name and not network .is_unix_socket (self .server .server_socket ):
6374 self .zeroconf_service = zeroconf .Zeroconf (
6475 name = self .zeroconf_name , stype = "_mpd._tcp" , port = self .port
@@ -73,7 +84,13 @@ def on_stop(self) -> None:
7384 for session_actor in session_actors :
7485 session_actor .stop ()
7586
76- self .server .stop ()
87+ if not self .server_thread .is_alive ():
88+ logger .warning ("MPD server already stopped" )
89+ return
90+
91+ self .loop .call_soon_threadsafe (self .server .stop )
92+ logger .debug ("Waiting for MPD server thread to terminate" )
93+ self .server_thread .join ()
7794
7895 def on_event (self , event : str , ** kwargs : Any ) -> None :
7996 if event not in _CORE_EVENTS_TO_IDLE_SUBSYSTEMS :
0 commit comments