Compare commits

...

7 Commits

Author SHA1 Message Date
39540e9c3e add pragma macros,
silences -Wcast-function-type
2024-07-09 15:57:38 +01:00
af98dead75 swap blocks. 2024-07-09 15:11:48 +01:00
ad91a7f4e6 log fatal exit points 2024-07-09 13:18:57 +01:00
8d9e70b79a patch bump 2024-07-09 13:14:52 +01:00
d7d42e4b21 upd makefile to compile for c2x
replace fallthrough comment with fallthrough attribute
2024-07-09 12:59:46 +01:00
babec7abbb revert func signatures, we're getting compile warnings anyway 2024-07-09 12:58:06 +01:00
b2bdd21da5 add USAGE, OPTSTR macros
rename help() to usage()

log_warn() an unknown option

condense set_kind()
2024-07-09 12:43:32 +01:00
6 changed files with 89 additions and 84 deletions

View File

@ -687,43 +687,43 @@ extern "C"
/* 'C' STRUCTURED INTERFACE */ /* 'C' STRUCTURED INTERFACE */
/******************************************************************************/ /******************************************************************************/
typedef long long(__stdcall *T_VBVMR_Login)(void); typedef long(__stdcall *T_VBVMR_Login)(void);
typedef long long(__stdcall *T_VBVMR_Logout)(void); typedef long(__stdcall *T_VBVMR_Logout)(void);
typedef long long(__stdcall *T_VBVMR_RunVoicemeeter)(long vType); typedef long(__stdcall *T_VBVMR_RunVoicemeeter)(long vType);
typedef long long(__stdcall *T_VBVMR_GetVoicemeeterType)(long *pType); typedef long(__stdcall *T_VBVMR_GetVoicemeeterType)(long *pType);
typedef long long(__stdcall *T_VBVMR_GetVoicemeeterVersion)(long *pVersion); typedef long(__stdcall *T_VBVMR_GetVoicemeeterVersion)(long *pVersion);
typedef long long(__stdcall *T_VBVMR_IsParametersDirty)(void); typedef long(__stdcall *T_VBVMR_IsParametersDirty)(void);
typedef long long(__stdcall *T_VBVMR_GetParameterFloat)(char *szParamName, float *pValue); typedef long(__stdcall *T_VBVMR_GetParameterFloat)(char *szParamName, float *pValue);
typedef long long(__stdcall *T_VBVMR_GetParameterStringA)(char *szParamName, char *szString); typedef 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_GetParameterStringW)(char *szParamName, unsigned short *wszString);
typedef long long(__stdcall *T_VBVMR_GetLevel)(long nType, long nuChannel, float *pValue); typedef 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(__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_SendMidiMessage)(unsigned char *pMIDIBuffer, long nbByteMax);
typedef long long(__stdcall *T_VBVMR_SetParameterFloat)(char *szParamName, float Value); typedef long(__stdcall *T_VBVMR_SetParameterFloat)(char *szParamName, float Value);
typedef long long(__stdcall *T_VBVMR_SetParameters)(char *szParamScript); typedef long(__stdcall *T_VBVMR_SetParameters)(char *szParamScript);
typedef long long(__stdcall *T_VBVMR_SetParametersW)(unsigned short *szParamScript); typedef long(__stdcall *T_VBVMR_SetParametersW)(unsigned short *szParamScript);
typedef long long(__stdcall *T_VBVMR_SetParameterStringA)(char *szParamName, char *szString); typedef 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_SetParameterStringW)(char *szParamName, unsigned short *wszString);
typedef long long(__stdcall *T_VBVMR_Output_GetDeviceNumber)(void); typedef 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(__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(__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(__stdcall *T_VBVMR_Input_GetDeviceNumber)(void);
typedef long long(__stdcall *T_VBVMR_Input_GetDeviceDescA)(long zindex, long *nType, char *szDeviceName, char *szHardwareId); typedef 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_Input_GetDeviceDescW)(long zindex, long *nType, unsigned short *wszDeviceName, unsigned short *wszHardwareId);
typedef long long(__stdcall *T_VBVMR_AudioCallbackRegister)(long mode, T_VBVMR_VBAUDIOCALLBACK pCallback, void *lpUser, char szClientName[64]); typedef 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(__stdcall *T_VBVMR_AudioCallbackStart)(void);
typedef long long(__stdcall *T_VBVMR_AudioCallbackStop)(void); typedef long(__stdcall *T_VBVMR_AudioCallbackStop)(void);
typedef long long(__stdcall *T_VBVMR_AudioCallbackUnregister)(void); typedef long(__stdcall *T_VBVMR_AudioCallbackUnregister)(void);
typedef long long(__stdcall *T_VBVMR_MacroButton_IsDirty)(void); typedef long(__stdcall *T_VBVMR_MacroButton_IsDirty)(void);
typedef long long(__stdcall *T_VBVMR_MacroButton_GetStatus)(long nuLogicalButton, float *pValue, long bitmode); typedef 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 long(__stdcall *T_VBVMR_MacroButton_SetStatus)(long nuLogicalButton, float fValue, long bitmode);
typedef struct tagVBVMR_INTERFACE typedef struct tagVBVMR_INTERFACE
{ {

View File

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

View File

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

View File

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

View File

@ -2,7 +2,7 @@
* @file vmrcli.c * @file vmrcli.c
* @author Onyx and Iris (code@onyxandiris.online) * @author Onyx and Iris (code@onyxandiris.online)
* @brief A Voicemeeter Remote Command Line Interface * @brief A Voicemeeter Remote Command Line Interface
* @version 0.6.0 * @version 0.7.0
* @date 2024-07-06 * @date 2024-07-06
* *
* @copyright Copyright (c) 2024 * @copyright Copyright (c) 2024
@ -21,6 +21,17 @@
#include "log.h" #include "log.h"
#include "util.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 #define MAX_LINE 512
/** /**
@ -47,7 +58,7 @@ struct result
static bool vflag = false; static bool vflag = false;
void help(void); static void usage(void);
enum kind set_kind(char *kval); enum kind set_kind(char *kval);
void interactive(PT_VMR vmr); void interactive(PT_VMR vmr);
void parse_input(PT_VMR vmr, char *input); void parse_input(PT_VMR vmr, char *input);
@ -67,19 +78,16 @@ int main(int argc, char *argv[])
if (argc == 1) if (argc == 1)
{ {
help(); usage();
exit(EXIT_SUCCESS);
} }
log_set_level(LOG_WARN); log_set_level(LOG_WARN);
while ((opt = getopt(argc, argv, "hk:msc:iD:v")) != -1) opterr = 0;
while ((opt = getopt(argc, argv, OPTSTR)) != -1)
{ {
switch (opt) switch (opt)
{ {
case 'h':
help();
exit(EXIT_SUCCESS);
case 'k': case 'k':
kind = set_kind(optarg); kind = set_kind(optarg);
if (kind == UNKNOWN) if (kind == UNKNOWN)
@ -117,14 +125,26 @@ int main(int argc, char *argv[])
case 'v': case 'v':
vflag = true; vflag = true;
break; 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: default:
abort(); usage();
} }
} }
PT_VMR vmr = create_interface(); PT_VMR vmr = create_interface();
int rep = login(vmr, kind); long rep = login(vmr, kind);
if (rep != 0) if (rep != 0)
{ {
log_fatal("Error logging into the Voicemeeter API"); log_fatal("Error logging into the Voicemeeter API");
@ -165,33 +185,24 @@ int main(int argc, char *argv[])
} }
rep = logout(vmr); rep = logout(vmr);
if (rep == 0) if (rep != 0)
{
return EXIT_SUCCESS;
}
else
{ {
log_fatal("Error logging out of the Voicemeeter API"); log_fatal("Error logging out of the Voicemeeter API");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
else
{
return EXIT_SUCCESS;
}
} }
/** /**
* @brief prints the help message * @brief prints the help message
*/ */
void help() static void usage()
{ {
puts( puts(USAGE);
"Usage: .\\vmrcli.exe [-h] [-i] [-k] [-D] [-v] [-c] [-m] [-s] <api commands>\n" exit(EXIT_SUCCESS);
"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");
} }
/** /**
@ -204,31 +215,14 @@ void help()
enum kind set_kind(char *kval) enum kind set_kind(char *kval)
{ {
if (strcmp(kval, "basic") == 0) if (strcmp(kval, "basic") == 0)
{ return sizeof(void *) == 8 ? BASICX64 : BASIC;
if (sizeof(void *) == 8)
return BASICX64;
else
return BASIC;
}
else if (strcmp(kval, "banana") == 0) else if (strcmp(kval, "banana") == 0)
{ return sizeof(void *) == 8 ? BANANAX64 : BANANA;
if (sizeof(void *) == 8)
return BANANAX64;
else
return BANANA;
}
else if (strcmp(kval, "potato") == 0) else if (strcmp(kval, "potato") == 0)
{ return sizeof(void *) == 8 ? POTATOX64 : POTATO;
if (sizeof(void *) == 8)
return POTATOX64;
else else
return POTATO;
}
else
{
return UNKNOWN; return UNKNOWN;
} }
}
/** /**
* @brief Continuously read lines from stdin. * @brief Continuously read lines from stdin.

View File

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