private void switchBuffers(int offset, float[] audioArray, SyncBuffer oldBuffer) { int toBePadded = offset; FloatBuffer oldFloatBuffer = oldBuffer.asFloatBuffer(); // 1) use the remaining space in the current buffer // ...pad the current buffer as much as fits. while ((toBePadded > 0) && (oldFloatBuffer.hasRemaining())) { oldFloatBuffer.put(0F); toBePadded--; samplesProcessed++; } // ...put as much as fits from the audioArray int audioArrayWrittenToOld = 0; if (oldFloatBuffer.hasRemaining() && toBePadded == 0) { audioArrayWrittenToOld = oldFloatBuffer.remaining(); oldFloatBuffer.put(audioArray, 0, audioArrayWrittenToOld); samplesProcessed += audioArrayWrittenToOld; } // 2) put the rest in a new buffer if (!startBufferDone) { // setup the first file buffer bussyBufferProvider = new AlwaysStreamedBuffer(new SyncBuffer(requestedFileBufferSizeFloat)); } else { if (!firstFileBufferDone) { // setup the second file buffer bussyBufferProvider = new AlwaysStreamedBuffer(new SyncBuffer(requestedFileBufferSizeFloat)); } } if (bussyBufferProvider == null) { logger.severe("Next buffer is null!!"); return; } if (!bussyBufferProvider.isDone()) { logger.warning("Next buffer not ready."); overflowCount++; return; } SyncBuffer newBuffer; FileChannel channel; try { FileWriteTaskResult result = bussyBufferProvider.get(); newBuffer = result.getbuffer(); channel = result.getChannel(); } catch (InterruptedException | ExecutionException ex) { logger.log(Level.SEVERE, null, ex); return; } FloatBuffer newFloatBuffer = newBuffer.asFloatBuffer(); // int remainingInNewBuffer = newFloatBuffer.remaining(); int toBeWrittenToNew = toBePadded + audioArray.length - audioArrayWrittenToOld; if (toBeWrittenToNew > remainingInNewBuffer) { logger.severe("File buffer too small for this offset."); } else { for (int i = 0; i < toBePadded; i++) { newFloatBuffer.put(0F); samplesProcessed++; } int restAudioArray = audioArray.length - audioArrayWrittenToOld; newFloatBuffer.put(audioArray, audioArrayWrittenToOld, restAudioArray); samplesProcessed += restAudioArray; } if (startBufferDone) { FileWriteTask fileWriteTask = new FileWriteTask(outputFile, channel, oldBuffer); currentBufferProvider = bussyBufferProvider; bussyBufferProvider = executor.submit(fileWriteTask); firstFileBufferDone = true; } else { // we just have processed the first buffer: currentBufferProvider = bussyBufferProvider; bussyBufferProvider = null; startBufferDone = true; } }
@Override public FileChannel call() throws FileNotFoundException, IOException { FileWriteTask fileWriteTask = new FileWriteTask(file, channel, buffer); FileWriteTaskResult fileWriteResult = fileWriteTask.call(); return reopenForInput(fileWriteResult.getChannel()); }