Basic decoding with edge effects
This commit is contained in:
parent
aa8ac249a0
commit
1f40231b9b
6 changed files with 486 additions and 172 deletions
62
index.html
62
index.html
|
@ -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>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue