/** * @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); }
@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 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; }
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--; }