opus-recorder
Advanced tools
Comparing version 7.0.0 to 8.0.0
@@ -1,1 +0,1 @@ | ||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Recorder=t():e.Recorder=t()}("undefined"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";(function(t){const{version:i}=o(2);var n=t.AudioContext||t.webkitAudioContext,r=function(e={}){if(!r.isRecordingSupported())throw new Error("Recording is not supported in this browser");this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};r.isRecordingSupported=function(){const e=t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia;return n&&e&&t.WebAssembly},r.version=i,r.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach(e=>e.stop()):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},r.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],o=0;o<e.numberOfChannels;o++)t[o]=e.getChannelData(o);this.encoder.postMessage({command:"encode",buffers:t})}},r.prototype.initAudioContext=function(e){e&&e.context?(this.audioContext=e.context,this.closeAudioContext=!1):(this.audioContext=new n,this.closeAudioContext=!0)},r.prototype.initAudioGraph=function(){this.encodeBuffers=function(){delete this.encodeBuffers},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain)},r.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},r.prototype.loadWorker=function(){if(!this.encoder){if(this.audioContext.audioWorklet)return this.audioContext.audioWorklet.addModule(this.config.encoderPath).then(()=>{this.encoderNode=new AudioWorkletNode(this.audioContext,"encoder-worklet",{numberOfOutputs:0}),this.encoder=this.encoderNode.port});console.log("audioWorklet support not detected. Falling back to scriptProcessor"),this.encoderNode=this.audioContext.createScriptProcessor(this.config.bufferLength,this.config.numberOfChannels,this.config.numberOfChannels),this.encoderNode.onaudioprocess=({inputBuffer:e})=>this.encodeBuffers(e),this.encoder=new t.Worker(this.config.encoderPath)}return Promise.resolve()},r.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker().then(()=>new Promise(t=>{var o=({data:i})=>{switch(i.message){case"ready":t();break;case"page":this.encodedSamplePosition=i.samplePosition,e(i.page);break;case"done":this.encoder.removeEventListener("message",o),this.finish()}};this.encoder.addEventListener("message",o),this.encoder.start&&this.encoder.start(),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))}))},r.prototype.pause=function(e){if("recording"===this.state)return this.state="paused",this.recordingGainNode.disconnect(),e&&this.config.streamPages?new Promise(e=>{var t=({data:o})=>{"flushed"===o.message&&(this.encoder.removeEventListener("message",t),this.onpause(),e())};this.encoder.addEventListener("message",t),this.encoder.start&&this.encoder.start(),this.encoder.postMessage({command:"flush"})}):(this.onpause(),Promise.resolve())},r.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.recordingGainNode.connect(this.encoderNode),this.onresume())},r.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},r.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},r.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,Promise.all([this.initSourceNode(e),this.initWorker()]).then(e=>{this.state="recording",this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode=e[0],this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode),this.recordingGainNode.connect(this.encoderNode),this.encoderNode.onaudioprocess&&this.encoderNode.connect(this.audioContext.destination),this.onstart()})},r.prototype.stop=function(){return"inactive"!==this.state?(this.state="inactive",this.monitorGainNode.disconnect(),this.encoderNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream(),new Promise(e=>{var t=({data:o})=>{"done"===o.message&&(this.encoder&&this.encoder.removeEventListener("message",t),e())};this.encoder.addEventListener("message",t),this.encoder.start&&this.encoder.start(),this.encoder.postMessage({command:"done"}),this.encoder.postMessage({command:"close"})})):Promise.resolve()},r.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},r.prototype.streamPage=function(e){this.ondataavailable(e)},r.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),delete this.encoder},r.prototype.ondataavailable=function(){},r.prototype.onpause=function(){},r.prototype.onresume=function(){},r.prototype.onstart=function(){},r.prototype.onstop=function(){},e.exports=r}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(e){"object"==typeof window&&(o=window)}e.exports=o},function(e){e.exports=JSON.parse('{"name":"opus-recorder","version":"7.0.0","description":"A library for recording opus encoded audio","homepage":"https://github.com/chris-rudmin/opus-recorder","author":"Chris Rudmin","keywords":["Ogg","Opus","PCM","Decoder","Resampler","Streamer","Audio","Microphone","Recorder","Wav","Wave","WebAssembly"],"license":"MIT","main":"dist/recorder.min.js","files":["dist/"],"repository":{"type":"git","url":"git://github.com/chris-rudmin/opus-recorder.git"},"bugs":{"url":"https://github.com/chris-rudmin/opus-recorder/issues","email":"chris.rudmin@gmail.com"},"scripts":{"make":"make","test":"make test","webpack":"webpack"},"devDependencies":{"chai":"^4.2.0","mocha":"^8.0.1","promise":"^8.1.0","require-uncached":"^2.0.0","sinon":"^9.0.2","sinon-chai":"^3.5.0","webpack":"^4.43.0","webpack-cli":"^3.3.12"},"dependencies":{}}')}])})); | ||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Recorder=t():e.Recorder=t()}("undefined"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";(function(t){const{version:i}=o(2);var n=t.AudioContext||t.webkitAudioContext,r=function(e={}){if(!r.isRecordingSupported())throw new Error("Recording is not supported in this browser");this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,wavBitDepth:16,sourceNode:{context:null}},e),this.encodedSamplePosition=0,this.initAudioContext(),this.initialize=this.initWorklet().then(()=>this.initEncoder())};r.isRecordingSupported=function(){const e=t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia;return n&&e&&t.WebAssembly},r.version=i,r.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach(e=>e.stop()):this.stream.stop())},r.prototype.close=function(){return this.monitorGainNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode&&this.sourceNode.disconnect(),this.clearStream(),this.encoder&&(this.encoderNode.disconnect(),this.encoder.postMessage({command:"close"})),this.config.sourceNode.context?Promise.resolve():this.audioContext.close()},r.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],o=0;o<e.numberOfChannels;o++)t[o]=e.getChannelData(o);this.encoder.postMessage({command:"encode",buffers:t})}},r.prototype.initAudioContext=function(){this.audioContext=this.config.sourceNode.context?this.config.sourceNode.context:new n,this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain)},r.prototype.initEncoder=function(){this.audioContext.audioWorklet?(this.encoderNode=new AudioWorkletNode(this.audioContext,"encoder-worklet",{numberOfOutputs:0}),this.encoder=this.encoderNode.port):(console.log("audioWorklet support not detected. Falling back to scriptProcessor"),this.encodeBuffers=()=>delete this.encodeBuffers,this.encoderNode=this.audioContext.createScriptProcessor(this.config.bufferLength,this.config.numberOfChannels,this.config.numberOfChannels),this.encoderNode.onaudioprocess=({inputBuffer:e})=>this.encodeBuffers(e),this.encoderNode.connect(this.audioContext.destination),this.encoder=new t.Worker(this.config.encoderPath))},r.prototype.initSourceNode=function(){return this.config.sourceNode.context?(this.sourceNode=this.config.sourceNode,Promise.resolve()):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>{this.stream=e,this.sourceNode=this.audioContext.createMediaStreamSource(e)})},r.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,new Promise(t=>{var o=({data:i})=>{switch(i.message){case"ready":t();break;case"page":this.encodedSamplePosition=i.samplePosition,e(i.page);break;case"done":this.encoder.removeEventListener("message",o),this.finish()}};this.encoder.addEventListener("message",o),this.encoder.start&&this.encoder.start();const{sourceNode:i,...n}=this.config;this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},n))})},r.prototype.initWorklet=function(){return this.audioContext.audioWorklet?this.audioContext.audioWorklet.addModule(this.config.encoderPath):Promise.resolve()},r.prototype.pause=function(e){if("recording"===this.state)return this.state="paused",this.recordingGainNode.disconnect(),e&&this.config.streamPages?new Promise(e=>{var t=({data:o})=>{"flushed"===o.message&&(this.encoder.removeEventListener("message",t),this.onpause(),e())};this.encoder.addEventListener("message",t),this.encoder.start&&this.encoder.start(),this.encoder.postMessage({command:"flush"})}):(this.onpause(),Promise.resolve())},r.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.recordingGainNode.connect(this.encoderNode),this.onresume())},r.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},r.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},r.prototype.start=function(){return"inactive"===this.state?(this.encodedSamplePosition=0,this.audioContext.resume().then(()=>this.initialize).then(()=>Promise.all([this.initSourceNode(),this.initWorker()])).then(()=>{this.state="recording",this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode.connect(this.encoderNode),this.onstart()})):Promise.resolve()},r.prototype.stop=function(){return"inactive"!==this.state?(this.state="inactive",this.recordingGainNode.connect(this.encoderNode),this.monitorGainNode.disconnect(),this.clearStream(),new Promise(e=>{var t=({data:o})=>{"done"===o.message&&(this.encoder.removeEventListener("message",t),e())};this.encoder.addEventListener("message",t),this.encoder.start&&this.encoder.start(),this.encoder.postMessage({command:"done"})})):Promise.resolve()},r.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},r.prototype.streamPage=function(e){this.ondataavailable(e)},r.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop()},r.prototype.ondataavailable=function(){},r.prototype.onpause=function(){},r.prototype.onresume=function(){},r.prototype.onstart=function(){},r.prototype.onstop=function(){},e.exports=r}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(e){"object"==typeof window&&(o=window)}e.exports=o},function(e){e.exports=JSON.parse('{"name":"opus-recorder","version":"8.0.0","description":"A library for recording opus encoded audio","homepage":"https://github.com/chris-rudmin/opus-recorder","author":"Chris Rudmin","keywords":["Ogg","Opus","PCM","Decoder","Resampler","Streamer","Audio","Microphone","Recorder","Wav","Wave","WebAssembly"],"license":"MIT","main":"dist/recorder.min.js","files":["dist/"],"repository":{"type":"git","url":"git://github.com/chris-rudmin/opus-recorder.git"},"bugs":{"url":"https://github.com/chris-rudmin/opus-recorder/issues","email":"chris.rudmin@gmail.com"},"scripts":{"make":"make","test":"make test","webpack":"webpack"},"devDependencies":{"chai":"^4.2.0","mocha":"^8.0.1","promise":"^8.1.0","require-uncached":"^2.0.0","sinon":"^9.0.2","sinon-chai":"^3.5.0","webpack":"^4.43.0","webpack-cli":"^3.3.12"},"dependencies":{}}')}])})); |
@@ -1,1 +0,1 @@ | ||
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var s in r)("object"==typeof exports?exports:e)[s]=r[s]}}("undefined"!=typeof self?self:this,(function(){return function(e){var t={};function r(s){if(t[s])return t[s].exports;var n=t[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=e,r.c=t,r.d=function(e,t,s){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(r.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(s,n,function(t){return e[t]}.bind(null,n));return s},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";const s=function(e){if(!(e=Object.assign({wavBitDepth:16,numberOfChannels:1},e)).wavSampleRate)throw new Error("wavSampleRate value is required to record. NOTE: Audio is not resampled!");if(-1===[8,16,24,32].indexOf(e.wavBitDepth))throw new Error("Only 8, 16, 24 and 32 bits per sample are supported");this.numberOfChannels=e.numberOfChannels,this.bitDepth=e.wavBitDepth,this.sampleRate=e.wavSampleRate,this.recordedBuffers=[],this.bytesPerSample=this.bitDepth/8};if(s.prototype.record=function(e){for(var t=e[0].length,r=new Uint8Array(t*this.numberOfChannels*this.bytesPerSample),s=0;s<t;s++)for(var n=0;n<this.numberOfChannels;n++){var o=(s*this.numberOfChannels+n)*this.bytesPerSample,a=Math.max(-1,Math.min(1,e[n][s]));switch(this.bytesPerSample){case 4:a=2147483647.5*a-.5,r[o]=a,r[o+1]=a>>8,r[o+2]=a>>16,r[o+3]=a>>24;break;case 3:a=8388607.5*a-.5,r[o]=a,r[o+1]=a>>8,r[o+2]=a>>16;break;case 2:a=32767.5*a-.5,r[o]=a,r[o+1]=a>>8;break;case 1:r[o]=127.5*(a+1);break;default:throw new Error("Only 8, 16, 24 and 32 bits per sample are supported")}}this.recordedBuffers.push(r)},s.prototype.requestData=function(){var e=this.recordedBuffers[0].length,t=this.recordedBuffers.length*e,r=new Uint8Array(44+t),s=new DataView(r.buffer);s.setUint32(0,1380533830,!1),s.setUint32(4,36+t,!0),s.setUint32(8,1463899717,!1),s.setUint32(12,1718449184,!1),s.setUint32(16,16,!0),s.setUint16(20,1,!0),s.setUint16(22,this.numberOfChannels,!0),s.setUint32(24,this.sampleRate,!0),s.setUint32(28,this.sampleRate*this.bytesPerSample*this.numberOfChannels,!0),s.setUint16(32,this.bytesPerSample*this.numberOfChannels,!0),s.setUint16(34,this.bitDepth,!0),s.setUint32(36,1684108385,!1),s.setUint32(40,t,!0);for(var n=0;n<this.recordedBuffers.length;n++)r.set(this.recordedBuffers[n],n*e+44);return{message:"page",page:r}},"function"==typeof registerProcessor){class e extends AudioWorkletProcessor{constructor(){super(),this.continueProcess=!0,this.port.onmessage=({data:e})=>{switch(e.command){case"done":this.recorder&&(this.postPage(this.recorder.requestData()),this.port.postMessage({message:"done"}),delete this.recorder);break;case"close":this.continueProcess=!1;break;case"init":this.recorder=new s(e),this.port.postMessage({message:"ready"})}}}process(e){return this.recorder&&e[0]&&e[0].length&&this.recorder.record(e[0]),this.continueProcess}postPage(e){e&&this.port.postMessage(e,[e.page.buffer])}}registerProcessor("encoder-worklet",e)}else{var n;onmessage=({data:e})=>{switch(e.command){case"encode":n&&n.record(e.buffers);break;case"done":n&&((t=n.requestData())&&postMessage(t,[t.page.buffer]),postMessage({message:"done"}),n=null);break;case"close":close();break;case"init":n=new s(e),postMessage({message:"ready"})}var t}}(e=e||{}).exports=s}])})); | ||
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var s in r)("object"==typeof exports?exports:e)[s]=r[s]}}("undefined"!=typeof self?self:this,(function(){return function(e){var t={};function r(s){if(t[s])return t[s].exports;var n=t[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=e,r.c=t,r.d=function(e,t,s){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(r.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(s,n,function(t){return e[t]}.bind(null,n));return s},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";const s=function(e){if(!(e=Object.assign({wavBitDepth:16,numberOfChannels:1},e)).wavSampleRate)throw new Error("wavSampleRate value is required to record. NOTE: Audio is not resampled!");if(-1===[8,16,24,32].indexOf(e.wavBitDepth))throw new Error("Only 8, 16, 24 and 32 bits per sample are supported");this.numberOfChannels=e.numberOfChannels,this.bitDepth=e.wavBitDepth,this.sampleRate=e.wavSampleRate,this.recordedBuffers=[],this.bytesPerSample=this.bitDepth/8};if(s.prototype.record=function(e){for(var t=e[0].length,r=new Uint8Array(t*this.numberOfChannels*this.bytesPerSample),s=0;s<t;s++)for(var n=0;n<this.numberOfChannels;n++){var o=(s*this.numberOfChannels+n)*this.bytesPerSample,a=Math.max(-1,Math.min(1,e[n][s]));switch(this.bytesPerSample){case 4:a=2147483647.5*a-.5,r[o]=a,r[o+1]=a>>8,r[o+2]=a>>16,r[o+3]=a>>24;break;case 3:a=8388607.5*a-.5,r[o]=a,r[o+1]=a>>8,r[o+2]=a>>16;break;case 2:a=32767.5*a-.5,r[o]=a,r[o+1]=a>>8;break;case 1:r[o]=127.5*(a+1);break;default:throw new Error("Only 8, 16, 24 and 32 bits per sample are supported")}}this.recordedBuffers.push(r)},s.prototype.requestData=function(){var e=this.recordedBuffers[0].length,t=this.recordedBuffers.length*e,r=new Uint8Array(44+t),s=new DataView(r.buffer);s.setUint32(0,1380533830,!1),s.setUint32(4,36+t,!0),s.setUint32(8,1463899717,!1),s.setUint32(12,1718449184,!1),s.setUint32(16,16,!0),s.setUint16(20,1,!0),s.setUint16(22,this.numberOfChannels,!0),s.setUint32(24,this.sampleRate,!0),s.setUint32(28,this.sampleRate*this.bytesPerSample*this.numberOfChannels,!0),s.setUint16(32,this.bytesPerSample*this.numberOfChannels,!0),s.setUint16(34,this.bitDepth,!0),s.setUint32(36,1684108385,!1),s.setUint32(40,t,!0);for(var n=0;n<this.recordedBuffers.length;n++)r.set(this.recordedBuffers[n],n*e+44);return{message:"page",page:r}},"function"==typeof registerProcessor){class e extends AudioWorkletProcessor{constructor(){super(),this.continueProcess=!0,this.port.onmessage=({data:e})=>{switch(e.command){case"done":this.recorder&&(this.postPage(this.recorder.requestData()),this.port.postMessage({message:"done"}),delete this.recorder);break;case"close":this.continueProcess=!1;break;case"init":this.recorder=new s(e),this.port.postMessage({message:"ready"})}}}process(e){return this.recorder&&e[0]&&e[0].length&&e[0][0]&&e[0][0].length&&this.recorder.record(e[0]),this.continueProcess}postPage(e){e&&this.port.postMessage(e,[e.page.buffer])}}registerProcessor("encoder-worklet",e)}else{var n;onmessage=({data:e})=>{switch(e.command){case"encode":n&&n.record(e.buffers);break;case"done":n&&((t=n.requestData())&&postMessage(t,[t.page.buffer]),postMessage({message:"done"}),n=null);break;case"close":close();break;case"init":n=new s(e),postMessage({message:"ready"})}var t}}(e=e||{}).exports=s}])})); |
{ | ||
"name": "opus-recorder", | ||
"version": "7.0.0", | ||
"version": "8.0.0", | ||
"description": "A library for recording opus encoded audio", | ||
@@ -5,0 +5,0 @@ "homepage": "https://github.com/chris-rudmin/opus-recorder", |
@@ -42,2 +42,3 @@ # Opus & Wave Recorder | ||
- **recordingGain** - (*optional*) Sets the gain of the recording input. Gain is an a-weighted value between `0` and `1`. Defaults to `1` | ||
- **sourceNode** - (*optional*) An Instance of MediaStreamAudioSourceNode to use. If a sourceNode is provided, then closing the stream and audioContext will need to be managed by the implementation. | ||
@@ -68,2 +69,8 @@ | ||
```js | ||
rec.close() | ||
``` | ||
**close** will close the audioContext, destroy the workers, disconnect the audio nodes and close the mic stream. A new Recorder instance will be required for additional recordings. if a `sourceNode` was provided in the initial config, then the implementation will need to close the audioContext and close the mic stream. | ||
```js | ||
rec.pause([flush]) | ||
@@ -93,6 +100,6 @@ ``` | ||
```js | ||
rec.start( [sourceNode] ) | ||
rec.start() | ||
``` | ||
**start** Initalizes the worker, audio context, and an audio stream and begin capturing audio. Returns a promise which resolves when recording is started. Will callback `onstart` when started. Optionally accepts a source node which can be used in place of initializing the microphone stream. For iOS support, `start` needs to be initiated from a user action. If a sourceNode is provided, then the stream and audioContext will need to be managed by the implementation. | ||
**start** Begins a new recording. Returns a promise which resolves when recording is started. Will callback `onstart` when started. `start` ***needs to be initiated from a user action*** (click or touch) so that the audioContext can be resumed and the stream can have audio data. | ||
@@ -195,4 +202,4 @@ ```js | ||
### Gotchas | ||
- To be able to read the mic stream, the page must be served over https | ||
- macOS and iOS Safari requires `rec.start()` to be called from a user initiated event. Otherwise the mic stream will be empty with no logged errors | ||
- To be able to read the mic stream, the page must be served over https. Use ngrok for local development with https. | ||
- All browsers require that `rec.start()` to be called from a user initiated event. In iOS and macOS Safari, the mic stream will be empty with no logged errors. In Chrome and Firefox the audioContext could be suspended. | ||
- macOS and iOS Safari native opus playback is not yet supported | ||
@@ -199,0 +206,0 @@ |
Sorry, the diff of this file is too big to display
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
646730
267
5