Files
spice2x.github.io/src/spice2x/rawinput/smx.cpp
T

84 lines
2.9 KiB
C++

#include "smx.h"
using namespace std;
static HINSTANCE LIBSMX_INSTANCE = nullptr;
static string LIBSMX_NAME = "SMX.dll";
// SMX_Start API
static string SMX_StartStr = "SMX_Start";
typedef VOID(__stdcall* SMX_Start_t)(
SMXUpdateCallback UpdateCallback, void *pUser
);
static SMX_Start_t pSMX_Start = nullptr;
// SMX_SetLights2 API
static string SMX_SetLights2Str = "SMX_SetLights2";
typedef VOID(__stdcall* SMX_SetLights2_t)(
const char *lightData, int lightDataSize
);
static SMX_SetLights2_t pSMX_SetLights2 = nullptr;
// SMX_SetDedicatedCabinetLights API
static string SMX_SetDedicatedCabinetLightsStr = "SMX_SetDedicatedCabinetLights";
typedef VOID(__stdcall* SMX_SetDedicatedCabinetLights_t)(
SMXDedicatedCabinetLights lightDevice, const char* lightData, int lightDataSize
);
static SMX_SetDedicatedCabinetLights_t pSMX_SetDedicatedCabinetLights = nullptr;
SMXWrapper::SMXWrapper() {
static bool functions_loaded = false;
if (functions_loaded)
return;
// See if we even have the SMX.dll available.
LIBSMX_INSTANCE = libutils::try_library(LIBSMX_NAME);
if (LIBSMX_INSTANCE != nullptr) {
// Load functions
pSMX_Start =
(SMX_Start_t) libutils::get_proc(LIBSMX_INSTANCE, SMX_StartStr.c_str());
pSMX_SetLights2 =
(SMX_SetLights2_t) libutils::get_proc(LIBSMX_INSTANCE, SMX_SetLights2Str.c_str());
pSMX_SetDedicatedCabinetLights =
(SMX_SetDedicatedCabinetLights_t) libutils::get_proc(LIBSMX_INSTANCE, SMX_SetDedicatedCabinetLightsStr.c_str());
// Make sure they actually loaded. We won't block on pSMX_SetDedicatedCabinetLights being null,
// since that functionality doesn't exist in the mainline SDK.
if (pSMX_Start == nullptr || pSMX_SetLights2 == nullptr) {
log_warning("smx", "Unable to load all external functions successfully");
} else {
functions_loaded = true;
}
// This only exists in a fork of the SMX SDK right now, don't consider the functions not
// to be loaded if this is null
if (pSMX_SetDedicatedCabinetLights == nullptr) {
log_warning("smx", "Unable to load cabinet lights functionality");
}
} else {
log_warning("smx", "Could not load \'{}\'", LIBSMX_NAME);
}
}
SMXWrapper::~SMXWrapper() {}
void SMXWrapper::SMX_Start(SMXUpdateCallback UpdateCallback, void *pUser) {
if (pSMX_Start != nullptr) {
pSMX_Start(UpdateCallback, pUser);
}
}
void SMXWrapper::SMX_SetLights2(const char *lightData, int lightDataSize) {
if (pSMX_SetLights2 != nullptr) {
pSMX_SetLights2(lightData, lightDataSize);
}
}
void SMXWrapper::SMX_SetDedicatedCabinetLights(SMXDedicatedCabinetLights lightDevice, const char *lightData, int lightDataSize) {
if (pSMX_SetDedicatedCabinetLights != nullptr) {
pSMX_SetDedicatedCabinetLights(lightDevice, lightData, lightDataSize);
}
}