<!doctype html> <html> <head> </head> <body> <script> var Module = { onRuntimeInitialized: function() { } }; </script> <script src="wrapper.js"></script> <input type="file" id="file" name="file" /> <script> var minPortion = 60000; var maxPortion = 100000; 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(); createFileFragments(reader.result); scheduleData(); setTimeout(ctx.resume.bind(ctx), 1000); } reader.readAsArrayBuffer(file); } function schedule() { decoding = false; if (decoder.hasMore()) { var audio = decoder.decode(20); if (audio) { var source = ctx.createBufferSource(); source.buffer = audio; source.connect(ctx.destination); source.start(time); time += audio.duration; setTimeout(schedule, Math.floor(audio.duration * 200)); decoding = true; } else { //decoder.delete(); } } else { //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> </html>