/** * Encodes an audio track to a byte array. Does not include AudioTrackInfo in the buffer. * @param track The track to encode * @return The bytes of the encoded data */ public byte[] encodeTrackDetails(AudioTrack track) { try { ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(); DataOutput output = new DataOutputStream(byteOutput); encodeTrackDetails(track, output); return byteOutput.toByteArray(); } catch (IOException e) { throw new RuntimeException(e); } }
@Override public void encodeTrack(MessageOutput stream, AudioTrack track) throws IOException { DataOutput output = stream.startMessage(); output.write(TRACK_INFO_VERSION); AudioTrackInfo trackInfo = track.getInfo(); output.writeUTF(trackInfo.title); output.writeUTF(trackInfo.author); output.writeLong(trackInfo.length); output.writeUTF(trackInfo.identifier); output.writeBoolean(trackInfo.isStream); DataFormatTools.writeNullableText(output, trackInfo.uri); encodeTrackDetails(track, output); output.writeLong(track.getPosition()); stream.commitMessage(TRACK_INFO_VERSIONED); }
/** * Start playing a track through this remote node. * @param executor The executor of the track */ public void startPlaying(RemoteAudioTrackExecutor executor) { AudioTrack track = executor.getTrack(); if (playingTracks.putIfAbsent(executor.getExecutorId(), executor) == null) { long position = executor.getNextInputTimecode(); log.info("Sending request to play {} {} from position {}", track.getIdentifier(), executor.getExecutorId(), position); queuedMessages.add(new TrackStartRequestMessage(executor.getExecutorId(), track.getInfo(), playerManager.encodeTrackDetails(track), executor.getVolume(), executor.getConfiguration(), position)); } }