diff --git a/AbletonOSC/__init__.py b/AbletonOSC/__init__.py index 4d64c26..b61f0ad 100644 --- a/AbletonOSC/__init__.py +++ b/AbletonOSC/__init__.py @@ -1,9 +1,4 @@ -""" -AbletonOSC — full Ableton Live 11 OSC remote script. -Ableton calls create_instance() to instantiate the control surface. -""" -from .manager import Manager - - -def create_instance(c_instance): - return Manager(c_instance) +try: + from .manager import Manager +except ImportError: + pass diff --git a/AbletonOSC/manager.py b/AbletonOSC/manager.py index d6d78c2..52ac68b 100644 --- a/AbletonOSC/manager.py +++ b/AbletonOSC/manager.py @@ -9,7 +9,8 @@ import sys try: from ableton.v2.control_surface import ControlSurface except ImportError: - # Allow importing outside of Ableton for tooling + from contextlib import contextmanager + class ControlSurface: # type: ignore def __init__(self, c_instance=None): self._c_instance = c_instance @@ -29,6 +30,16 @@ except ImportError: def log_message(self, msg): print(msg) + def show_message(self, msg): + print(msg) + + def schedule_message(self, delay, callback): + pass + + @contextmanager + def component_guard(self): + yield + from .osc_server import OSCServer from .song import SongHandler from .track import TrackHandler @@ -52,12 +63,17 @@ class Manager(ControlSurface): def __init__(self, c_instance=None): super().__init__(c_instance) self._setup_logging() - self.osc_server = OSCServer(listen_port=LISTEN_PORT, send_port=SEND_PORT) self._handlers = [] - self._setup_handlers() - self.osc_server.start() - logger.info("AbletonOSC started (listen=%d, send=%d)", LISTEN_PORT, SEND_PORT) - self.osc_server.send("/live/startup", ()) + try: + self.osc_server = OSCServer(listen_port=LISTEN_PORT, send_port=SEND_PORT) + self.osc_server.start() + self._setup_handlers() + self.show_message("AbletonOSC: Listening on port %d" % LISTEN_PORT) + logger.info("AbletonOSC started (listen=%d, send=%d)", LISTEN_PORT, SEND_PORT) + self.osc_server.send("/live/startup", ()) + except OSError as e: + self.show_message("AbletonOSC: Couldn't bind to port %d (%s)" % (LISTEN_PORT, e)) + logger.error("Couldn't bind to port %d: %s", LISTEN_PORT, e) # ------------------------------------------------------------------ @@ -81,10 +97,11 @@ class Manager(ControlSurface): BrowserHandler, GrooveHandler, ] - for cls in handler_classes: - h = cls(self) - h.init_api() - self._handlers.append(h) + with self.component_guard(): + for cls in handler_classes: + h = cls(self) + h.init_api() + self._handlers.append(h) # Control endpoints self.osc_server.add_handler("/live/test", self._handle_test) diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..189a27a --- /dev/null +++ b/__init__.py @@ -0,0 +1,9 @@ +try: + from .AbletonOSC.manager import Manager +except ImportError: + # Allows pytest to import without Ableton's runtime present + pass + + +def create_instance(c_instance): + return Manager(c_instance)