@Override public TrackStartRequestMessage decode(DataInput in, int version) throws IOException { long executorId = in.readLong(); AudioTrackInfo trackInfo = new AudioTrackInfo(in.readUTF(), in.readUTF(), in.readLong(), in.readUTF(), in.readBoolean(), null); byte[] encodedTrack = new byte[in.readInt()]; in.readFully(encodedTrack); int volume = in.readInt(); AudioConfiguration configuration = new AudioConfiguration(); configuration.setResamplingQuality(AudioConfiguration.ResamplingQuality.valueOf(in.readUTF())); configuration.setOpusEncodingQuality(in.readInt()); if (version >= VERSION_WITH_FORMAT) { AudioDataFormat format = createFormat(in.readInt(), in.readInt(), in.readInt(), in.readUTF()); configuration.setOutputFormat(format); } long position = 0; if (version >= VERSION_WITH_POSITION) { position = in.readLong(); } return new TrackStartRequestMessage(executorId, trackInfo, encodedTrack, volume, configuration, position); }
/** * 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(); }
/** * @return A copy of this configuration. */ public AudioConfiguration copy() { AudioConfiguration copy = new AudioConfiguration(); copy.setResamplingQuality(resamplingQuality); copy.setOpusEncodingQuality(opusEncodingQuality); copy.setOutputFormat(outputFormat); copy.setFilterHotSwapEnabled(filterHotSwapEnabled); copy.setFrameBufferFactory(frameBufferFactory); return copy; }