/** * Create a new instance */ public DefaultAudioPlayerManager() { sourceManagers = new ArrayList<>(); // Executors trackPlaybackExecutorService = new ThreadPoolExecutor(1, Integer.MAX_VALUE, 10, TimeUnit.SECONDS, new SynchronousQueue<>(), new DaemonThreadFactory("playback")); trackInfoExecutorService = ExecutorTools.createEagerlyScalingExecutor(1, DEFAULT_LOADER_POOL_SIZE, TimeUnit.SECONDS.toMillis(30), LOADER_QUEUE_CAPACITY, new DaemonThreadFactory("info-loader")); scheduledExecutorService = Executors.newScheduledThreadPool(1, new DaemonThreadFactory("manager")); orderedInfoExecutor = new OrderedExecutor(trackInfoExecutorService); // Configuration trackStuckThreshold = TimeUnit.MILLISECONDS.toNanos(10000); configuration = new AudioConfiguration(); cleanupThreshold = new AtomicLong(DEFAULT_CLEANUP_THRESHOLD); frameBufferDuration = DEFAULT_FRAME_BUFFER_DURATION; useSeekGhosting = true; // Additional services remoteNodeManager = new RemoteNodeManager(this); garbageCollectionMonitor = new GarbageCollectionMonitor(scheduledExecutorService); lifecycleManager = new AudioPlayerLifecycleManager(scheduledExecutorService, cleanupThreshold); lifecycleManager.initialise(); }
@Override public void shutdown() { remoteNodeManager.shutdown(true); garbageCollectionMonitor.disable(); lifecycleManager.shutdown(); for (AudioSourceManager sourceManager : sourceManagers) { sourceManager.shutdown(); } ExecutorTools.shutdownExecutor(trackPlaybackExecutorService, "track playback"); ExecutorTools.shutdownExecutor(trackInfoExecutorService, "track info"); ExecutorTools.shutdownExecutor(scheduledExecutorService, "scheduled operations"); }