Add debian package patches.
[deb_libcec.git] / include / cecloader.h
index ceba1e3db7358ffee787953bc848ab6ca78a6f05..6c7c97a04d417167eeceed71d18d3e0f1c5c3374 100644 (file)
@@ -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-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)
+/*!
+ * @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)
 {
-  typedef void* (__cdecl*_CreateLibCec)(const char *, uint8_t, uint16_t);
-  _CreateLibCec CreateLibCec;
-
   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,36 +85,77 @@ 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 <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)
+/*!
+ * @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)
 {
-  typedef void* _CreateLibCec(const char *, uint8_t, uint16_t);
-
   if (!g_libCEC)
   {
-    g_libCEC = dlopen("libcec.so", RTLD_LAZY);
+#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)
     {
-      cout << "cannot find libcec.so" << endl;
+      cout << dlerror() << endl;
       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 *);
@@ -107,6 +166,40 @@ 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." 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_ */