private static ReferenceMutableAudioFrame createSilentFrame(AudioDataFormat format) { ReferenceMutableAudioFrame frame = new ReferenceMutableAudioFrame(); frame.setFormat(format); frame.setDataReference(format.silenceBytes(), 0, format.silenceBytes().length); frame.setVolume(0); return frame; }
@Override public byte[] getData() { byte[] data = new byte[frameLength]; getData(data, 0); return data; }
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--; }
private static ReferenceMutableAudioFrame[] createFrames(int frameCount, AudioDataFormat format) { ReferenceMutableAudioFrame[] frames = new ReferenceMutableAudioFrame[frameCount]; for (int i = 0; i < frames.length; i++) { frames[i] = new ReferenceMutableAudioFrame(); frames[i].setFormat(format); } return frames; }
private void store(AudioFrame frame, int index, int frameOffset, int frameLength) { ReferenceMutableAudioFrame targetFrame = frames[index]; targetFrame.setTimecode(frame.getTimecode()); targetFrame.setVolume(frame.getVolume()); targetFrame.setDataReference(frameBuffer, frameOffset, frameLength); frame.getData(frameBuffer, frameOffset); frameCount++; }
/** * @return Number of frames that can be added to the buffer without blocking. */ @Override public int getRemainingCapacity() { synchronized (synchronizer) { if (frameCount == 0) { return worstCaseFrameCount; } int lastFrame = wrappedFrameIndex(firstFrame + frameCount - 1); int bufferHead = frames[firstFrame].getFrameOffset(); int bufferTail = frames[lastFrame].getFrameEndOffset(); int maximumFrameSize = format.maximumChunkSize(); if (bufferHead < bufferTail) { return (frameBuffer.length - bufferTail) / maximumFrameSize + bufferHead / maximumFrameSize; } else { return (bufferHead - bufferTail) / maximumFrameSize; } } }
@Override public Long getLastInputTimecode() { synchronized (synchronizer) { if (!clearOnInsert && frameCount > 0) { return frames[wrappedFrameIndex(firstFrame + frameCount - 1)].getTimecode(); } } return null; }
int nextFrame = wrappedFrameIndex(lastFrame + 1); int bufferHead = frames[firstFrame].getFrameOffset(); int bufferTail = frames[lastFrame].getFrameEndOffset();