#pragma once
#if defined(_WIN32) || defined(_WIN64) || defined(_M_ARM64)
#include <windows.h>
#include <conio.h>
HINSTANCE g_libCEC = NULL;
CEC::ICECAdapter *LibCecInitialise(CEC::libcec_configuration *configuration, const char *strLib = NULL)
{
if (!g_libCEC)
g_libCEC = LoadLibrary(strLib ? strLib : "cec.dll");
if (!g_libCEC)
return NULL;
typedef void* (__cdecl*_LibCecInitialise)(CEC::libcec_configuration *);
_LibCecInitialise LibCecInitialise;
LibCecInitialise = (_LibCecInitialise) (GetProcAddress(g_libCEC, "CECInitialise"));
if (!LibCecInitialise)
{
std::cout << "cannot find CECInitialise" << std::endl;
return NULL;
}
return static_cast< CEC::ICECAdapter* > (LibCecInitialise(configuration));
}
void UnloadLibCec(CEC::ICECAdapter *device)
{
typedef void (__cdecl*_DestroyLibCec)(void * device);
_DestroyLibCec DestroyLibCec;
DestroyLibCec = (_DestroyLibCec) (GetProcAddress(g_libCEC, "CECDestroy"));
if (DestroyLibCec)
DestroyLibCec(device);
FreeLibrary(g_libCEC);
g_libCEC = NULL;
}
bool LibCecBootloader(const char *strLib = NULL)
{
if (!g_libCEC)
g_libCEC = LoadLibrary(strLib ? strLib : "cec.dll");
if (!g_libCEC)
return false;
typedef bool (__cdecl*_LibCecBootloader)(void);
_LibCecBootloader LibCecBootloader;
LibCecBootloader = (_LibCecBootloader) (GetProcAddress(g_libCEC, "CECStartBootloader"));
if (!LibCecBootloader)
return false;
bool bReturn = LibCecBootloader();
FreeLibrary(g_libCEC);
g_libCEC = NULL;
return bReturn;
}
#else
#include <dlfcn.h>
void *g_libCEC = NULL;
CEC::ICECAdapter *LibCecInitialise(CEC::libcec_configuration *configuration, const char *strLib = NULL)
{
if (!g_libCEC)
{
#if defined(__APPLE__)
g_libCEC = dlopen(strLib ? strLib : "libcec." CEC_LIB_VERSION_MAJOR_STR ".dylib", RTLD_LAZY);
#else
g_libCEC = dlopen(strLib ? strLib : "libcec.so." CEC_LIB_VERSION_MAJOR_STR, RTLD_LAZY);
#endif
if (!g_libCEC)
{
std::cout << dlerror() << std::endl;
return NULL;
}
}
typedef void* _LibCecInitialise(CEC::libcec_configuration *);
_LibCecInitialise* LibCecInitialise = (_LibCecInitialise*) dlsym(g_libCEC, "CECInitialise");
if (!LibCecInitialise)
{
std::cout << "cannot find CECInitialise" << std::endl;
return NULL;
}
return (CEC::ICECAdapter*) LibCecInitialise(configuration);
}
void UnloadLibCec(CEC::ICECAdapter *device)
{
typedef void* _DestroyLibCec(CEC::ICECAdapter *);
_DestroyLibCec *DestroyLibCec = (_DestroyLibCec*) dlsym(g_libCEC, "CECDestroy");
if (DestroyLibCec)
DestroyLibCec(device);
dlclose(g_libCEC);
}
bool LibCecBootloader(const char *strLib = NULL)
{
if (!g_libCEC)
{
#if defined(__APPLE__)
g_libCEC = dlopen(strLib ? strLib : "libcec.dylib", RTLD_LAZY);
#else
g_libCEC = dlopen(strLib ? strLib : "libcec.so." CEC_LIB_VERSION_MAJOR_STR, RTLD_LAZY);
#endif
if (!g_libCEC)
{
std::cout << dlerror() << std::endl;
return false;
}
}
typedef bool _LibCecBootloader(void);
_LibCecBootloader* LibCecBootloader = (_LibCecBootloader*) dlsym(g_libCEC, "CECStartBootloader");
if (!LibCecBootloader)
{
std::cout << "cannot find CECStartBootloader" << std::endl;
return false;
}
bool bReturn = LibCecBootloader();
dlclose(g_libCEC);
return bReturn;
}
#endif