UNPKG

voicemeeter-connector

Version:
3 lines (2 loc) 15.8 kB
import e from"koffi";import t from"winreg";var r,n,a;!function(e){e.Mono="Mono",e.Mute="Mute",e.Solo="Solo",e.MC="MC",e.Gain="Gain",e.Pan_x="Pan_x",e.Pan_y="Pan_y",e.Color_x="Color_x",e.Color_y="Color_y",e.fx_x="fx_x",e.fx_y="fx_y",e.Audibility="Audibility",e.Comp="Comp",e.Gate="Gate",e.EqGain1="EqGain1",e.EqGain2="EqGain2",e.EqGain3="EqGain3",e.Label="Label",e.A1="A1",e.A2="A2",e.A3="A3",e.A4="A4",e.A5="A5",e.B1="B1",e.B2="B2",e.B3="B3",e.FadeTo="FadeTo"}(r||(r={})),function(e){e.Mono="Mono",e.Mute="Mute",e.EQ="EQ.on",e.Gain="Gain",e.NormalMode="mode.normal",e.AmixMode="mode.Amix",e.BmixMode="mode.Bmix",e.RepeatMode="mode.Repeat",e.CompositeMode="mode.Composite",e.FadeTo="FadeTo",e.Label="Label"}(n||(n={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.STATEONLY=2]="STATEONLY",e[e.TRIGGER=3]="TRIGGER",e[e.COLOR=4]="COLOR"}(a||(a={}));var o,i,l={pointer:null,awaitUnregister:[],ended:!0};!function(e){e[e.INPUT=1]="INPUT",e[e.OUTPUT=2]="OUTPUT",e[e.MAIN=4]="MAIN"}(o||(o={})),function(e){e[e.STARTING=1]="STARTING",e[e.ENDING=2]="ENDING",e[e.CHANGE=3]="CHANGE",e[e.BUFFER_IN=10]="BUFFER_IN",e[e.BUFFER_OUT=11]="BUFFER_OUT",e[e.BUFFER_MAIN=20]="BUFFER_MAIN"}(i||(i={}));var c,u=e.struct("VBVMR_T_AUDIOINFO",{samplerate:"long",nbSamplePerFrame:"long"}),s=e.struct("VBVMR_T_AUDIOBUFFER",{audiobuffer_sr:"long",audiobuffer_nbs:"long",audiobuffer_nbi:"long",audiobuffer_nbo:"long",audiobuffer_r:e.array("float*",128),audiobuffer_w:e.array("float*",128)});function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},f.apply(null,arguments)}function _(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}var v,p,V,m,g=/*#__PURE__*/function(){function t(){var t,r=this;this.isInitialised=!1,this.isConnected=!1,this.outputDevices=[],this.inputDevices=[],this.version="",this.type=void 0,this.eventPool=[],this.stringParameters=["Label","FadeTo","FadeBy","AppGain","AppMute","name","ip"],this.timerInterval=void 0,this.audioCallbackStates=((t={})[o.MAIN]=f({},l),t[o.INPUT]=f({},l),t[o.OUTPUT]=f({},l),t),this.awaitAudioCallbackEvents={start:[],stop:[]},this.connect=function(){if(!r.isInitialised)throw new Error("Await the initialisation before connect");if(r.isConnected)return{success:!0,message:"Already connected.",code:0};var e=p.VBVMR_Login();switch(e){case 0:return r.isConnected=!0,r.type=r.getVoicemeeterType(),r.version=r.getVoicemeeterVersion(),r.timerInterval=setInterval(r.checkPropertyChange,10),{success:!0,message:"Successfully connected to VoiceMeeter (VM Running).",code:0};case 1:return r.isConnected=!0,r.type=void 0,r.version="Unknown",r.timerInterval=setInterval(r.checkPropertyChange,10),{success:!0,message:"Connected to VoiceMeeter API (VM App Not Running).",code:1};case-1:throw r.isConnected=!1,new Error("VoiceMeeter connection failed: Unable to get client (Unexpected error -1).");case-2:throw r.isConnected=!1,new Error("VoiceMeeter connection failed: Unexpected login (Expected logout first -2).");default:throw r.isConnected=!1,new Error("VoiceMeeter connection failed with unknown error code: "+e+".")}},this.disconnect=function(){if(!r.isConnected)throw new Error("Not connected ");try{if(r.unregisterAllAudioCallbacks().catch(function(){}),0===p.VBVMR_Logout())return clearInterval(r.timerInterval),void(r.isConnected=!1);throw new Error("Disconnect failed")}catch(e){throw new Error("Disconnect failed")}},this.updateDeviceList=function(){if(!r.isConnected)throw new Error("Not connected ");r.outputDevices=[],r.inputDevices=[];for(var e=p.VBVMR_Output_GetDeviceNumber(),t=0;t<e;t++){var n=Buffer.alloc(256),a=Buffer.alloc(256),o=[0];p.VBVMR_Output_GetDeviceDescA(t,o,a,n),r.outputDevices.push({name:a.toString().replaceAll(/\u0000+$/g,""),hardwareId:n.toString().replaceAll(/\u0000+$/g,""),type:o[0]})}for(var i=p.VBVMR_Input_GetDeviceNumber(),l=0;l<i;l++){var c=Buffer.alloc(256),u=Buffer.alloc(256),s=[0];p.VBVMR_Input_GetDeviceDescA(l,s,u,c),r.inputDevices.push({name:u.toString().replaceAll(/\u0000+$/g,""),hardwareId:c.toString().replaceAll(/\u0000+$/g,""),type:s[0]})}},this.isParametersDirty=function(){return p.VBVMR_IsParametersDirty()},this.getBusParameter=function(e,t){return r.getParameter("Bus",e,t)},this.getStripParameter=function(e,t){return r.getParameter("Strip",e,t)},this.setStripParameter=function(e,t,n){return r.setParameter("Strip",e,t,n)},this.setBusParameter=function(e,t,n){return r.setParameter("Bus",e,t,n)},this.attachChangeEvent=function(e){r.eventPool.push(e)},this.getOption=function(e){if(!r.isConnected)throw new Error("Not correct connected ");if(r.stringParameters.some(function(t){return e.includes(t)})){var t=Buffer.alloc(512);return p.VBVMR_GetParameterStringA(e,t),[].concat(String.fromCharCode.apply(null,t)).filter(function(e){return"\0"!==e}).join("")}var n=[0];return p.VBVMR_GetParameterFloat(e,n),n[0]},this.setOption=function(e){var t=Buffer.alloc(e.length+1);return t.fill(0).write(e),p.VBVMR_SetParameters(t),new Promise(function(e){setTimeout(e,200)})},this.isMacroButtonDirty=function(){return p.VBVMR_MacroButton_IsDirty()},this.getMacroButtonStatus=function(e,t){void 0===t&&(t=a.DEFAULT);var r=[0];if(0===p.VBVMR_MacroButton_GetStatus(e,r,t))return r[0];throw new Error("Failed to get macro button "+e+" status")},this.setMacroButtonStatus=function(e,t,r){if(void 0===r&&(r=a.DEFAULT),0!==p.VBVMR_MacroButton_SetStatus(e,t,r))throw new Error("Failed to set macro button "+e+" status")},this.registerAudioCallback=function(t,n,a,o){var l;if(null!==r.audioCallbackStates[t].pointer)throw new Error('Audio callback for "'+t+'" is already registered.');r.audioCallbackStates[t].pointer=e.register(function(n,l,c,u){var s;try{switch(l){case i.STARTING:r.audioCallbackStates[t].ended=!1,s={lpUser:n,nnn:u,command:l,data:r.convertToAudioCallbackInfo(c)},r.resolveAudioCallbackEvent("start");break;case i.ENDING:r.audioCallbackStates[t].ended=!0,s={lpUser:n,nnn:u,command:l,data:r.convertToAudioCallbackInfo(c)},r.resolveAudioCallbackEvent("stop");break;case i.CHANGE:var d;s={lpUser:n,nnn:u,command:l,data:r.convertToAudioCallbackInfo(c)},(null==(d=null==o?void 0:o.restartOnChangedStream)||d)&&setTimeout(function(){r.startAudioCallback().catch(function(e){var t=r.convertToErrorObject(e);t.message="Failed to restart callback after changed stream: "+t.message,a(t,s)})},50);break;case i.BUFFER_IN:case i.BUFFER_OUT:case i.BUFFER_MAIN:s={lpUser:n,nnn:u,command:l,data:r.convertToAudioCallbackBuffer(c)};break;default:return 0}if(l===i.ENDING&&r.audioCallbackStates[t].awaitUnregister.length>0&&null!==r.audioCallbackStates[t].pointer)for(e.unregister(r.audioCallbackStates[t].pointer),r.audioCallbackStates[t].pointer=null;r.audioCallbackStates[t].awaitUnregister.length>0;){var f=r.audioCallbackStates[t].awaitUnregister.shift();void 0!==f&&f()}}catch(e){var _=r.convertToErrorObject(e);return a(_,s),0}return a(null,s),0},V);var c=Buffer.alloc(64);c.write(n);var u=p.VBVMR_AudioCallbackRegister(t,r.audioCallbackStates[t].pointer,null!=(l=null==o?void 0:o.lpUser)?l:null,c);switch(u){case 0:return;case-1:throw new Error("Failed to register audio callback");case-2:var s=c.toString().replace("/\0+$/g","");throw new Error("Audio callback already registered by: "+s);default:throw new Error("Unexpected result registering audio callback: "+u)}},this.startAudioCallback=function(){return new Promise(function(e,t){var n=p.VBVMR_AudioCallbackStart();if(0!==n){var a;switch(n){case-1:a="Failed to start audio callback";break;case-2:a="No audio callback registered";break;default:a="Unexpected result starting audio callback "+n}t(new Error(a))}else r.awaitAudioCallbackEvents.start.push(function(){return e()})})},this.stopAudioCallback=function(){return new Promise(function(e,t){var n=p.VBVMR_AudioCallbackStop();if(0!==n){var a;switch(n){case-1:a="Failed to stop audio callback";break;case-2:a="No audio callback registered";break;default:a="Unexpected result stopping audio callback: "+n}t(a)}else r.awaitAudioCallbackEvents.stop.push(function(){return e()})})},this.unregisterAudioCallback=function(t){return new Promise(function(n,a){if(null!==r.audioCallbackStates[t].pointer){var o=p.VBVMR_AudioCallbackUnregister(r.audioCallbackStates[t].pointer);switch(o){case 0:return void(r.audioCallbackStates[t].ended?(e.unregister(r.audioCallbackStates[t].pointer),r.audioCallbackStates[t].pointer=null,n()):r.audioCallbackStates[t].awaitUnregister.push(function(){return n()}));case-1:a(new Error("Failed to unregister audio callback"));break;case-2:r.audioCallbackStates[t].pointer=null,n();break;default:a(new Error("Unexpected result unregistering audio callback "+o))}}else a(new Error('No audio callback registered for "'+t+'"'))})},this.unregisterAllAudioCallbacks=function(){for(var e=[],t=0,n=Object.entries(r.audioCallbackStates);t<n.length;t++){var a=n[t];null!==a[1].pointer&&e.push(r.unregisterAudioCallback(a[0]))}return Promise.all(e)},this.convertToAudioCallbackInfo=function(t){var r=e.decode(t,u);return{sampleRate:r.samplerate,samplesPerFrame:r.nbSamplePerFrame}},this.convertToAudioCallbackBuffer=function(t){for(var r=e.decode(t,s),n={sampleRate:r.audiobuffer_sr,samplesPerFrame:r.audiobuffer_nbs,inputChannelCount:r.audiobuffer_nbi,outputChannelCount:r.audiobuffer_nbo,inputChannels:[],outputChannels:[]},a=0;a<r.audiobuffer_nbi;a++)n.inputChannels.push(new Float32Array(e.view(r.audiobuffer_r[a],4*r.audiobuffer_nbs)));for(var o=0;o<r.audiobuffer_nbo;o++)n.outputChannels.push(new Float32Array(e.view(r.audiobuffer_w[o],4*r.audiobuffer_nbs)));return n},this.convertToErrorObject=function(e){return e instanceof Error?e:"string"==typeof e?new Error(e):new Error("Unknown error: "+String(e))},this.checkPropertyChange=function(){var e=!1;if(1===r.isParametersDirty()&&(e=!0),1===r.isMacroButtonDirty()&&(e=!0),e)for(var t,n=function(e){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,t){if(e){if("string"==typeof e)return d(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?d(e,t):void 0}}(e))){t&&(e=t);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(r.eventPool);!(t=n()).done;)(0,t.value)()},this.getVoicemeeterType=function(){var e=[0];if(0!==p.VBVMR_GetVoicemeeterType(e))throw new Error("running failed");switch(e[0]){case 1:return"voicemeeter";case 2:return"voicemeeterBanana";case 3:return"voicemeeterPotato";default:throw new Error("Voicemeeter seems not to be installed")}},this.getVoicemeeterVersion=function(){var e=[0];if(0!==p.VBVMR_GetVoicemeeterVersion(e))throw new Error("running failed");return((4278190080&e[0])>>24)+"."+((16711680&e[0])>>16)+"."+((65280&e[0])>>8)+"."+(255&e[0])},this.getParameter=function(e,t,n){return r.getOption(e+"["+t+"]."+n)},this.setParameter=function(e,t,n,a){if(!r.isConnected)throw new Error("Not connected ");return r.setOption(e+"["+t+"]."+n+"="+a+";")},this.getLevel=function(e,t){var r=[0];return p.VBVMR_GetLevel(e,t,r),r[0]}}var r,n;return t.prototype.resolveAudioCallbackEvent=function(e){for(;this.awaitAudioCallbackEvents[e].length>0;){var t=this.awaitAudioCallbackEvents[e].shift();void 0!==t&&t()}},r=t,(n=[{key:"$outputDevices",get:function(){return this.outputDevices}},{key:"$inputDevices",get:function(){return this.inputDevices}},{key:"$version",get:function(){return this.version}},{key:"$type",get:function(){return this.type}}])&&function(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,_(n.key),n)}}(r.prototype,n),Object.defineProperty(r,"prototype",{writable:!1}),r}();v=g,g.init=function(){try{return Promise.resolve(function(){try{var e=new t({hive:t.HKLM,key:String.raw(c||(r=["SOFTWAREWOW6432NodeMicrosoftWindowsCurrentVersionUninstallVB:Voicemeeter {17359A74-1236-5467}"],n=["\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VB:Voicemeeter {17359A74-1236-5467}"],n||(n=r.slice(0)),r.raw=n,c=r))});return Promise.resolve(new Promise(function(t){e.values(function(e,r){if(e)throw new Error(e);var n=r.find(function(e){return"UninstallString"===e.name}).value,a=n.lastIndexOf("\\");t(n.slice(0,a))})}))}catch(r){return Promise.reject(r)}var r,n}()).then(function(t){return new Promise(function(r){m||(m=new v);var n=e.load(t+"/VoicemeeterRemote64.dll");p={VBVMR_Login:n.func("long __stdcall VBVMR_Login(void)"),VBVMR_Logout:n.func("long __stdcall VBVMR_Logout(void)"),VBVMR_RunVoicemeeter:n.func("long __stdcall VBVMR_RunVoicemeeter(long mode)"),VBVMR_IsParametersDirty:n.func("long __stdcall VBVMR_IsParametersDirty(void)"),VBVMR_GetLevel:n.func("long __stdcall VBVMR_GetLevel(long type, long channel, _Out_ float* value)"),VBVMR_GetParameterFloat:n.func("long __stdcall VBVMR_GetParameterFloat(const char* param, _Out_ float* value)"),VBVMR_GetParameterStringA:n.func("long __stdcall VBVMR_GetParameterStringA(const char* param, _Out_ char* value)"),VBVMR_SetParameters:n.func("long __stdcall VBVMR_SetParameters(const char* param)"),VBVMR_Output_GetDeviceNumber:n.func("long __stdcall VBVMR_Output_GetDeviceNumber(void)"),VBVMR_Output_GetDeviceDescA:n.func("long __stdcall VBVMR_Output_GetDeviceDescA(long index, _Out_ long* type, _Out_ char* name, _Out_ char* hardwareId)"),VBVMR_Input_GetDeviceNumber:n.func("long __stdcall VBVMR_Input_GetDeviceNumber(void)"),VBVMR_Input_GetDeviceDescA:n.func("long __stdcall VBVMR_Input_GetDeviceDescA(long index, long* type, char* name, char* hardwareId)"),VBVMR_GetVoicemeeterType:n.func("long __stdcall VBVMR_GetVoicemeeterType(_Out_ long* type)"),VBVMR_GetVoicemeeterVersion:n.func("long __stdcall VBVMR_GetVoicemeeterVersion(_Out_ long* version)"),VBVMR_MacroButton_IsDirty:n.func("long __stdcall VBVMR_MacroButton_IsDirty(void)"),VBVMR_MacroButton_GetStatus:n.func("long __stdcall VBVMR_MacroButton_GetStatus(long nuLogicalButton, _Out_ float* pValue, long bitmode)"),VBVMR_MacroButton_SetStatus:n.func("long __stdcall VBVMR_MacroButton_SetStatus(long nuLogicalButton, float fValue, long bitmode)"),VBVMR_AudioCallbackRegister:n.func("long __stdcall VBVMR_AudioCallbackRegister(long mode, void* audioCallback, void* lpUser, char* szClientName)"),VBVMR_AudioCallbackStart:n.func("long __stdcall VBVMR_AudioCallbackStart(void)"),VBVMR_AudioCallbackStop:n.func("long __stdcall VBVMR_AudioCallbackStop(void)"),VBVMR_AudioCallbackUnregister:n.func("long __stdcall VBVMR_AudioCallbackUnregister(void* audioCallback)")},V=e.pointer(e.proto("long __stdcall AudioCallback(void* lpUser, long nCommand, void* lpData, long nnn)")),m.isInitialised=!0,r(m)})})}catch(e){return Promise.reject(e)}},g.inputChannelCountMap={voicemeeter:12,voicemeeterBanana:22,voicemeeterPotato:34},g.outputChannelCountMap={voicemeeter:16,voicemeeterBanana:40,voicemeeterPotato:64};var b={__proto__:null},h=n,B={strip:0,bus:1},M=r,C=a,A=o,w=i;export{w as AudioCallbackCommands,A as AudioCallbackModes,h as BusProperties,B as InterfaceTypes,C as MacroButtonModes,M as StripProperties,g as Voicemeeter,b as types}; //# sourceMappingURL=index.module.js.map