+#pragma once
/*
* This file is part of the libCEC(R) library.
*
- * libCEC(R) is Copyright (C) 2011 Pulse-Eight Limited. All rights reserved.
+ * libCEC(R) is Copyright (C) 2011-2013 Pulse-Eight Limited. All rights reserved.
* libCEC(R) is an original work, containing original code.
*
* libCEC(R) is a trademark of Pulse-Eight Limited.
HINSTANCE g_libCEC = NULL;
-CEC::ICECAdapter *LoadLibCec(const char *strName, CEC::cec_logical_address iLogicalAddress = CEC::CECDEVICE_PLAYBACKDEVICE1, uint16_t iPhysicalAddress = CEC_DEFAULT_PHYSICAL_ADDRESS, const char *strLib = NULL)
+/*!
+ * @brief Create a new libCEC instance.
+ * @param configuration The configuration to pass to libCEC
+ * @param strLib The name of and/or path to libCEC
+ * @return An instance of ICECAdapter or NULL on error.
+ */
+CEC::ICECAdapter *LibCecInitialise(CEC::libcec_configuration *configuration, const char *strLib = NULL)
{
if (!g_libCEC)
+#if defined(_WIN64)
+ g_libCEC = LoadLibrary(strLib ? strLib : "libcec.x64.dll");
+#else
g_libCEC = LoadLibrary(strLib ? strLib : "libcec.dll");
+#endif
if (!g_libCEC)
return NULL;
- typedef void* (__cdecl*_CreateLibCec)(const char *, uint8_t, uint16_t);
- _CreateLibCec CreateLibCec;
- CreateLibCec = (_CreateLibCec) (GetProcAddress(g_libCEC, "CECCreate"));
- if (!CreateLibCec)
+ typedef void* (__cdecl*_LibCecInitialise)(CEC::libcec_configuration *);
+ _LibCecInitialise LibCecInitialise;
+ LibCecInitialise = (_LibCecInitialise) (GetProcAddress(g_libCEC, "CECInitialise"));
+ if (!LibCecInitialise)
+ {
+ cout << "cannot find CECInitialise" << endl;
return NULL;
- return static_cast< CEC::ICECAdapter* > (CreateLibCec(strName, (uint8_t) iLogicalAddress, iPhysicalAddress));
+ }
+
+ return static_cast< CEC::ICECAdapter* > (LibCecInitialise(configuration));
}
+/*!
+ * @brief Destroy an instance of libCEC.
+ * @param device The instance to destroy.
+ */
void UnloadLibCec(CEC::ICECAdapter *device)
{
typedef void (__cdecl*_DestroyLibCec)(void * device);
g_libCEC = NULL;
}
+/*!
+ * @brief Start the bootloader on the first device that was detected.
+ * @param strLib The name of and/or path to libCEC
+ * @return True when the command was sent, false otherwise.
+ */
+bool LibCecBootloader(const char *strLib = NULL)
+{
+ if (!g_libCEC)
+#if defined(_WIN64)
+ g_libCEC = LoadLibrary(strLib ? strLib : "libcec.x64.dll");
+#else
+ g_libCEC = LoadLibrary(strLib ? strLib : "libcec.dll");
+#endif
+ if (!g_libCEC)
+ return NULL;
+
+ 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 *LoadLibCec(const char *strName, CEC::cec_logical_address iLogicalAddress = CEC::CECDEVICE_PLAYBACKDEVICE1, uint16_t iPhysicalAddress = CEC_DEFAULT_PHYSICAL_ADDRESS, const char *strLib = NULL)
+/*!
+ * @brief Create a new libCEC instance.
+ * @param configuration The configuration to pass to libCEC
+ * @param strLib The name of and/or path to libCEC
+ * @return An instance of ICECAdapter or NULL on error.
+ */
+CEC::ICECAdapter *LibCecInitialise(CEC::libcec_configuration *configuration, const char *strLib = NULL)
{
if (!g_libCEC)
{
#if defined(__APPLE__)
- g_libCEC = dlopen(strLib ? strLib : "libcec.dylib", RTLD_LAZY);
+ g_libCEC = dlopen(strLib ? strLib : "libcec." CEC_LIB_VERSION_MAJOR_STR ".dylib", RTLD_LAZY);
#else
- g_libCEC = dlopen(strLib ? strLib : "libcec.so", RTLD_LAZY);
+ g_libCEC = dlopen(strLib ? strLib : "libcec.so." CEC_LIB_VERSION_MAJOR_STR, RTLD_LAZY);
#endif
if (!g_libCEC)
{
-#if defined(__APPLE__)
- cout << "cannot find " << (strLib ? strLib : "libcec.dylib") << dlerror() << endl;
-#else
- cout << "cannot find " << (strLib ? strLib : "libcec.so") << dlerror() << endl;
-#endif
+ cout << dlerror() << endl;
return NULL;
}
}
- typedef void* _CreateLibCec(const char *, uint8_t, uint16_t);
- _CreateLibCec* CreateLibCec = (_CreateLibCec*) dlsym(g_libCEC, "CECCreate");
- if (!CreateLibCec)
+ typedef void* _LibCecInitialise(CEC::libcec_configuration *);
+ _LibCecInitialise* LibCecInitialise = (_LibCecInitialise*) dlsym(g_libCEC, "CECInitialise");
+ if (!LibCecInitialise)
{
- cout << "cannot find CreateLibCec" << endl;
+ cout << "cannot find CECInitialise" << endl;
return NULL;
}
- return (CEC::ICECAdapter*) CreateLibCec(strName, iLogicalAddress, iPhysicalAddress);
+ return (CEC::ICECAdapter*) LibCecInitialise(configuration);
}
+/*!
+ * @brief Destroy an instance of libCEC.
+ * @param device The instance to destroy.
+ */
void UnloadLibCec(CEC::ICECAdapter *device)
{
typedef void* _DestroyLibCec(CEC::ICECAdapter *);
dlclose(g_libCEC);
}
+/*!
+ * @brief Start the bootloader on the first device that was detected.
+ * @param strLib The name of and/or path to libCEC
+ * @return True when the command was sent, false otherwise.
+ */
+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)
+ {
+ cout << dlerror() << endl;
+ return NULL;
+ }
+ }
+
+ typedef bool _LibCecBootloader(void);
+ _LibCecBootloader* LibCecBootloader = (_LibCecBootloader*) dlsym(g_libCEC, "CECStartBootloader");
+ if (!LibCecBootloader)
+ {
+ cout << "cannot find CECStartBootloader" << endl;
+ return NULL;
+ }
+
+ bool bReturn = LibCecBootloader();
+ dlclose(g_libCEC);
+ return bReturn;
+}
+
#endif
#endif /* CECLOADER_H_ */