waveform-data
Version:
Audio Waveform Data Manipulation API – resample, offset and segment waveform data in JavaScript
3 lines (2 loc) • 19.2 kB
JavaScript
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).WaveformData=e()}(this,(function(){"use strict";function t(t,e){this._waveformData=t,this._channelIndex=e}t.prototype.min_sample=function(t){var e=2*(t*this._waveformData.channels+this._channelIndex);return this._waveformData._at(e)},t.prototype.max_sample=function(t){var e=2*(t*this._waveformData.channels+this._channelIndex)+1;return this._waveformData._at(e)},t.prototype.set_min_sample=function(t,e){var a=2*(t*this._waveformData.channels+this._channelIndex);return this._waveformData._set_at(a,e)},t.prototype.set_max_sample=function(t,e){var a=2*(t*this._waveformData.channels+this._channelIndex)+1;return this._waveformData._set_at(a,e)},t.prototype.min_array=function(){for(var t=this._waveformData.length,e=[],a=0;a<t;a++)e.push(this.min_sample(a));return e},t.prototype.max_array=function(){for(var t=this._waveformData.length,e=[],a=0;a<t;a++)e.push(this.max_sample(a));return e};var e=127,a=-128,i=32767,n=-32768;function s(t){for(var s=t.scale,r=t.amplitude_scale,g=t.split_channels,h=t.length,I=t.sample_rate,o=t.channels.map((function(t){return new Float32Array(t)})),l=g?o.length:1,u=function(t,e){var a=Math.floor(t/e);return t-a*e>0&&a++,a}(h,s),C=8===t.bits?1:2,c=new ArrayBuffer(24+2*u*C*l),_=new DataView(c),m=0,A=24,f=new Array(l),p=new Array(l),d=0;d<l;d++)f[d]=1/0,p[d]=-1/0;var b=8===t.bits?a:n,W=8===t.bits?e:i;_.setInt32(0,2,!0),_.setUint32(4,8===t.bits,!0),_.setInt32(8,I,!0),_.setInt32(12,s,!0),_.setInt32(16,u,!0),_.setInt32(20,l,!0);for(var Z=0;Z<h;Z++){var w=0;if(1===l){for(var V=0;V<o.length;++V)w+=o[V][Z];(w=Math.floor(W*w*r/o.length))<f[0]&&(f[0]=w,f[0]<b&&(f[0]=b)),w>p[0]&&(p[0]=w,p[0]>W&&(p[0]=W))}else for(var X=0;X<l;++X)(w=Math.floor(W*o[X][Z]*r))<f[X]&&(f[X]=w,f[X]<b&&(f[X]=b)),w>p[X]&&(p[X]=w,p[X]>W&&(p[X]=W));if(++m===s){for(var y=0;y<l;y++)8===t.bits?(_.setInt8(A++,f[y]),_.setInt8(A++,p[y])):(_.setInt16(A,f[y],!0),_.setInt16(A+2,p[y],!0),A+=4),f[y]=1/0,p[y]=-1/0;m=0}}if(m>0)for(var G=0;G<l;G++)8===t.bits?(_.setInt8(A++,f[G]),_.setInt8(A++,p[G])):(_.setInt16(A,f[G],!0),_.setInt16(A+2,p[G],!0));return c}function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function g(t){return null==t}var h=null;try{var I="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");h=I.Worker}catch(t){}function o(t,e,a){var i=void 0===e?null:e,n=function(t,e){return Buffer.from(t,"base64").toString(e?"utf16":"utf8")}(t,void 0!==a&&a),s=n.indexOf("\n",10)+1,r=n.substring(s)+(i?"//# sourceMappingURL="+i:"");return function(t){return new h(r,Object.assign({},t,{eval:!0}))}}function l(t,e,a){var i=void 0===e?null:e,n=function(t,e){var a=atob(t);if(e){for(var i=new Uint8Array(a.length),n=0,s=a.length;n<s;++n)i[n]=a.charCodeAt(n);return String.fromCharCode.apply(null,new Uint16Array(i.buffer))}return a}(t,void 0!==a&&a),s=n.indexOf("\n",10)+1,r=n.substring(s)+(i?"//# sourceMappingURL="+i:""),g=new Blob([r],{type:"application/javascript"});return URL.createObjectURL(g)}var u="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);function C(t,e,a){return u?o(t,e,a):function(t,e,a){var i;return function(n){return i=i||l(t,e,a),new Worker(i,n)}}(t,e,a)}var c=C("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQXVkaW9CdWZmZXItYmFzZWQgV2F2ZWZvcm1EYXRhIGdlbmVyYXRvcgogICAqCiAgICogQWRhcHRlZCBmcm9tIEJsb2NrRmlsZTo6Q2FsY1N1bW1hcnkgaW4gQXVkYWNpdHksIHdpdGggcGVybWlzc2lvbi4KICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F1ZGFjaXR5L2F1ZGFjaXR5L2Jsb2IvCiAgICogICAxMTA4YzEzNzZjMDkxNjYxNjIzMzVmYWI0NzQzMDA4Y2JhNTdjNGVlL3NyYy9CbG9ja0ZpbGUuY3BwI0wxOTgKICAgKi8KCiAgdmFyIElOVDhfTUFYID0gMTI3OwogIHZhciBJTlQ4X01JTiA9IC0xMjg7CiAgdmFyIElOVDE2X01BWCA9IDMyNzY3OwogIHZhciBJTlQxNl9NSU4gPSAtMzI3Njg7CiAgZnVuY3Rpb24gY2FsY3VsYXRlV2F2ZWZvcm1EYXRhTGVuZ3RoKGF1ZGlvX3NhbXBsZV9jb3VudCwgc2NhbGUpIHsKICAgIHZhciBkYXRhX2xlbmd0aCA9IE1hdGguZmxvb3IoYXVkaW9fc2FtcGxlX2NvdW50IC8gc2NhbGUpOwogICAgdmFyIHNhbXBsZXNfcmVtYWluaW5nID0gYXVkaW9fc2FtcGxlX2NvdW50IC0gZGF0YV9sZW5ndGggKiBzY2FsZTsKICAgIGlmIChzYW1wbGVzX3JlbWFpbmluZyA+IDApIHsKICAgICAgZGF0YV9sZW5ndGgrKzsKICAgIH0KICAgIHJldHVybiBkYXRhX2xlbmd0aDsKICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVXYXZlZm9ybURhdGEob3B0aW9ucykgewogICAgdmFyIHNjYWxlID0gb3B0aW9ucy5zY2FsZTsKICAgIHZhciBhbXBsaXR1ZGVfc2NhbGUgPSBvcHRpb25zLmFtcGxpdHVkZV9zY2FsZTsKICAgIHZhciBzcGxpdF9jaGFubmVscyA9IG9wdGlvbnMuc3BsaXRfY2hhbm5lbHM7CiAgICB2YXIgbGVuZ3RoID0gb3B0aW9ucy5sZW5ndGg7CiAgICB2YXIgc2FtcGxlX3JhdGUgPSBvcHRpb25zLnNhbXBsZV9yYXRlOwogICAgdmFyIGNoYW5uZWxzID0gb3B0aW9ucy5jaGFubmVscy5tYXAoZnVuY3Rpb24gKGNoYW5uZWwpIHsKICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoY2hhbm5lbCk7CiAgICB9KTsKICAgIHZhciBvdXRwdXRfY2hhbm5lbHMgPSBzcGxpdF9jaGFubmVscyA/IGNoYW5uZWxzLmxlbmd0aCA6IDE7CiAgICB2YXIgaGVhZGVyX3NpemUgPSAyNDsKICAgIHZhciBkYXRhX2xlbmd0aCA9IGNhbGN1bGF0ZVdhdmVmb3JtRGF0YUxlbmd0aChsZW5ndGgsIHNjYWxlKTsKICAgIHZhciBieXRlc19wZXJfc2FtcGxlID0gb3B0aW9ucy5iaXRzID09PSA4ID8gMSA6IDI7CiAgICB2YXIgdG90YWxfc2l6ZSA9IGhlYWRlcl9zaXplICsgZGF0YV9sZW5ndGggKiAyICogYnl0ZXNfcGVyX3NhbXBsZSAqIG91dHB1dF9jaGFubmVsczsKICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodG90YWxfc2l6ZSk7CiAgICB2YXIgZGF0YV92aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7CiAgICB2YXIgc2NhbGVfY291bnRlciA9IDA7CiAgICB2YXIgb2Zmc2V0ID0gaGVhZGVyX3NpemU7CiAgICB2YXIgbWluX3ZhbHVlID0gbmV3IEFycmF5KG91dHB1dF9jaGFubmVscyk7CiAgICB2YXIgbWF4X3ZhbHVlID0gbmV3IEFycmF5KG91dHB1dF9jaGFubmVscyk7CiAgICBmb3IgKHZhciBjaGFubmVsID0gMDsgY2hhbm5lbCA8IG91dHB1dF9jaGFubmVsczsgY2hhbm5lbCsrKSB7CiAgICAgIG1pbl92YWx1ZVtjaGFubmVsXSA9IEluZmluaXR5OwogICAgICBtYXhfdmFsdWVbY2hhbm5lbF0gPSAtSW5maW5pdHk7CiAgICB9CiAgICB2YXIgcmFuZ2VfbWluID0gb3B0aW9ucy5iaXRzID09PSA4ID8gSU5UOF9NSU4gOiBJTlQxNl9NSU47CiAgICB2YXIgcmFuZ2VfbWF4ID0gb3B0aW9ucy5iaXRzID09PSA4ID8gSU5UOF9NQVggOiBJTlQxNl9NQVg7CiAgICBkYXRhX3ZpZXcuc2V0SW50MzIoMCwgMiwgdHJ1ZSk7IC8vIFZlcnNpb24KICAgIGRhdGFfdmlldy5zZXRVaW50MzIoNCwgb3B0aW9ucy5iaXRzID09PSA4LCB0cnVlKTsgLy8gSXMgOCBiaXQ/CiAgICBkYXRhX3ZpZXcuc2V0SW50MzIoOCwgc2FtcGxlX3JhdGUsIHRydWUpOyAvLyBTYW1wbGUgcmF0ZQogICAgZGF0YV92aWV3LnNldEludDMyKDEyLCBzY2FsZSwgdHJ1ZSk7IC8vIFNjYWxlCiAgICBkYXRhX3ZpZXcuc2V0SW50MzIoMTYsIGRhdGFfbGVuZ3RoLCB0cnVlKTsgLy8gTGVuZ3RoCiAgICBkYXRhX3ZpZXcuc2V0SW50MzIoMjAsIG91dHB1dF9jaGFubmVscywgdHJ1ZSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzYW1wbGUgPSAwOwogICAgICBpZiAob3V0cHV0X2NoYW5uZWxzID09PSAxKSB7CiAgICAgICAgZm9yICh2YXIgX2NoYW5uZWwgPSAwOyBfY2hhbm5lbCA8IGNoYW5uZWxzLmxlbmd0aDsgKytfY2hhbm5lbCkgewogICAgICAgICAgc2FtcGxlICs9IGNoYW5uZWxzW19jaGFubmVsXVtpXTsKICAgICAgICB9CiAgICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihyYW5nZV9tYXggKiBzYW1wbGUgKiBhbXBsaXR1ZGVfc2NhbGUgLyBjaGFubmVscy5sZW5ndGgpOwogICAgICAgIGlmIChzYW1wbGUgPCBtaW5fdmFsdWVbMF0pIHsKICAgICAgICAgIG1pbl92YWx1ZVswXSA9IHNhbXBsZTsKICAgICAgICAgIGlmIChtaW5fdmFsdWVbMF0gPCByYW5nZV9taW4pIHsKICAgICAgICAgICAgbWluX3ZhbHVlWzBdID0gcmFuZ2VfbWluOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc2FtcGxlID4gbWF4X3ZhbHVlWzBdKSB7CiAgICAgICAgICBtYXhfdmFsdWVbMF0gPSBzYW1wbGU7CiAgICAgICAgICBpZiAobWF4X3ZhbHVlWzBdID4gcmFuZ2VfbWF4KSB7CiAgICAgICAgICAgIG1heF92YWx1ZVswXSA9IHJhbmdlX21heDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgX2NoYW5uZWwyID0gMDsgX2NoYW5uZWwyIDwgb3V0cHV0X2NoYW5uZWxzOyArK19jaGFubmVsMikgewogICAgICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihyYW5nZV9tYXggKiBjaGFubmVsc1tfY2hhbm5lbDJdW2ldICogYW1wbGl0dWRlX3NjYWxlKTsKICAgICAgICAgIGlmIChzYW1wbGUgPCBtaW5fdmFsdWVbX2NoYW5uZWwyXSkgewogICAgICAgICAgICBtaW5fdmFsdWVbX2NoYW5uZWwyXSA9IHNhbXBsZTsKICAgICAgICAgICAgaWYgKG1pbl92YWx1ZVtfY2hhbm5lbDJdIDwgcmFuZ2VfbWluKSB7CiAgICAgICAgICAgICAgbWluX3ZhbHVlW19jaGFubmVsMl0gPSByYW5nZV9taW47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChzYW1wbGUgPiBtYXhfdmFsdWVbX2NoYW5uZWwyXSkgewogICAgICAgICAgICBtYXhfdmFsdWVbX2NoYW5uZWwyXSA9IHNhbXBsZTsKICAgICAgICAgICAgaWYgKG1heF92YWx1ZVtfY2hhbm5lbDJdID4gcmFuZ2VfbWF4KSB7CiAgICAgICAgICAgICAgbWF4X3ZhbHVlW19jaGFubmVsMl0gPSByYW5nZV9tYXg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCsrc2NhbGVfY291bnRlciA9PT0gc2NhbGUpIHsKICAgICAgICBmb3IgKHZhciBfY2hhbm5lbDMgPSAwOyBfY2hhbm5lbDMgPCBvdXRwdXRfY2hhbm5lbHM7IF9jaGFubmVsMysrKSB7CiAgICAgICAgICBpZiAob3B0aW9ucy5iaXRzID09PSA4KSB7CiAgICAgICAgICAgIGRhdGFfdmlldy5zZXRJbnQ4KG9mZnNldCsrLCBtaW5fdmFsdWVbX2NoYW5uZWwzXSk7CiAgICAgICAgICAgIGRhdGFfdmlldy5zZXRJbnQ4KG9mZnNldCsrLCBtYXhfdmFsdWVbX2NoYW5uZWwzXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkYXRhX3ZpZXcuc2V0SW50MTYob2Zmc2V0LCBtaW5fdmFsdWVbX2NoYW5uZWwzXSwgdHJ1ZSk7CiAgICAgICAgICAgIGRhdGFfdmlldy5zZXRJbnQxNihvZmZzZXQgKyAyLCBtYXhfdmFsdWVbX2NoYW5uZWwzXSwgdHJ1ZSk7CiAgICAgICAgICAgIG9mZnNldCArPSA0OwogICAgICAgICAgfQogICAgICAgICAgbWluX3ZhbHVlW19jaGFubmVsM10gPSBJbmZpbml0eTsKICAgICAgICAgIG1heF92YWx1ZVtfY2hhbm5lbDNdID0gLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICBzY2FsZV9jb3VudGVyID0gMDsKICAgICAgfQogICAgfQogICAgaWYgKHNjYWxlX2NvdW50ZXIgPiAwKSB7CiAgICAgIGZvciAodmFyIF9jaGFubmVsNCA9IDA7IF9jaGFubmVsNCA8IG91dHB1dF9jaGFubmVsczsgX2NoYW5uZWw0KyspIHsKICAgICAgICBpZiAob3B0aW9ucy5iaXRzID09PSA4KSB7CiAgICAgICAgICBkYXRhX3ZpZXcuc2V0SW50OChvZmZzZXQrKywgbWluX3ZhbHVlW19jaGFubmVsNF0pOwogICAgICAgICAgZGF0YV92aWV3LnNldEludDgob2Zmc2V0KyssIG1heF92YWx1ZVtfY2hhbm5lbDRdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGF0YV92aWV3LnNldEludDE2KG9mZnNldCwgbWluX3ZhbHVlW19jaGFubmVsNF0sIHRydWUpOwogICAgICAgICAgZGF0YV92aWV3LnNldEludDE2KG9mZnNldCArIDIsIG1heF92YWx1ZVtfY2hhbm5lbDRdLCB0cnVlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBidWZmZXI7CiAgfQoKICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoZXZ0KSB7CiAgICB2YXIgYnVmZmVyID0gZ2VuZXJhdGVXYXZlZm9ybURhdGEoZXZ0LmRhdGEpOwoKICAgIC8vIFRyYW5zZmVyIGJ1ZmZlciB0byB0aGUgY2FsbGluZyB0aHJlYWQKICAgIHRoaXMucG9zdE1lc3NhZ2UoYnVmZmVyLCBbYnVmZmVyXSk7CiAgICB0aGlzLmNsb3NlKCk7CiAgfTsKCn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXdhdmVmb3JtLWRhdGEtd29ya2VyLmpzLm1hcAoK",null,!1);function _(e){if(function(t){return t&&"object"===r(t)&&"sample_rate"in t&&"samples_per_pixel"in t&&"bits"in t&&"length"in t&&"data"in t}(e)&&(e=function(t){var e=t.data,a=t.channels||1,i=8===t.bits?1:2,n=2*t.length*a;if(e.length!==n)throw new Error("WaveformData.create(): Length mismatch in JSON waveform data");var s=24+e.length*i,r=new ArrayBuffer(s),g=new DataView(r);g.setInt32(0,2,!0),g.setUint32(4,8===t.bits,!0),g.setInt32(8,t.sample_rate,!0),g.setInt32(12,t.samples_per_pixel,!0),g.setInt32(16,t.length,!0),g.setInt32(20,a,!0);var h=24;if(8===t.bits)for(var I=0;I<e.length;I++)g.setInt8(h++,e[I],!0);else for(var o=0;o<e.length;o++)g.setInt16(h,e[o],!0),h+=2;return r}(e)),!function(t){var e=t&&"object"===r(t)&&"byteLength"in t;if(e){var a=new DataView(t).getInt32(0,!0);if(1!==a&&2!==a)throw new TypeError("WaveformData.create(): This waveform data version not supported")}return e}(e))throw new TypeError("WaveformData.create(): Unknown data format");this._data=new DataView(e),this._offset=2===this._version()?24:20,this._channels=[];for(var a=0;a<this.channels;a++)this._channels[a]=new t(this,a)}var m=512,A=8,f=1,p=!1,d=!1;function b(t,e,a){var i=function(t){for(var e=[],a=0;a<t.numberOfChannels;++a)e.push(t.getChannelData(a).buffer);return e}(t);if(e.disable_worker){var n=s({scale:e.scale,bits:e.bits,amplitude_scale:e.amplitude_scale,split_channels:e.split_channels,length:t.length,sample_rate:t.sampleRate,channels:i});a(void 0,new _(n),t)}else{var r=new c;r.onmessage=function(e){a(void 0,new _(e.data),t)},r.postMessage({scale:e.scale,bits:e.bits,amplitude_scale:e.amplitude_scale,split_channels:e.split_channels,length:t.length,sample_rate:t.sampleRate,channels:i},i)}}function W(t){this._inputData=t.waveformData,this._output_samples_per_pixel=t.scale,this._scale=this._inputData.scale,this._input_buffer_size=this._inputData.length;var e=this._input_buffer_size*this._inputData.scale,a=Math.ceil(e/this._output_samples_per_pixel),i=8===this._inputData.bits?1:2,n=24+2*a*this._inputData.channels*i;this._output_data=new ArrayBuffer(n),this.output_dataview=new DataView(this._output_data),this.output_dataview.setInt32(0,2,!0),this.output_dataview.setUint32(4,8===this._inputData.bits,!0),this.output_dataview.setInt32(8,this._inputData.sample_rate,!0),this.output_dataview.setInt32(12,this._output_samples_per_pixel,!0),this.output_dataview.setInt32(16,a,!0),this.output_dataview.setInt32(20,this._inputData.channels,!0),this._outputWaveformData=new _(this._output_data),this._input_index=0,this._output_index=0;var s=this._inputData.channels;this._min=new Array(s),this._max=new Array(s);for(var r=0;r<s;++r)this._input_buffer_size>0?(this._min[r]=this._inputData.channel(r).min_sample(this._input_index),this._max[r]=this._inputData.channel(r).max_sample(this._input_index)):(this._min[r]=0,this._max[r]=0);this._min_value=8===this._inputData.bits?-128:-32768,this._max_value=8===this._inputData.bits?127:32767,this._where=0,this._prev_where=0,this._stop=0,this._last_input_index=0}return _.create=function(t){return new _(t)},_.createFromAudio=function(t,e){var a=function(t){return{scale:t.scale||m,bits:t.bits||A,amplitude_scale:t.amplitude_scale||f,split_channels:t.split_channels||p,disable_worker:t.disable_worker||d}}(t);if(t.audio_context&&t.array_buffer)return function(t,e,a,i){function n(t){t||(t=new DOMException("EncodingError")),i(t),i=function(){}}var s=t.decodeAudioData(e,(function(t){b(t,a,i)}),n);s&&s.catch(n)}(t.audio_context,t.array_buffer,a,e);if(t.audio_buffer)return b(t.audio_buffer,a,e);throw new TypeError("WaveformData.createFromAudio(): Pass either an AudioContext and ArrayBuffer, or an AudioBuffer object")},W.prototype.sample_at_pixel=function(t){return Math.floor(t*this._output_samples_per_pixel)},W.prototype.next=function(){for(var t,e=0,a=this._inputData.channels;this._input_index<this._input_buffer_size&&e<1e3;){for(;Math.floor(this.sample_at_pixel(this._output_index)/this._scale)===this._input_index;){if(this._output_index>0)for(var i=0;i<a;++i)(t=this._outputWaveformData.channel(i)).set_min_sample(this._output_index-1,this._min[i]),t.set_max_sample(this._output_index-1,this._max[i]);if(this._last_input_index=this._input_index,this._output_index++,this._where=this.sample_at_pixel(this._output_index),this._prev_where=this.sample_at_pixel(this._output_index-1),this._where!==this._prev_where)for(var n=0;n<a;++n)this._min[n]=this._max_value,this._max[n]=this._min_value}for(this._where=this.sample_at_pixel(this._output_index),this._stop=Math.floor(this._where/this._scale),this._stop>this._input_buffer_size&&(this._stop=this._input_buffer_size);this._input_index<this._stop;){for(var s=0;s<a;++s){var r=(t=this._inputData.channel(s)).min_sample(this._input_index);r<this._min[s]&&(this._min[s]=r),(r=t.max_sample(this._input_index))>this._max[s]&&(this._max[s]=r)}this._input_index++}e++}if(this._input_index<this._input_buffer_size)return!1;if(this._input_index!==this._last_input_index)for(var g=0;g<a;++g)(t=this._outputWaveformData.channel(g)).set_min_sample(this._output_index-1,this._min[g]),t.set_max_sample(this._output_index-1,this._max[g]);return!0},W.prototype.getOutputData=function(){return this._output_data},_.prototype={_getResampleOptions:function(t){var e={};if(e.scale=t.scale,e.width=t.width,!g(e.width)&&("number"!=typeof e.width||e.width<=0))throw new RangeError("WaveformData.resample(): width should be a positive integer value");if(!g(e.scale)&&("number"!=typeof e.scale||e.scale<=0))throw new RangeError("WaveformData.resample(): scale should be a positive integer value");if(!e.scale&&!e.width)throw new Error("WaveformData.resample(): Missing scale or width option");if(e.width&&(e.scale=Math.floor(this.duration*this.sample_rate/e.width)),e.scale<this.scale)throw new Error("WaveformData.resample(): Zoom level "+e.scale+" too low, minimum: "+this.scale);return e.abortSignal=t.abortSignal,e},resample:function(t){(t=this._getResampleOptions(t)).waveformData=this;for(var e=new W(t);!e.next(););return new _(e.getOutputData())},concat:function(){var t=this,e=Array.prototype.slice.call(arguments);e.forEach((function(e){if(t.channels!==e.channels||t.sample_rate!==e.sample_rate||t.bits!==e.bits||t.scale!==e.scale)throw new Error("WaveformData.concat(): Waveforms are incompatible")}));var a=this._concatBuffers.apply(this,e);return _.create(a)},_concatBuffers:function(){for(var t=Array.prototype.slice.call(arguments),e=this._offset,a=e,i=0,n=[this].concat(t).map((function(t){return t._data.buffer})),s=0;s<n.length;s++){var r=n[s],g=new DataView(r).getInt32(16,!0);a+=r.byteLength-e,i+=g}for(var h=new ArrayBuffer(a),I=new DataView(n[0]),o=new DataView(h),l=0;l<e;l++)o.setUint8(l,I.getUint8(l));o.setInt32(16,i,!0);for(var u=0,C=new Uint8Array(h,e),c=0;c<n.length;c++){var _=n[c];C.set(new Uint8Array(_,e),u),u+=_.byteLength-e}return h},slice:function(t){var e=0,a=0;if(g(t.startIndex)||g(t.endIndex)?g(t.startTime)||g(t.endTime)||(e=this.at_time(t.startTime),a=this.at_time(t.endTime)):(e=t.startIndex,a=t.endIndex),e<0)throw new RangeError("startIndex or startTime must not be negative");if(a<0)throw new RangeError("endIndex or endTime must not be negative");e>this.length&&(e=this.length),a>this.length&&(a=this.length),e>a&&(e=a);var i=a-e,n=8===this.bits?1:2,s=24+2*i*this.channels*n,r=new ArrayBuffer(s),h=new DataView(r);h.setInt32(0,2,!0),h.setUint32(4,8===this.bits,!0),h.setInt32(8,this.sample_rate,!0),h.setInt32(12,this.scale,!0),h.setInt32(16,i,!0),h.setInt32(20,this.channels,!0);for(var I=0;I<i*this.channels*2;I++){var o=this._at(e*this.channels*2+I);8===this.bits?h.setInt8(24+I,o):h.setInt16(24+2*I,o,!0)}return new _(r)},_version:function(){return this._data.getInt32(0,!0)},get length(){return this._data.getUint32(16,!0)},get bits(){return Boolean(this._data.getUint32(4,!0))?8:16},get duration(){return this.length*this.scale/this.sample_rate},get pixels_per_second(){return this.sample_rate/this.scale},get seconds_per_pixel(){return this.scale/this.sample_rate},get channels(){return 2===this._version()?this._data.getInt32(20,!0):1},channel:function(t){if(t>=0&&t<this._channels.length)return this._channels[t];throw new RangeError("Invalid channel: "+t)},get sample_rate(){return this._data.getInt32(8,!0)},get scale(){return this._data.getInt32(12,!0)},_at:function(t){return 8===this.bits?this._data.getInt8(this._offset+t):this._data.getInt16(this._offset+2*t,!0)},_set_at:function(t,e){return 8===this.bits?this._data.setInt8(this._offset+t,e):this._data.setInt16(this._offset+2*t,e,!0)},at_time:function(t){return Math.floor(t*this.sample_rate/this.scale)},time:function(t){return t*this.scale/this.sample_rate},toJSON:function(){for(var t={version:2,channels:this.channels,sample_rate:this.sample_rate,samples_per_pixel:this.scale,bits:this.bits,length:this.length,data:[]},e=0;e<this.length;e++)for(var a=0;a<this.channels;a++)t.data.push(this.channel(a).min_sample(e)),t.data.push(this.channel(a).max_sample(e));return t},toArrayBuffer:function(){return this._data.buffer}},_}));
//# sourceMappingURL=waveform-data.min.js.map