docs: @SuppressWarnings("UnusedReturnValue")
      public synchronized boolean start() throws SocketException {
          if (!isRunning()) {
              // Set up so we know we have to shut down if the DeviceFinder shuts down.
              DeviceFinder.getInstance().addLifecycleListener(deviceFinderLifecycleListener);
  
              // Find some DJ Link devices so we can figure out the interface and address to use to talk to them
              DeviceFinder.getInstance().start();
              for (int i = 0; DeviceFinder.getInstance().getCurrentDevices().isEmpty() && i < 20; i++) {
                  try {
                      Thread.sleep(500);
                  } catch (InterruptedException e) {
                      logger.warn("Interrupted waiting for devices, giving up", e);
                      return false;
                  }
              }
  
              if (DeviceFinder.getInstance().getCurrentDevices().isEmpty()) {
                  logger.warn("No DJ Link devices found, giving up");
                  return false;
              }
  
              return createVirtualCdj();
          }
          return true;  // We were already active
      }