riff-chunks
Version:
Parse the chunks of RIFF and RIFX files.
12 lines (11 loc) • 4 kB
JavaScript
/*
riff-chunks Copyright (c) 2017-2018 Rafael da Silva Rocha.
*/
var riffChunks=function(n){function q(b,a,c,k){c=void 0===c?0:c;k=void 0===k?b.length:k;if(k%a)throw Error("Bad buffer length.");for(;c<k;c+=a){var d=b,e=a,f=c;e--;for(var g=0;g<e;g++){var h=d[f+g];d[f+g]=d[f+e];d[f+e]=h;e--}}}function u(b,a){return g.read(b,a)}function v(b,a){b=g.read(b,a);a=(b&31744)>>10;var c=b&1023;return(a?Math.pow(2,a-15)*(1+c/1024):c/1024*.00006103515625)*(b>>15?-1:1)}function w(b,a){p[0]=g.read(b,a);return x[0]}function y(b,a){p[z]=g.read(b,a);p[A]=g.read(b,a+4);return B[0]}
function m(b,a,c){a=void 0===a?0:a;c=void 0===c?null:c;var d="";for(c=c?a+c:b.length;a<c;){if(127<b[a])throw Error("Bad ASCII code.");d+=String.fromCharCode(b[a]);a++}return d}function r(b){for(var a=[],c=f;c<=b.length-8;)a.push(C(b,c)),c+=8+a[a.length-1].chunkSize,c=c%2?c+1:c;return a}function C(b,a){f+=4;var c={chunkId:m(b,a,4),chunkSize:t(b,a)};"LIST"==c.chunkId?(c.format=m(b,a+8,4),f+=4,c.subChunks=r(b)):(f=a+8+(c.chunkSize%2?c.chunkSize+1:c.chunkSize),c.chunkData={start:a+8,end:f});return c}
function t(b,a){f+=4;a+=4;a=void 0===a?0:a;if(!d)throw Error("Undefined type.");if(d.float){if(-1==[16,32,64].indexOf(d.bits))throw Error("Bad float type.");}else if(1>d.bits||53<d.bits)throw Error("Bad type definition.");d.offset=8>d.bits?1:Math.ceil(d.bits/8);d.be=d.be||!1;d.float?16==d.bits?l=v:32==d.bits?l=w:64==d.bits&&(l=y):l=u;g=new e(64==d.bits?32:d.bits,d.float?!1:d.signed);d.be&&q(b,d.offset,a,a+d.offset);var c=l(b,a);d.be&&q(b,d.offset,a,a+d.offset);return c}var e=function(b,a){this.bits=
b;this.signed=a;this.offset=0;this.min=-Infinity;this.max=Infinity;this.realBits_=this.bits;this.lastByteMask_=255;this.build_()};e.prototype.read=function(b,a){a=void 0===a?0:a;for(var c=0,d=this.offset-1;0<d;)c|=b[d+a]<<8*d,d--;c=(b[a]|c)>>>0;return this.overflow_(this.sign_(c))};e.prototype.write=function(b,a,c){c=void 0===c?0:c;a=this.overflow_(a);b[c++]=a&255;for(var d=2;d<=this.offset;d++)b[c++]=Math.floor(a/Math.pow(2,8*(d-1)))&255;return c};e.prototype.writeEsoteric_=function(b,a,c){c=void 0===
c?0:c;a=this.overflow_(a);c=this.writeFirstByte_(b,a,c);for(var d=2;d<this.offset;d++)b[c++]=Math.floor(a/Math.pow(2,8*(d-1)))&255;8<this.bits&&(b[c++]=Math.floor(a/Math.pow(2,8*(this.offset-1)))&this.lastByteMask_);return c};e.prototype.readBits_=function(b,a){a=void 0===a?0:a;for(var c="",d=0;d<this.offset;){var e=b[a+d].toString(2);c=Array(9-e.length).join("0")+e+c;d++}return this.overflow_(this.sign_(parseInt(c,2)))};e.prototype.build_=function(){this.setRealBits_();this.setLastByteMask_();this.setMinMax_();
this.offset=8>this.bits?1:Math.ceil(this.realBits_/8);if(this.realBits_!=this.bits||8>this.bits||32<this.bits)this.write=this.writeEsoteric_,this.read=this.readBits_};e.prototype.sign_=function(b){b>this.max&&(b-=2*this.max+2);return b};e.prototype.overflow_=function(b){if(b>this.max)throw Error("Overflow.");if(b<this.min)throw Error("Underflow.");return b};e.prototype.setMinMax_=function(){var b=Math.pow(2,this.bits);this.signed?(this.max=b/2-1,this.min=-b/2):(this.max=b-1,this.min=0)};e.prototype.setRealBits_=
function(){8<this.bits&&(this.realBits_=(this.bits-1|7)+1)};e.prototype.setLastByteMask_=function(){var b=8-(this.realBits_-this.bits);this.lastByteMask_=Math.pow(2,0<b?b:8)-1};e.prototype.writeFirstByte_=function(b,a,c){8>this.bits?b[c++]=0>a?a+Math.pow(2,this.bits):a:b[c++]=a&255;return c};var h=18===(new Uint8Array((new Uint32Array([305419896])).buffer))[0],z=h?1:0,A=h?0:1;h=new Int8Array(8);var p=new Uint32Array(h.buffer),x=new Float32Array(h.buffer),B=new Float64Array(h.buffer),l,g={},d={bits:32},
f=0;n.riffChunks=function(b){f=0;f+=4;var a=m(b,0,4);d.be="RIFX"==a;var c=m(b,8,4);f+=4;return{chunkId:a,chunkSize:t(b,0),format:c,subChunks:r(b)}};n.findChunk=function(b,a,c){c=void 0===c?!1:c;for(var d=[],e=0;e<b.length;e++)if(b[e].chunkId==a)if(c)d.push(b[e]);else return b[e];return"LIST"==a?d.length?d:null:null};return n}({});window.riffChunks=riffChunks;