mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-08 22:34:03 +09:00
mp3 decoding but slow
This commit is contained in:
@@ -198,12 +198,14 @@ var Frame = {
|
||||
*/
|
||||
frame.decode = function () {
|
||||
var nch = frame.header.numberOfChannels();
|
||||
var out;
|
||||
var out_ptr;
|
||||
var out_ptr_len;
|
||||
if (nch === 1) {
|
||||
out = new Uint8Array(consts.BytesPerFrame / 2);
|
||||
out_ptr_len = consts.BytesPerFrame / 2
|
||||
} else {
|
||||
out = new Uint8Array(consts.BytesPerFrame);
|
||||
out_ptr_len = consts.BytesPerFrame
|
||||
}
|
||||
out_ptr = sys.malloc(out_ptr_len);
|
||||
for (var gr = 0; gr < 2; gr++) {
|
||||
for (var ch = 0; ch < nch; ch++) {
|
||||
frame.requantize(gr, ch);
|
||||
@@ -212,16 +214,21 @@ var Frame = {
|
||||
frame.stereo(gr);
|
||||
for (var ch = 0; ch < nch; ch++) {
|
||||
frame.antialias(gr, ch);
|
||||
frame.hybridSynthesis(gr, ch);
|
||||
|
||||
audio.mp3_hybridSynthesis(frame.sideInfo, frame.mainData.Is, frame.store[ch], gr, ch)
|
||||
//frame.hybridSynthesis(gr, ch);
|
||||
|
||||
frame.frequencyInversion(gr, ch);
|
||||
if (nch === 1) {
|
||||
frame.subbandSynthesis(gr, ch, out.subarray(consts.SamplesPerGr * 4 * gr / 2));
|
||||
audio.mp3_subbandSynthesis(nch, frame, gr, ch, out_ptr + (consts.SamplesPerGr * 4 * gr / 2))
|
||||
//frame.subbandSynthesis(gr, ch, out_ptr + (consts.SamplesPerGr * 4 * gr / 2));
|
||||
} else {
|
||||
frame.subbandSynthesis(gr, ch, out.subarray(consts.SamplesPerGr * 4 * gr));
|
||||
audio.mp3_subbandSynthesis(nch, frame, gr, ch, out_ptr + (consts.SamplesPerGr * 4 * gr))
|
||||
//frame.subbandSynthesis(gr, ch, out_ptr + (consts.SamplesPerGr * 4 * gr));
|
||||
}
|
||||
}
|
||||
}
|
||||
return out;
|
||||
return [out_ptr, out_ptr_len];
|
||||
};
|
||||
|
||||
frame.antialias = function (gr, ch) {
|
||||
@@ -433,7 +440,7 @@ var Frame = {
|
||||
var win_len = consts.SfBandIndicesSet[sfreq].S[sfb + 1] -
|
||||
consts.SfBandIndicesSet[sfreq].S[sfb];
|
||||
|
||||
for (var i = 36; i < int(f.sideInfo.Count1[gr][ch]);) /* i++ done below! */ {
|
||||
for (var i = 36; i < int(frame.sideInfo.Count1[gr][ch]);) /* i++ done below! */ {
|
||||
// Check if we're into the next scalefac band
|
||||
if (i === next_sfb) {
|
||||
sfb++;
|
||||
@@ -573,7 +580,7 @@ var Frame = {
|
||||
}
|
||||
};
|
||||
|
||||
frame.subbandSynthesis = function (gr, ch, out) {
|
||||
frame.subbandSynthesis = function (gr, ch, out_ptr) {
|
||||
var u_vec = new Float32Array(512);
|
||||
var s_vec = new Float32Array(32);
|
||||
|
||||
@@ -616,7 +623,7 @@ var Frame = {
|
||||
} else if (samp < -32767) {
|
||||
samp = -32767;
|
||||
}
|
||||
var s = samp;
|
||||
var s = samp|0;
|
||||
var idx;
|
||||
if (nch === 1) {
|
||||
idx = 2 * (32*ss + i);
|
||||
@@ -624,15 +631,19 @@ var Frame = {
|
||||
idx = 4 * (32*ss + i);
|
||||
}
|
||||
if (ch === 0) {
|
||||
out[idx] = s;
|
||||
out[idx + 1] = (s >>> 8) >>> 0;
|
||||
// out[idx] = s;
|
||||
// out[idx + 1] = (s >>> 8) >>> 0;
|
||||
sys.poke(out_ptr + idx, s)
|
||||
sys.poke(out_ptr + idx + 1, (s >>> 8) >>> 0)
|
||||
} else {
|
||||
out[idx + 2] = s;
|
||||
out[idx + 3] = (s >>> 8) >>> 0;
|
||||
// out[idx + 2] = s;
|
||||
// out[idx + 3] = (s >>> 8) >>> 0;
|
||||
sys.poke(out_ptr + idx + 2, s)
|
||||
sys.poke(out_ptr + idx + 3, (s >>> 8) >>> 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
return out;
|
||||
return out_ptr;
|
||||
};
|
||||
|
||||
frame.samplingFrequency = function () {
|
||||
|
||||
@@ -216,6 +216,11 @@ var Frameheader = {
|
||||
var pos = position;
|
||||
|
||||
var buf = source.readFull(4)
|
||||
if (buf.err) {
|
||||
return {
|
||||
err: buf.err
|
||||
}
|
||||
}
|
||||
if (buf.length < 4) {
|
||||
return {
|
||||
h: 0,
|
||||
|
||||
@@ -61,13 +61,16 @@ var Mp3 = {
|
||||
};
|
||||
|
||||
source.readFull = function (length) {
|
||||
if (length < 0) throw Error("Source.pos less than 0: "+source.pos)
|
||||
|
||||
var l = Math.min(source.buf.byteLength - source.pos, length);
|
||||
|
||||
if (l < 0) {
|
||||
serial.println("l < 0: "+l)
|
||||
throw Error("l < 0: "+l)
|
||||
if (length <= 0 || l <= 0 || length === undefined) {
|
||||
return { err: ("Source.pos less than 0: "+source.pos) }
|
||||
}
|
||||
|
||||
if (l <= 0) {
|
||||
serial.println("l <= 0: "+l)
|
||||
throw Error("l <= 0: "+l)
|
||||
}
|
||||
|
||||
// serial.println(`readFull(${length} -> ${l}); pos: ${source.pos}`)
|
||||
@@ -148,25 +151,35 @@ var Mp3 = {
|
||||
err: result.err
|
||||
}
|
||||
}
|
||||
|
||||
decoder.frame = result.f;
|
||||
var pcm_buf = decoder.frame.decode();
|
||||
var [pcm_buf_ptr, pcm_buf_len] = decoder.frame.decode();
|
||||
// decoder.buf = util.concatBuffers(decoder.buf, pcm_buf);
|
||||
return { buf: pcm_buf };
|
||||
|
||||
// serial.println(`End of decoder.readFrame; ptr: ${pcm_buf_ptr} len: ${pcm_buf_len}`)
|
||||
|
||||
return {
|
||||
ptr: pcm_buf_ptr,
|
||||
len: pcm_buf_len,
|
||||
pos: result.position
|
||||
};
|
||||
};
|
||||
|
||||
decoder.decode = function (callback) {
|
||||
var result;
|
||||
|
||||
serial.println("Start decoding")
|
||||
// serial.println("Start decoding")
|
||||
|
||||
while(true) {
|
||||
result = decoder.readFrame();
|
||||
|
||||
if (typeof callback == "function") callback(result)
|
||||
|
||||
if (result.err) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (typeof callback == "function") callback(result.ptr, result.len, result.pos)
|
||||
|
||||
sys.free(result.ptr)
|
||||
|
||||
}
|
||||
// return decoder.buf;
|
||||
};
|
||||
@@ -230,6 +243,9 @@ var Mp3 = {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// serial.println("Reading first frame")
|
||||
|
||||
var result = decoder.readFrame();
|
||||
@@ -240,13 +256,15 @@ var Mp3 = {
|
||||
|
||||
// serial.println("First frame finished reading")
|
||||
|
||||
decoder.headerSize = decoder.source.pos
|
||||
decoder.sampleRate = decoder.frame.samplingFrequency();
|
||||
decoder.frameSize = decoder.frame.header.frameSize()
|
||||
|
||||
serial.println("Sampling rate: "+decoder.sampleRate + " Hz")
|
||||
// serial.println("Sampling rate: "+decoder.sampleRate + " Hz")
|
||||
|
||||
result = decoder.ensureFrameStartsAndLength();
|
||||
|
||||
serial.println("Decode end")
|
||||
// serial.println("Decode end")
|
||||
if (result.err) {
|
||||
throw Error(`Error ensuring Frame starts and length: ${result.err}`)
|
||||
return null;
|
||||
|
||||
Reference in New Issue
Block a user