Compare commits

..

No commits in common. "f6437fcbe724ac1773eac208664d4e85d74a8f80" and "b95c40265cb4a6ee7a07d60388de5c98d271c5c7" have entirely different histories.

7 changed files with 633 additions and 519 deletions

View File

@ -1,5 +1,5 @@
/******************************************************************************/
/* Voicemeeter Remote API. V.Burel<EFBFBD>2015-2023 */
/* Voicemeeter Remote API. V.Burel©2015-2023 */
/******************************************************************************/
/* This Library allows communication with Voicemeeter applications */
/* 4 Client Applications can be connected to remote Voicemeeter. */
@ -19,14 +19,15 @@
/* long = 32 bit integer */
/******************************************************************************/
#ifndef __VOICEMEETER_REMOTE_H__
#define __VOICEMEETER_REMOTE_H__
#ifdef __cplusplus
extern "C"
{
extern "C" {
#endif
#define VBVMR_RESULT_OK 0
/******************************************************************************/
@ -55,6 +56,7 @@ extern "C"
long __stdcall VBVMR_Logout(void);
/**
@brief Run Voicemeeter Application (get installation directory and run Voicemeeter Application).
@param vType : Voicemeeter type (1 = Voicemeeter, 2= Voicemeeter Banana, 3= Voicemeeter Potato, 6 = Potato x64 bits).
@ -65,8 +67,19 @@ extern "C"
long __stdcall VBVMR_RunVoicemeeter(long vType);
/** @} */
/******************************************************************************/
/* */
/* General Information */
@ -121,8 +134,26 @@ extern "C"
long __stdcall VBVMR_GetVoicemeeterVersion(long * pVersion);
/** @} */
/******************************************************************************/
/* */
/* Get parameters */
@ -174,6 +205,14 @@ extern "C"
/** @} */
/******************************************************************************/
/* */
/* Get levels */
@ -244,6 +283,7 @@ extern "C"
long __stdcall VBVMR_GetLevel(long nType, long nuChannel, float * pValue);
/**
@brief Get MIDI message from M.I.D.I. input device used by Voicemeeter M.I.D.I. mapping.
(this function must be called from one thread only)
@ -261,8 +301,10 @@ extern "C"
-6: no MIDI data
*/
long __stdcall VBVMR_GetMidiMessage(unsigned char *pMIDIBuffer, long nbByteMax);
/**
@brief Send MIDI message to M.I.D.I. output device used by Voicemeeter M.I.D.I. mapping.
(this function must be called from one thread only)
@ -277,10 +319,21 @@ extern "C"
-5: cannot send MIDI data
*/
long __stdcall VBVMR_SendMidiMessage(unsigned char *pMIDIBuffer, long nbByte);
/** @} */
/******************************************************************************/
/* */
/* Set Parameters */
@ -308,6 +361,8 @@ extern "C"
long __stdcall VBVMR_SetParameterFloat(char * szParamName, float Value);
/**
@brief Set a single string parameters .
@param szParamName : Null Terminal ASCII String giving the name of the parameter (see parameters name table)
@ -324,9 +379,13 @@ extern "C"
*/
long __stdcall VBVMR_SetParameterStringA(char * szParamName, char * szString);
long __stdcall VBVMR_SetParameterStringW(char * szParamName, unsigned short * wszString);
/**
@brief Set one or several parameters by a script ( < 48 kB ).
@param szParamName : Null Terminal ASCII String giving the script
@ -351,12 +410,24 @@ extern "C"
long __stdcall VBVMR_SetParameters(char * szParamScript);
long __stdcall VBVMR_SetParametersW(unsigned short * szParamScript);
/** @} */
/******************************************************************************/
/* DEVICES ENUMERATOR */
/******************************************************************************/
/** @name Device Enumeration Functions
* @{ */
@ -403,8 +474,15 @@ extern "C"
long __stdcall VBVMR_Input_GetDeviceDescA(long zindex, long * nType, char * szDeviceName, char * szHardwareId);
long __stdcall VBVMR_Input_GetDeviceDescW(long zindex, long * nType, unsigned short * wszDeviceName, unsigned short * wszHardwareId);
/** @} */
/******************************************************************************/
/* VB-AUDIO CALLBACK */
/******************************************************************************/
@ -419,12 +497,14 @@ extern "C"
/** @name VB-Audio Callback Functions
* @{ */
typedef struct tagVBVMR_AUDIOINFO
{
long samplerate;
long nbSamplePerFrame;
} VBVMR_T_AUDIOINFO, *VBVMR_PT_AUDIOINFO, *VBVMR_LPT_AUDIOINFO;
typedef struct tagVBVMR_AUDIOBUFFER
{
long audiobuffer_sr; //Sampling Rate
@ -435,6 +515,7 @@ extern "C"
float * audiobuffer_w[128]; //nbo output pointers containing frame of nbs sample (of 32bits float)
} VBVMR_T_AUDIOBUFFER, *VBVMR_PT_AUDIOBUFFER, *VBVMR_LPT_AUDIOBUFFER;
/**
@brief VB-AUDIO Callback is called for different task to Initialize, perform and end your process.
VB-AUDIO Callback is part of single TIME CRITICAL Thread.
@ -452,8 +533,10 @@ extern "C"
@return : 0: always 0 (unused).
*/
typedef long (__stdcall *T_VBVMR_VBAUDIOCALLBACK)(void * lpUser, long nCommand, void * lpData, long nnn);
#define VBVMR_CBCOMMAND_STARTING 1 //command to initialize data according SR and buffer size
//info = (VBVMR_LPT_AUDIOINFO)lpData
@ -613,6 +696,7 @@ extern "C"
long __stdcall VBVMR_AudioCallbackStart(void);
long __stdcall VBVMR_AudioCallbackStop(void);
/**
@brief unregister your callback to release voicemeeter virtual driver
(this function will automatically call VBVMR_AudioCallbackStop() function)
@ -624,8 +708,15 @@ extern "C"
long __stdcall VBVMR_AudioCallbackUnregister(void);
/** @} */
/******************************************************************************/
/* */
/* Macro Buttons */
@ -681,49 +772,62 @@ extern "C"
#define VBVMR_MACROBUTTON_MODE_TRIGGER 0x00000003 //change Trigger State
#define VBVMR_MACROBUTTON_MODE_COLOR 0x00000004 //change color
/** @} */
/******************************************************************************/
/* 'C' STRUCTURED INTERFACE */
/******************************************************************************/
typedef long long(__stdcall *T_VBVMR_Login)(void);
typedef long long(__stdcall *T_VBVMR_Logout)(void);
typedef long long(__stdcall *T_VBVMR_RunVoicemeeter)(long vType);
typedef long (__stdcall *T_VBVMR_Login)(void);
typedef long (__stdcall *T_VBVMR_Logout)(void);
typedef long (__stdcall *T_VBVMR_RunVoicemeeter)(long vType);
typedef long long(__stdcall *T_VBVMR_GetVoicemeeterType)(long *pType);
typedef long long(__stdcall *T_VBVMR_GetVoicemeeterVersion)(long *pVersion);
typedef long (__stdcall *T_VBVMR_GetVoicemeeterType)(long * pType);
typedef long (__stdcall *T_VBVMR_GetVoicemeeterVersion)(long * pVersion);
typedef long long(__stdcall *T_VBVMR_IsParametersDirty)(void);
typedef long long(__stdcall *T_VBVMR_GetParameterFloat)(char *szParamName, float *pValue);
typedef long long(__stdcall *T_VBVMR_GetParameterStringA)(char *szParamName, char *szString);
typedef long long(__stdcall *T_VBVMR_GetParameterStringW)(char *szParamName, unsigned short *wszString);
typedef long (__stdcall *T_VBVMR_IsParametersDirty)(void);
typedef long (__stdcall *T_VBVMR_GetParameterFloat)(char * szParamName, float * pValue);
typedef long (__stdcall *T_VBVMR_GetParameterStringA)(char * szParamName, char * szString);
typedef long (__stdcall *T_VBVMR_GetParameterStringW)(char * szParamName, unsigned short * wszString);
typedef long long(__stdcall *T_VBVMR_GetLevel)(long nType, long nuChannel, float *pValue);
typedef long long(__stdcall *T_VBVMR_GetMidiMessage)(unsigned char *pMIDIBuffer, long nbByteMax);
typedef long long(__stdcall *T_VBVMR_SendMidiMessage)(unsigned char *pMIDIBuffer, long nbByteMax);
typedef long long(__stdcall *T_VBVMR_SetParameterFloat)(char *szParamName, float Value);
typedef long long(__stdcall *T_VBVMR_SetParameters)(char *szParamScript);
typedef long long(__stdcall *T_VBVMR_SetParametersW)(unsigned short *szParamScript);
typedef long long(__stdcall *T_VBVMR_SetParameterStringA)(char *szParamName, char *szString);
typedef long long(__stdcall *T_VBVMR_SetParameterStringW)(char *szParamName, unsigned short *wszString);
typedef long (__stdcall *T_VBVMR_GetLevel)(long nType, long nuChannel, float * pValue);
typedef long (__stdcall *T_VBVMR_GetMidiMessage)(unsigned char *pMIDIBuffer, long nbByteMax);
typedef long (__stdcall *T_VBVMR_SendMidiMessage)(unsigned char *pMIDIBuffer, long nbByteMax);
typedef long long(__stdcall *T_VBVMR_Output_GetDeviceNumber)(void);
typedef long long(__stdcall *T_VBVMR_Output_GetDeviceDescA)(long zindex, long *nType, char *szDeviceName, char *szHardwareId);
typedef long long(__stdcall *T_VBVMR_Output_GetDeviceDescW)(long zindex, long *nType, unsigned short *wszDeviceName, unsigned short *wszHardwareId);
typedef long long(__stdcall *T_VBVMR_Input_GetDeviceNumber)(void);
typedef long long(__stdcall *T_VBVMR_Input_GetDeviceDescA)(long zindex, long *nType, char *szDeviceName, char *szHardwareId);
typedef long long(__stdcall *T_VBVMR_Input_GetDeviceDescW)(long zindex, long *nType, unsigned short *wszDeviceName, unsigned short *wszHardwareId);
typedef long (__stdcall *T_VBVMR_SetParameterFloat)(char * szParamName, float Value);
typedef long (__stdcall *T_VBVMR_SetParameters)(char * szParamScript);
typedef long (__stdcall *T_VBVMR_SetParametersW)(unsigned short * szParamScript);
typedef long (__stdcall *T_VBVMR_SetParameterStringA)(char * szParamName, char * szString);
typedef long (__stdcall *T_VBVMR_SetParameterStringW)(char * szParamName, unsigned short * wszString);
typedef long (__stdcall *T_VBVMR_Output_GetDeviceNumber)(void);
typedef long (__stdcall *T_VBVMR_Output_GetDeviceDescA)(long zindex, long * nType, char * szDeviceName, char * szHardwareId);
typedef long (__stdcall *T_VBVMR_Output_GetDeviceDescW)(long zindex, long * nType, unsigned short * wszDeviceName, unsigned short * wszHardwareId);
typedef long (__stdcall *T_VBVMR_Input_GetDeviceNumber)(void);
typedef long (__stdcall *T_VBVMR_Input_GetDeviceDescA)(long zindex, long * nType, char * szDeviceName, char * szHardwareId);
typedef long (__stdcall *T_VBVMR_Input_GetDeviceDescW)(long zindex, long * nType, unsigned short * wszDeviceName, unsigned short * wszHardwareId);
typedef long (__stdcall *T_VBVMR_AudioCallbackRegister)(long mode, T_VBVMR_VBAUDIOCALLBACK pCallback, void * lpUser, char szClientName[64]);
typedef long (__stdcall *T_VBVMR_AudioCallbackStart)(void);
typedef long (__stdcall *T_VBVMR_AudioCallbackStop)(void);
typedef long (__stdcall *T_VBVMR_AudioCallbackUnregister)(void);
typedef long (__stdcall *T_VBVMR_MacroButton_IsDirty)(void);
typedef long (__stdcall *T_VBVMR_MacroButton_GetStatus)(long nuLogicalButton, float * pValue, long bitmode);
typedef long (__stdcall *T_VBVMR_MacroButton_SetStatus)(long nuLogicalButton, float fValue, long bitmode);
typedef long long(__stdcall *T_VBVMR_AudioCallbackRegister)(long mode, T_VBVMR_VBAUDIOCALLBACK pCallback, void *lpUser, char szClientName[64]);
typedef long long(__stdcall *T_VBVMR_AudioCallbackStart)(void);
typedef long long(__stdcall *T_VBVMR_AudioCallbackStop)(void);
typedef long long(__stdcall *T_VBVMR_AudioCallbackUnregister)(void);
typedef long long(__stdcall *T_VBVMR_MacroButton_IsDirty)(void);
typedef long long(__stdcall *T_VBVMR_MacroButton_GetStatus)(long nuLogicalButton, float *pValue, long bitmode);
typedef long long(__stdcall *T_VBVMR_MacroButton_SetStatus)(long nuLogicalButton, float fValue, long bitmode);
typedef struct tagVBVMR_INTERFACE
{
@ -763,6 +867,7 @@ extern "C"
T_VBVMR_MacroButton_GetStatus VBVMR_MacroButton_GetStatus;
T_VBVMR_MacroButton_SetStatus VBVMR_MacroButton_SetStatus;
} T_VBVMR_INTERFACE, *PT_VBVMR_INTERFACE, *LPT_VBVMR_INTERFACE;
#ifdef VBUSE_LOCALLIB
@ -770,6 +875,12 @@ extern "C"
void __stdcall VBVMR_SetHinstance(HINSTANCE hinst);
#endif
/******************************************************************************/
/* VBAN RT PACKET */
/******************************************************************************/
@ -860,6 +971,7 @@ extern "C"
#define VMRTSTATE_MODE_SEL 0x10000000
#define VMRTSTATE_MODE_MONITOR 0x20000000
#pragma pack(1)
// long = 4 bytes
@ -934,6 +1046,7 @@ extern "C"
#define VMRT_EQTYPE_LOSHELF 5
#define VMRT_EQTYPE_HISHELF 6
#define expected_size_T_VBAN_VMPARAM_STRIP (8+ (8 * sizeof(short)) + (2*6) + (3 * 6 * sizeof(float)) + ((11 + 9 + 6 + 7) * sizeof(short)))
//170
@ -967,8 +1080,14 @@ extern "C"
long VBVMR_MB_PushSettings(void * lpParam);
#ifdef __cplusplus
}
#endif
#endif /*__VOICEMEETER_REMOTE_H__*/

View File

@ -1,6 +1,7 @@
#ifndef __CDLL_H__
#define __CDLL_H__
#include <windows.h>
#include "VoicemeeterRemote.h"
long initialize_dll_interfaces(T_VBVMR_INTERFACE *iVMR);

View File

@ -3,7 +3,7 @@
void remove_name_in_path(char *szPath);
int replace_multiple_space_with_one(char *s, size_t len);
char *kind_as_string(char *s, int kind, int n);
char *kind_as_string(char *s, enum kind kind, int n);
char *version_as_string(char *, long v, int n);
#endif /* __UTIL_H__ */

View File

@ -6,7 +6,6 @@
enum kind
{
UNKNOWN = -1,
BASIC = 1,
BANANA,
POTATO,

View File

@ -1,6 +1,5 @@
#include <stdbool.h>
#include <stdio.h>
#include <windows.h>
#include "cdll.h"
#include "util.h"

View File

@ -70,9 +70,9 @@ int replace_multiple_space_with_one(char *s, size_t len)
* @param n maximum number of characters to be written to the buffer
* @return char* The kind of Voicemeeter as a string
*/
char *kind_as_string(char *s, int kind, int n)
char *kind_as_string(char *s, enum kind kind, int n)
{
static const char *kinds[] = {
char *kinds[] = {
"Basic",
"Banana",
"Potato",

View File

@ -2,8 +2,6 @@
#include <stdlib.h>
#include <stdbool.h>
#include <getopt.h>
#include <string.h>
#include <ctype.h>
#include "cdll.h"
#include "vmr.h"
#include "log.h"
@ -38,7 +36,7 @@ struct result
void help(void);
enum kind set_kind(char *kval);
int init_voicemeeter(T_VBVMR_INTERFACE *vmr, enum kind kind);
int init_voicemeeter(T_VBVMR_INTERFACE *vmr, int kind);
void interactive(T_VBVMR_INTERFACE *vmr);
void parse_input(T_VBVMR_INTERFACE *vmr, char *input, int len);
void parse_command(T_VBVMR_INTERFACE *vmr, char *command);
@ -48,10 +46,11 @@ bool vflag = false;
int main(int argc, char *argv[])
{
bool iflag = false,
mflag = false,
sflag = false;
bool iflag = false;
bool mflag = false;
bool sflag = false;
int opt;
char *kvalue = "";
int dvalue;
enum kind kind = BANANAX64;
@ -71,12 +70,8 @@ int main(int argc, char *argv[])
help();
exit(EXIT_SUCCESS);
case 'k':
kind = set_kind(optarg);
if (kind == UNKNOWN)
{
log_fatal("Unknown Voicemeeter kind '%s'", optarg);
exit(EXIT_FAILURE);
}
kvalue = optarg;
kind = set_kind(kvalue);
break;
case 'm':
mflag = true;
@ -95,7 +90,7 @@ int main(int argc, char *argv[])
}
else
{
log_warn(
log_error(
"-D arg out of range, expected value from 0 up to 5\n"
"Log level will default to LOG_WARN (3).\n");
}
@ -198,7 +193,8 @@ enum kind set_kind(char *kval)
}
else
{
return UNKNOWN;
log_error("Unknown Voicemeeter kind '%s'\n", kval);
exit(EXIT_FAILURE);
}
}
@ -210,18 +206,18 @@ enum kind set_kind(char *kval)
* @param kind
* @return int
*/
int init_voicemeeter(T_VBVMR_INTERFACE *vmr, enum kind kind)
int init_voicemeeter(T_VBVMR_INTERFACE *vmr, int kind)
{
int rep = initialize_dll_interfaces(vmr);
if (rep < 0)
{
if (rep == -100)
{
log_fatal("Voicemeeter is not installed");
log_error("Voicemeeter is not installed");
}
else
{
log_fatal("Error loading Voicemeeter dll with code %d\n", rep);
log_error("Error loading Voicemeeter dll with code %d\n", rep);
}
return rep;
}
@ -229,7 +225,7 @@ int init_voicemeeter(T_VBVMR_INTERFACE *vmr, enum kind kind)
rep = login(vmr, kind);
if (rep != 0)
{
log_fatal("Error logging into Voicemeeter");
log_error("Error logging into Voicemeeter");
return rep;
}