UNPKG

voicemeeter-connector

Version:
3 lines (2 loc) 7.96 kB
import e from"koffi";import t from"winreg";var o,r,n;!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"}(o||(o={})),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"}(r||(r={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.STATEONLY=2]="STATEONLY",e[e.TRIGGER=3]="TRIGGER",e[e.COLOR=4]="COLOR"}(n||(n={}));var i={__proto__:null,InterfaceTypes:{strip:0,bus:1},get StripProperties(){return o},get BusProperties(){return r},get MacroButtonModes(){return n}};let s,a=e=>e;var c;let l,u;class _{constructor(){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.connect=()=>{if(!this.isInitialised)throw new Error("Await the initialisation before connect");if(this.isConnected)return{success:!0,message:"Already connected.",code:0};const e=l.VBVMR_Login();switch(e){case 0:return this.isConnected=!0,this.type=this.getVoicemeeterType(),this.version=this.getVoicemeeterVersion(),this.timerInterval=setInterval(this.checkPropertyChange,10),{success:!0,message:"Successfully connected to VoiceMeeter (VM Running).",code:0};case 1:return this.isConnected=!0,this.type=void 0,this.version="Unknown",this.timerInterval=setInterval(this.checkPropertyChange,10),{success:!0,message:"Connected to VoiceMeeter API (VM App Not Running).",code:1};case-1:throw this.isConnected=!1,new Error("VoiceMeeter connection failed: Unable to get client (Unexpected error -1).");case-2:throw this.isConnected=!1,new Error("VoiceMeeter connection failed: Unexpected login (Expected logout first -2).");default:throw this.isConnected=!1,new Error(`VoiceMeeter connection failed with unknown error code: ${e}.`)}},this.disconnect=()=>{if(!this.isConnected)throw new Error("Not connected ");try{if(0===l.VBVMR_Logout())return clearInterval(this.timerInterval),void(this.isConnected=!1);throw new Error("Disconnect failed")}catch(e){throw new Error("Disconnect failed")}},this.updateDeviceList=()=>{if(!this.isConnected)throw new Error("Not connected ");this.outputDevices=[],this.inputDevices=[];const e=l.VBVMR_Output_GetDeviceNumber();for(let t=0;t<e;t++){const e=Buffer.alloc(256),o=Buffer.alloc(256),r=[0];l.VBVMR_Output_GetDeviceDescA(t,r,o,e),this.outputDevices.push({name:o.toString().replaceAll(/\u0000+$/g,""),hardwareId:e.toString().replaceAll(/\u0000+$/g,""),type:r[0]})}const t=l.VBVMR_Input_GetDeviceNumber();for(let e=0;e<t;e++){const t=Buffer.alloc(256),o=Buffer.alloc(256),r=[0];l.VBVMR_Input_GetDeviceDescA(e,r,o,t),this.inputDevices.push({name:o.toString().replaceAll(/\u0000+$/g,""),hardwareId:t.toString().replaceAll(/\u0000+$/g,""),type:r[0]})}},this.isParametersDirty=()=>l.VBVMR_IsParametersDirty(),this.getBusParameter=(e,t)=>this.getParameter("Bus",e,t),this.getStripParameter=(e,t)=>this.getParameter("Strip",e,t),this.setStripParameter=(e,t,o)=>this.setParameter("Strip",e,t,o),this.setBusParameter=(e,t,o)=>this.setParameter("Bus",e,t,o),this.attachChangeEvent=e=>{this.eventPool.push(e)},this.getOption=e=>{if(!this.isConnected)throw new Error("Not correct connected ");if(this.stringParameters.some(t=>e.includes(t))){const t=Buffer.alloc(512);return l.VBVMR_GetParameterStringA(e,t),[...String.fromCharCode.apply(null,t)].filter(e=>"\0"!==e).join("")}const t=[0];return l.VBVMR_GetParameterFloat(e,t),t[0]},this.setOption=e=>{const t=Buffer.alloc(e.length+1);return t.fill(0).write(e),l.VBVMR_SetParameters(t),new Promise(e=>{setTimeout(e,200)})},this.isMacroButtonDirty=()=>l.VBVMR_MacroButton_IsDirty(),this.getMacroButtonStatus=(e,t=n.DEFAULT)=>{const o=[0];if(0===l.VBVMR_MacroButton_GetStatus(e,o,t))return o[0];throw new Error(`Failed to get macro button ${e} status`)},this.setMacroButtonStatus=(e,t,o=n.DEFAULT)=>{if(0!==l.VBVMR_MacroButton_SetStatus(e,t,o))throw new Error(`Failed to set macro button ${e} status`)},this.checkPropertyChange=()=>{let e=!1;if(1===this.isParametersDirty()&&(e=!0),1===this.isMacroButtonDirty()&&(e=!0),e)for(const e of this.eventPool)e()},this.getVoicemeeterType=()=>{const e=[0];if(0!==l.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=()=>{const e=[0];if(0!==l.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=(e,t,o)=>this.getOption(`${e}[${t}].${o}`),this.setParameter=(e,t,o,r)=>{if(!this.isConnected)throw new Error("Not connected ");return this.setOption(`${e}[${t}].${o}=${r};`)},this.getLevel=(e,t)=>{const o=[0];return l.VBVMR_GetLevel(e,t,o),o[0]}}get $outputDevices(){return this.outputDevices}get $inputDevices(){return this.inputDevices}get $version(){return this.version}get $type(){return this.type}}c=_,_.init=async()=>{const o=await(async()=>{const e=new t({hive:t.HKLM,key:String.raw(s||(s=a`\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\VB:Voicemeeter {17359A74-1236-5467}`))});return new Promise(t=>{e.values((e,o)=>{if(e)throw new Error(e);const r=o.find(e=>"UninstallString"===e.name).value,n=r.lastIndexOf("\\");t(r.slice(0,n))})})})();return new Promise(t=>{u||(u=new c);const r=e.load(`${o}/VoicemeeterRemote64.dll`);l={VBVMR_Login:r.func("long __stdcall VBVMR_Login(void)"),VBVMR_Logout:r.func("long __stdcall VBVMR_Logout(void)"),VBVMR_RunVoicemeeter:r.func("long __stdcall VBVMR_RunVoicemeeter(long mode)"),VBVMR_IsParametersDirty:r.func("long __stdcall VBVMR_IsParametersDirty(void)"),VBVMR_GetLevel:r.func("long __stdcall VBVMR_GetLevel(long type, long channel, _Out_ float* value)"),VBVMR_GetParameterFloat:r.func("long __stdcall VBVMR_GetParameterFloat(const char* param, _Out_ float* value)"),VBVMR_GetParameterStringA:r.func("long __stdcall VBVMR_GetParameterStringA(const char* param, _Out_ char* value)"),VBVMR_SetParameters:r.func("long __stdcall VBVMR_SetParameters(const char* param)"),VBVMR_Output_GetDeviceNumber:r.func("long __stdcall VBVMR_Output_GetDeviceNumber(void)"),VBVMR_Output_GetDeviceDescA:r.func("long __stdcall VBVMR_Output_GetDeviceDescA(long index, _Out_ long* type, _Out_ char* name, _Out_ char* hardwareId)"),VBVMR_Input_GetDeviceNumber:r.func("long __stdcall VBVMR_Input_GetDeviceNumber(void)"),VBVMR_Input_GetDeviceDescA:r.func("long __stdcall VBVMR_Input_GetDeviceDescA(long index, long* type, char* name, char* hardwareId)"),VBVMR_GetVoicemeeterType:r.func("long __stdcall VBVMR_GetVoicemeeterType(_Out_ long* type)"),VBVMR_GetVoicemeeterVersion:r.func("long __stdcall VBVMR_GetVoicemeeterVersion(_Out_ long* version)"),VBVMR_MacroButton_IsDirty:r.func("long __stdcall VBVMR_MacroButton_IsDirty(void)"),VBVMR_MacroButton_GetStatus:r.func("long __stdcall VBVMR_MacroButton_GetStatus(long nuLogicalButton, _Out_ float* pValue, long bitmode)"),VBVMR_MacroButton_SetStatus:r.func("long __stdcall VBVMR_MacroButton_SetStatus(long nuLogicalButton, float fValue, long bitmode)")},u.isInitialised=!0,t(u)})};var V={__proto__:null};const{BusProperties:h,InterfaceTypes:d,StripProperties:m,MacroButtonModes:p}=i;export{h as BusProperties,d as InterfaceTypes,p as MacroButtonModes,m as StripProperties,_ as Voicemeeter,V as types}; //# sourceMappingURL=index.modern.mjs.map