private MutableAudioFrame getBridgeFrame() { if (bridgeFrame == null) { bridgeFrame = new MutableAudioFrame(); bridgeFrame.setBuffer(ByteBuffer.allocate(format.maximumChunkSize())); } return bridgeFrame; }
private AudioFrame unwrapBridgeFrame() { if (bridgeFrame.isTerminator()) { return TerminatorAudioFrame.INSTANCE; } else { return new ImmutableAudioFrame(bridgeFrame.getTimecode(), bridgeFrame.getData(), bridgeFrame.getVolume(), bridgeFrame.getFormat()); } }
@Override public byte[] getData() { byte[] data = new byte[getDataLength()]; getData(data, 0); return data; }
/** * @param context Configuration and output information for processing * @param inputFrequency Sample rate of the opus track * @param inputChannels Number of channels in the opus track */ public OpusPacketRouter(AudioProcessingContext context, int inputFrequency, int inputChannels) { this.context = context; this.inputFrequency = inputFrequency; this.inputChannels = inputChannels; this.headerBytes = new byte[2]; this.offeredFrame = new MutableAudioFrame(); this.lastFrameSize = 0; offeredFrame.setVolume(100); offeredFrame.setFormat(context.outputFormat); }
private boolean passToMutable(AudioFrame frame, MutableAudioFrame targetFrame) { if (targetFrame != null) { if (frame.isTerminator()) { targetFrame.setTerminator(true); } else { targetFrame.setTimecode(frame.getTimecode()); targetFrame.setVolume(frame.getVolume()); targetFrame.store(frame.getData(), 0, frame.getDataLength()); targetFrame.setTerminator(false); } return true; } return false; }
@Override public void process(long timecode, ShortBuffer buffer) throws InterruptedException { outputBuffer.clear(); encoder.encode(buffer, outputBuffer); offeredFrame.setTimecode(timecode); offeredFrame.setVolume(context.playerOptions.volumeLevel.get()); offeredFrame.setBuffer(outputBuffer); context.frameBuffer.consume(offeredFrame); }
private void passThrough(ByteBuffer buffer) throws InterruptedException { offeredFrame.setTimecode(currentTimecode); offeredFrame.setBuffer(buffer); context.frameBuffer.consume(offeredFrame); }
/** * @param context Processing context to determine the destination buffer from. * @param encoder Encoder to encode the chunk with. */ public BufferingPostProcessor(AudioProcessingContext context, AudioChunkEncoder encoder) { this.encoder = encoder; this.context = context; this.offeredFrame = new MutableAudioFrame(); this.outputBuffer = ByteBuffer.allocateDirect(context.outputFormat.maximumChunkSize()); offeredFrame.setFormat(context.outputFormat); }
private boolean provideShadowFrame(MutableAudioFrame targetFrame) { InternalAudioTrack shadow = shadowTrack; if (shadow != null && shadow.provide(targetFrame)) { if (targetFrame.isTerminator()) { shadowTrack = null; return false; } return true; } return false; }
private void popPendingTerminator(MutableAudioFrame frame) { terminateOnEmpty = false; terminated = true; frame.setTerminator(true); }
private void popFrame(MutableAudioFrame targetFrame) { ReferenceMutableAudioFrame frame = frames[firstFrame]; if (frame.getVolume() == 0) { silentFrame.setTimecode(frame.getTimecode()); frame = silentFrame; } targetFrame.setTimecode(frame.getTimecode()); targetFrame.setVolume(frame.getVolume()); targetFrame.setTerminator(false); targetFrame.store(frame.getFrameBuffer(), frame.getFrameOffset(), frame.getDataLength()); firstFrame = wrappedFrameIndex(firstFrame + 1); frameCount--; }
@Override public boolean provide(MutableAudioFrame targetFrame, long timeout, TimeUnit unit) throws TimeoutException, InterruptedException { InternalAudioTrack track; lastRequestTime = System.currentTimeMillis(); if (timeout == 0 && paused.get()) { return false; } while ((track = activeTrack) != null) { if (timeout > 0 ? track.provide(targetFrame, timeout, unit) : track.provide(targetFrame)) { lastReceiveTime = System.nanoTime(); shadowTrack = null; if (targetFrame.isTerminator()) { handleTerminator(track); continue; } return true; } else if (timeout == 0) { checkStuck(track); return provideShadowFrame(targetFrame); } else { return false; } } return false; }
public static long consumeTrack(AudioPlayer player) throws Exception { ByteBuffer buffer = ByteBuffer.allocate(960 * 2 * 2); MutableAudioFrame frame = new MutableAudioFrame(); frame.setBuffer(buffer); CRC32 crc = new CRC32(); while (player.getPlayingTrack() != null && player.provide(frame, 10, TimeUnit.SECONDS)) { buffer.flip(); crc.update(buffer.array(), buffer.position(), buffer.remaining()); } return crc.getValue(); } }