var encoded = []; var encodedLength = 0; function encWriteCallback(buffer, bytes, samples, currentFrame) { encoded.push(buffer); encodedLength += bytes; } var source = await app.getCsound().getTable(113); var encoder = Flac.create_libflac_encoder(48000, 1, 16, 5, source.length, false); var init = Flac.init_encoder_stream(encoder, encWriteCallback, null, false, 0); var response = Flac.FLAC__stream_encoder_process(encoder, source, source.length); Flac.FLAC__stream_encoder_finish(encoder); Flac.FLAC__stream_encoder_delete(encoder); let merged = new Uint8Array(encodedLength); let offset = 0; encoded.forEach(item => { merged.set(item, offset); offset += item.length; }); encoded = merged; //var encodedArr = new Uint8Array(encoded); var size = encoded.length; var decoded = []; var currentDataOffset = 0; function decReadCallback(bufferSize) { var end = currentDataOffset == size ? -1 : Math.min(currentDataOffset + bufferSize, size); var _buffer; var bytesRead; if (end !== -1) { //_buffer = encodedArr.subarray(currentDataOffset, end); _buffer = encoded.slice(currentDataOffset, end); bytesRead = end - currentDataOffset; currentDataOffset = end; } else { bytesRead = 0; } return {buffer: _buffer, readDataLength: bytesRead, error: false}; } function decWriteCallback(buffer, _frameHdr) { decoded.push(buffer); } function decErrorCallback(err, errMsg) { console.log(err, errMsg); } var decoder = Flac.create_libflac_decoder(false); var init = Flac.init_decoder_stream(decoder, decReadCallback, decWriteCallback, decErrorCallback, null, false); Flac.setOptions(decoder, {analyseSubframes: false, analyseResiduals: false, enableRawStreamMetadata: false}); var response = Flac.FLAC__stream_decoder_process_until_end_of_stream(decoder); /* var state = 0; var response = true; while (state <= 3 && response != false) { response &= Flac.FLAC__stream_decoder_process_single(decoder); state = Flac.FLAC__stream_decoder_get_state(decoder); } */ Flac.FLAC__stream_decoder_finish(decoder);