code: public synchronized void start() throws Exception {
          if (!isRunning()) {
              DeviceFinder.getInstance().addDeviceAnnouncementListener(announcementListener);
              BeatGridFinder.getInstance().addLifecycleListener(lifecycleListener);
              BeatGridFinder.getInstance().start();
              VirtualCdj.getInstance().addUpdateListener(updateListener);
              VirtualCdj.getInstance().addLifecycleListener(lifecycleListener);
              VirtualCdj.getInstance().start();
              BeatFinder.getInstance().addLifecycleListener(lifecycleListener);
              BeatFinder.getInstance().addBeatListener(beatListener);
              BeatFinder.getInstance().start();
              running.set(true);
              deliverLifecycleAnnouncement(logger, true);
          }
      }
docs: <p>Start interpolating playback position for all active players. Starts the {@link BeatGridFinder},
  {@link BeatFinder}, and {@link VirtualCdj} if they are not already running, because we need them to
  perform our calculations. This in turn starts the {@link DeviceFinder}, so we can keep track of the
  comings and goings of players themselves.</p>
  
  @throws Exception if there is a problem starting the required components