lib 1400149 // java-lame static LS _stickyLibs_StreamingMP3Encoder = ll(#1400149); import net.sourceforge.lame.lowlevel.*; import net.sourceforge.lame.mp3.MPEGMode; sclass StreamingMP3Encoder implements AutoCloseable { File mp3; OutputStream out; byte[] outBuffer; LameEncoder encoder; IVF3 onBytesWritten; AudioFormat format; int bitRate = 128; int quality = LameEncoder.DEFAULT_QUALITY; bool vbr; *() {} *(File mp3, float sampleRate) { this(mp3, javaSound_pcmSignedLittleEndianMono(sampleRate)); } *(File *mp3, AudioFormat *format) { init(); } void init ctex { MPEGMode channelMode = format.getChannels() == 1 ? MPEGMode.MONO : MPEGMode.JOINT_STEREO; encoder = new LameEncoder(format, bitRate, channelMode, quality, vbr); outBuffer = new byte[encoder.getPCMBufferSize()]; out = newFileOutputStream(mp3); } public void close { encoder.close(); dispose out; } void addData(short[] samples) ctex { byte[] pcm = byteArrayFromShorts_littleEndian(samples); int bytesToTransfer = min(l(outBuffer), l(pcm)), bytesWritten; int iPCM = 0; while (0 < (bytesWritten = encoder.encodeBuffer(pcm, iPCM, bytesToTransfer, outBuffer))) { iPCM += bytesToTransfer; bytesToTransfer = min(l(outBuffer), l(pcm) - iPCM); callF(onBytesWritten, outBuffer, 0, bytesWritten); out.write(outBuffer, 0, bytesWritten); } } }