Basic decoding with edge effects

This commit is contained in:
Blue 2019-01-14 05:19:37 +03:00
parent aa8ac249a0
commit 1f40231b9b
6 changed files with 486 additions and 172 deletions

View file

@ -12,24 +12,24 @@
<script src="wrapper.js"></script>
<input type="file" id="file" name="file" />
<script>
var minPortion = 20480;
var maxPortion = 40960;
var time = 0;
var ctx = new AudioContext();
ctx.suspend();
var decoder;
var fragments = [];
var noize = [];
var decoding = false;
function onChange(e) {
var file = e.target.files[0];
var reader = new FileReader();
reader.onload = function(e) {
decoder = new Module.Decoder();
var buffer = reader.result;
var src = new Uint8Array(buffer);
var ptr = Module._malloc(buffer.byteLength);
var arr = new Uint8Array(Module.HEAPU8.buffer, ptr, buffer.byteLength);
arr.set(src, 0);
createFileFragments(reader.result);
decoder.addFragment(ptr, buffer.byteLength);
schedule();
scheduleData();
ctx.resume();
}
reader.readAsArrayBuffer(file);
@ -37,8 +37,9 @@
}
function schedule() {
decoding = false;
if (decoder.hasMore()) {
var audio = decoder.decode(50);
var audio = decoder.decode(20);
if (audio) {
var source = ctx.createBufferSource();
source.buffer = audio;
@ -47,14 +48,55 @@
time += audio.duration;
setTimeout(schedule, Math.floor(audio.duration * 200));
decoding = true;
} else {
decoder.delete();
//decoder.delete();
}
} else {
decoder.delete();
//decoder.delete();
}
}
function scheduleData() {
if (fragments.length) {
var frag = fragments.shift();
decoder.addFragment(frag.ptr, frag.length);
if (fragments.length) {
setTimeout(scheduleData, 50);
}
if (!decoding) {
schedule();
}
}
}
function createFileFragments(buffer) {
var src = new Uint8Array(buffer);
var shoved = 0;
while (shoved !== src.length) {
var ps = Math.min(Math.floor(Math.random() * (maxPortion - minPortion) + minPortion), src.length - shoved);
var ptr = Module._malloc(ps);
var arr = new Uint8Array(Module.HEAPU8.buffer, ptr, ps);
var portion = new Uint8Array(buffer, shoved, ps)
arr.set(portion, 0);
shoved += ps;
fragments.push({
ptr: ptr,
length: ps
});
noize.push(Module._malloc(256));
}
}
document.getElementById("file").addEventListener("change", onChange, false);
</script>
</body>