1 line
3.1 KiB
Plaintext
1 line
3.1 KiB
Plaintext
|
|
"use strict";function PCMPlayer(t){this.init(t)}PCMPlayer.prototype.init=function(t){this.option=Object.assign({},{encoding:"16bitInt",channels:1,sampleRate:8e3,flushingTime:1e3},t),this.samples=new Float32Array,this.flush=this.flush.bind(this),this.interval=setInterval(this.flush,this.option.flushingTime),this.maxValue=this.getMaxValue(),this.typedArray=this.getTypedArray(),this.createContext()},PCMPlayer.prototype.getMaxValue=function(){var t={"8bitInt":128,"16bitInt":32768,"32bitInt":2147483648,"32bitFloat":1};return t[this.option.encoding]||t["16bitInt"]},PCMPlayer.prototype.getTypedArray=function(){var t={"8bitInt":Int8Array,"16bitInt":Int16Array,"32bitInt":Int32Array,"32bitFloat":Float32Array};return t[this.option.encoding]||t["16bitInt"]},PCMPlayer.prototype.createContext=function(){this.audioCtx=new(window.AudioContext||window.webkitAudioContext),this.gainNode=this.audioCtx.createGain(),this.gainNode.gain.value=1,this.gainNode.connect(this.audioCtx.destination),this.startTime=this.audioCtx.currentTime},PCMPlayer.prototype.isTypedArray=function(t){return t.byteLength&&t.buffer&&t.buffer.constructor==ArrayBuffer},PCMPlayer.prototype.feed=function(t){var e;this.isTypedArray(t)&&(t=this.getFormatedValue(t),(e=new Float32Array(this.samples.length+t.length)).set(this.samples,0),e.set(t,this.samples.length),this.samples=e)},PCMPlayer.prototype.getFormatedValue=function(t){for(var t=new this.typedArray(t.buffer),e=new Float32Array(t.length),i=0;i<t.length;i++)e[i]=t[i]/this.maxValue;return e},PCMPlayer.prototype.volume=function(t){this.gainNode.gain.value=t},PCMPlayer.prototype.destroy=function(){this.interval&&clearInterval(this.interval),this.samples=null,this.audioCtx.close(),this.audioCtx=null},PCMPlayer.prototype.flush=function(){if(this.samples.length){for(var t,e,i,n,a=this.audioCtx.createBufferSource(),s=this.samples.length/this.option.channels,r=this.audioCtx.createBuffer(this.option.channels,s,this.option.sampleRate),o=0;o<this.option.channels;o++)for(t=r.getChannelData(o),e=o,n=50,i=0;i<s;i++)t[i]=this.samples[e],i<50&&(t[i]=t[i]*i/50),s-51<=i&&(t[i]=t[i]*n--/50),e+=this.option.channels;this.startTime<this.audioCtx.currentTime&&(this.startTime=this.audioCtx.currentTime),a.buffer=r,a.connect(this.gainNode),a.start(this.startTime),this.startTime+=r.duration,this.samples=new Float32Array}},PCMPlayer.prototype.getTimestamp=function(){return this.audioCtx?this.audioCtx.currentTime:0},PCMPlayer.prototype.play=function(t){if(this.isTypedArray(t)&&(t=this.getFormatedValue(t)).length){for(var e,i,n,a,s=this.audioCtx.createBufferSource(),r=t.length/this.option.channels,o=this.audioCtx.createBuffer(this.option.channels,r,this.option.sampleRate),h=0;h<this.option.channels;h++)for(e=o.getChannelData(h),i=h,a=50,n=0;n<r;n++)e[n]=t[i],n<50&&(e[n]=e[n]*n/50),r-51<=n&&(e[n]=e[n]*a--/50),i+=this.option.channels;this.startTime<this.audioCtx.currentTime&&(this.startTime=this.audioCtx.currentTime),s.buffer=o,s.connect(this.gainNode),s.start(this.startTime),this.startTime+=o.duration}},PCMPlayer.prototype.pause=function(){"running"===this.audioCtx.state&&this.audioCtx.suspend()},PCMPlayer.prototype.resume=function(){"suspended"===this.audioCtx.state&&this.audioCtx.resume()};
|