1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
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);
|