Compare commits

..

No commits in common. "39540e9c3ef15f9a3b65bfefb6294bdc20d86ed7" and "88fe1f57822cdb34d9c7f1e82578c7d7d74dacb3" have entirely different histories.

6 changed files with 83 additions and 88 deletions

View File

@ -687,43 +687,43 @@ extern "C"
/* 'C' STRUCTURED INTERFACE */
/******************************************************************************/
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_Login)(void);
typedef long long(__stdcall *T_VBVMR_Logout)(void);
typedef long long(__stdcall *T_VBVMR_RunVoicemeeter)(long vType);
typedef long(__stdcall *T_VBVMR_GetVoicemeeterType)(long *pType);
typedef long(__stdcall *T_VBVMR_GetVoicemeeterVersion)(long *pVersion);
typedef long long(__stdcall *T_VBVMR_GetVoicemeeterType)(long *pType);
typedef long long(__stdcall *T_VBVMR_GetVoicemeeterVersion)(long *pVersion);
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_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_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_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(__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 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_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 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_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 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(__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_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
{

View File

@ -15,7 +15,7 @@ ifeq ($(LOG_USE_COLOR), yes)
else
CPPFLAGS := -Iinclude -MMD -MP
endif
CFLAGS = -O -Wall -W -pedantic -ansi -std=c2x
CFLAGS = -O -Wall -W -pedantic -ansi -std=c99
LDFLAGS := -Llib
LDLIBS := -lm
@ -33,6 +33,6 @@ $(BIN_DIR) $(OBJ_DIR):
pwsh -Command New-Item -Path $@ -ItemType Directory
clean:
pwsh -Command Remove-Item -Recurse $(EXE), $(OBJ_DIR) -force
pwsh -Command Remove-Item -Recurse $(EXE), $(OBJ_DIR)
-include $(OBJ:.o=.d)

View File

@ -3,7 +3,7 @@
* @author Vincent Burel, Onyx and Iris (code@onyxandiris.online)
* @brief Functions for initializing the iVMR interface.
* Defines a single public function that returns a pointer to the interface.
* @version 0.7.0
* @version 0.6.0
* @date 2024-07-06
*
* @copyright Vincent Burel(c)2015-2021 All Rights Reserved
@ -20,13 +20,6 @@
#include "util.h"
#include "log.h"
#define PRAGMA_IgnoreWCastIncompatibleFuncTypes \
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wcast-function-type\"")
#define PRAGMA_Pop \
_Pragma("GCC diagnostic pop")
static T_VBVMR_INTERFACE iVMR;
static long initialize_dll_interfaces(PT_VMR vmr);
@ -86,8 +79,6 @@ static long initialize_dll_interfaces(PT_VMR vmr)
if (G_H_Module == NULL)
return -101;
PRAGMA_IgnoreWCastIncompatibleFuncTypes;
// Get function pointers
vmr->VBVMR_Login = (T_VBVMR_Login)GetProcAddress(G_H_Module, "VBVMR_Login");
vmr->VBVMR_Logout = (T_VBVMR_Logout)GetProcAddress(G_H_Module, "VBVMR_Logout");
@ -119,8 +110,6 @@ static long initialize_dll_interfaces(PT_VMR vmr)
vmr->VBVMR_MacroButton_GetStatus = (T_VBVMR_MacroButton_GetStatus)GetProcAddress(G_H_Module, "VBVMR_MacroButton_GetStatus");
vmr->VBVMR_MacroButton_SetStatus = (T_VBVMR_MacroButton_SetStatus)GetProcAddress(G_H_Module, "VBVMR_MacroButton_SetStatus");
PRAGMA_Pop;
// check pointers are valid
if (vmr->VBVMR_Login == NULL)
return -1;

View File

@ -2,7 +2,7 @@
* @file util.c
* @author Onyx and Iris (code@onyxandiris.online)
* @brief Utility functions.
* @version 0.7.0
* @version 0.6.0
* @date 2024-07-06
*
* @copyright Copyright (c) 2024

View File

@ -2,7 +2,7 @@
* @file vmrcli.c
* @author Onyx and Iris (code@onyxandiris.online)
* @brief A Voicemeeter Remote Command Line Interface
* @version 0.7.0
* @version 0.6.0
* @date 2024-07-06
*
* @copyright Copyright (c) 2024
@ -21,17 +21,6 @@
#include "log.h"
#include "util.h"
#define USAGE "Usage: .\\vmrcli.exe [-h] [-i] [-k] [-D] [-v] [-c] [-m] [-s] <api commands>\n" \
"Where: \n" \
"\th: Prints the help message\n" \
"\ti: Enable interactive mode\n" \
"\tk: The kind of Voicemeeter (basic, banana, potato)\n" \
"\tD: Set log level 0=TRACE, 1=DEBUG, 2=INFO, 3=WARN, 4=ERROR, 5=FATAL\n" \
"\tv: Enable extra console output (toggle, set messages)\n" \
"\tc: Load a user configuration (give the full file path)\n" \
"\tm: Launch the MacroButtons application\n" \
"\ts: Launch the StreamerView application"
#define OPTSTR ":hk:msc:iD:v"
#define MAX_LINE 512
/**
@ -58,7 +47,7 @@ struct result
static bool vflag = false;
static void usage(void);
void help(void);
enum kind set_kind(char *kval);
void interactive(PT_VMR vmr);
void parse_input(PT_VMR vmr, char *input);
@ -78,16 +67,19 @@ int main(int argc, char *argv[])
if (argc == 1)
{
usage();
help();
exit(EXIT_SUCCESS);
}
log_set_level(LOG_WARN);
opterr = 0;
while ((opt = getopt(argc, argv, OPTSTR)) != -1)
while ((opt = getopt(argc, argv, "hk:msc:iD:v")) != -1)
{
switch (opt)
{
case 'h':
help();
exit(EXIT_SUCCESS);
case 'k':
kind = set_kind(optarg);
if (kind == UNKNOWN)
@ -125,26 +117,14 @@ int main(int argc, char *argv[])
case 'v':
vflag = true;
break;
case '?':
log_fatal("unknown option -- '%c'\n"
"Try .\\vmrcli.exe -h for more information.",
optopt);
exit(EXIT_FAILURE);
case ':':
log_fatal("missing argument for option -- '%c'\n"
"Try .\\vmrcli.exe -h for more information.",
optopt);
exit(EXIT_FAILURE);
case 'h':
[[fallthrough]];
default:
usage();
abort();
}
}
PT_VMR vmr = create_interface();
long rep = login(vmr, kind);
int rep = login(vmr, kind);
if (rep != 0)
{
log_fatal("Error logging into the Voicemeeter API");
@ -185,24 +165,33 @@ int main(int argc, char *argv[])
}
rep = logout(vmr);
if (rep != 0)
if (rep == 0)
{
log_fatal("Error logging out of the Voicemeeter API");
return EXIT_FAILURE;
return EXIT_SUCCESS;
}
else
{
return EXIT_SUCCESS;
log_fatal("Error logging out of the Voicemeeter API");
return EXIT_FAILURE;
}
}
/**
* @brief prints the help message
*/
static void usage()
void help()
{
puts(USAGE);
exit(EXIT_SUCCESS);
puts(
"Usage: .\\vmrcli.exe [-h] [-i] [-k] [-D] [-v] [-c] [-m] [-s] <api commands>\n"
"Where: \n"
"\th: Prints the help message\n"
"\ti: Enable interactive mode\n"
"\tk: The kind of Voicemeeter (basic, banana, potato)\n"
"\tD: Set log level 0=TRACE, 1=DEBUG, 2=INFO, 3=WARN, 4=ERROR, 5=FATAL\n"
"\tv: Enable extra console output (toggle, set messages)\n"
"\tc: Load a user configuration (give the full file path)\n"
"\tm: Launch the MacroButtons application\n"
"\ts: Launch the StreamerView application");
}
/**
@ -215,13 +204,30 @@ static void usage()
enum kind set_kind(char *kval)
{
if (strcmp(kval, "basic") == 0)
return sizeof(void *) == 8 ? BASICX64 : BASIC;
else if (strcmp(kval, "banana") == 0)
return sizeof(void *) == 8 ? BANANAX64 : BANANA;
else if (strcmp(kval, "potato") == 0)
return sizeof(void *) == 8 ? POTATOX64 : POTATO;
{
if (sizeof(void *) == 8)
return BASICX64;
else
return BASIC;
}
else if (strcmp(kval, "banana") == 0)
{
if (sizeof(void *) == 8)
return BANANAX64;
else
return BANANA;
}
else if (strcmp(kval, "potato") == 0)
{
if (sizeof(void *) == 8)
return POTATOX64;
else
return POTATO;
}
else
{
return UNKNOWN;
}
}
/**

View File

@ -2,7 +2,7 @@
* @file wrapper.c
* @author Onyx and Iris (code@onyxandiris.online)
* @brief Provides public functions that wrap the iVMR calls
* @version 0.7.0
* @version 0.6.0
* @date 2024-07-06
*
* @copyright Copyright (c) 2024
@ -30,7 +30,7 @@
*/
long login(PT_VMR vmr, int kind)
{
long rep;
int rep;
long v;
log_trace("VBVMR_Login()");
@ -75,7 +75,7 @@ long login(PT_VMR vmr, int kind)
*/
long logout(PT_VMR vmr)
{
long rep;
int rep;
Sleep(20); /* give time for last command */
log_trace("VBVMR_Logout()");