X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=include%2Fcecloader.h;h=5d4361d6199034c31b24732f52fe01c7fa137a8c;hb=466925f5c43536e5fd96632615810da783b78096;hp=9316befcfae81355bdcb47e3216665e04b2f1515;hpb=30a57ee80e9222abfbeefd257da1c3ddbaecb3b0;p=deb_libcec.git diff --git a/include/cecloader.h b/include/cecloader.h index 9316bef..5d4361d 100644 --- a/include/cecloader.h +++ b/include/cecloader.h @@ -1,7 +1,8 @@ +#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-2012 Pulse-Eight Limited. All rights reserved. * libCEC(R) is an original work, containing original code. * * libCEC(R) is a trademark of Pulse-Eight Limited. @@ -39,22 +40,65 @@ 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) +/*! + * @brief Create a new libCEC instance. + * @param strDeviceName The name of the primary device to pass to other CEC devices. + * @param types The list of device types to register on the bus. + * @param strLib The name of and/or path to libCEC + * @return An instance of libCEC or NULL when it failed to load. + */ +CEC::ICECAdapter *LibCecInit(const char *strDeviceName, CEC::cec_device_type_list types, const char *strLib = NULL) { - typedef void* (__cdecl*_CreateLibCec)(const char *, uint8_t, uint16_t); - _CreateLibCec CreateLibCec; + 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*_LibCecInit)(const char *, CEC::cec_device_type_list); + _LibCecInit LibCecInit; + LibCecInit = (_LibCecInit) (GetProcAddress(g_libCEC, "CECInit")); + if (!LibCecInit) + return NULL; + return static_cast< CEC::ICECAdapter* > (LibCecInit(strDeviceName, types)); +} + +/*! + * @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) - g_libCEC = LoadLibrary("libcec.dll"); +#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; - 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); @@ -67,44 +111,119 @@ void UnloadLibCec(CEC::ICECAdapter *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 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) +/*! + * @brief Create a new libCEC instance. + * @param strDeviceName The name of the primary device to pass to other CEC devices. + * @param types The list of device types to register on the bus. + * @param strLib The name of and/or path to libCEC + * @return An instance of libCEC or NULL when it failed to load. + */ +CEC::ICECAdapter *LibCecInit(const char *strDeviceName, CEC::cec_device_type_list types, const char *strLib = NULL) { - typedef void* _CreateLibCec(const char *, uint8_t, uint16_t); + if (!g_libCEC) + { +#if defined(__APPLE__) + g_libCEC = dlopen(strLib ? strLib : "libcec.dylib", RTLD_LAZY); +#else + g_libCEC = dlopen(strLib ? strLib : "libcec.so", 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 + return NULL; + } + } + + typedef void* _LibCecInit(const char *, CEC::cec_device_type_list); + _LibCecInit* LibCecInit = (_LibCecInit*) dlsym(g_libCEC, "CECInit"); + if (!LibCecInit) + { + cout << "cannot find CECInit" << endl; + return NULL; + } + return (CEC::ICECAdapter*) LibCecInit(strDeviceName, types); +} + +/*! + * @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("libcec.dylib", RTLD_LAZY); + g_libCEC = dlopen(strLib ? strLib : "libcec.dylib", RTLD_LAZY); #else - g_libCEC = dlopen("libcec.so", RTLD_LAZY); + g_libCEC = dlopen(strLib ? strLib : "libcec.so", RTLD_LAZY); #endif if (!g_libCEC) { #if defined(__APPLE__) - cout << "cannot find libcec.dylib" << endl; + cout << "cannot find " << (strLib ? strLib : "libcec.dylib") << dlerror() << endl; #else - cout << "cannot find libcec.so" << endl; + cout << "cannot find " << (strLib ? strLib : "libcec.so") << dlerror() << endl; #endif return NULL; } } - _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 *); @@ -115,6 +234,44 @@ void UnloadLibCec(CEC::ICECAdapter *device) 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", 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 + 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_ */