docs: public synchronized void start() throws Exception {
          if (!isRunning()) {
              ConnectionManager.getInstance().addLifecycleListener(lifecycleListener);
              ConnectionManager.getInstance().start();
              DeviceFinder.getInstance().addDeviceAnnouncementListener(announcementListener);
              MetadataFinder.getInstance().addLifecycleListener(lifecycleListener);
              MetadataFinder.getInstance().start();
              MetadataFinder.getInstance().addTrackMetadataListener(metadataListener);
              MetadataFinder.getInstance().addMountListener(mountListener);
              queueHandler = new Thread(new Runnable() {
                  @Override
                  public void run() {
                      while (isRunning()) {
                          try {
                              handleUpdate(pendingUpdates.take());
                          } catch (InterruptedException e) {
                              // Interrupted due to MetadataFinder shutdown, presumably
                          }
                      }
                  }
              });
              running.set(true);
              queueHandler.start();
              deliverLifecycleAnnouncement(logger, true);
  
              // Send ourselves "updates" about any tracks that were loaded before we started, since we missed those.
              for (Map.Entry<DeckReference, TrackMetadata> entry : MetadataFinder.getInstance().getLoadedTracks().entrySet()) {
                  if (entry.getKey().hotCue == 0) {  // The track is currently loaded in a main player deck
                      handleUpdate(new TrackMetadataUpdate(entry.getKey().player, entry.getValue()));
                  }
              }
          }
      }