cec: added logical address autodetection and let libcec handle multiple types simulta...
[deb_libcec.git] / include / cecloader.h
index 9316befcfae81355bdcb47e3216665e04b2f1515..d20ca2ff22e22007f0a41fd2e3886e10f9e219e6 100644 (file)
 
 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)
+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)
 {
-  typedef void* (__cdecl*_CreateLibCec)(const char *, uint8_t, uint16_t);
-  _CreateLibCec CreateLibCec;
-
   if (!g_libCEC)
-    g_libCEC = LoadLibrary("libcec.dll");
+    g_libCEC = LoadLibrary(strLib ? strLib : "libcec.dll");
   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)
     return NULL;
@@ -73,38 +72,68 @@ void UnloadLibCec(CEC::ICECAdapter *device)
 
 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)
+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)
 {
-  typedef void* _CreateLibCec(const char *, uint8_t, uint16_t);
-
   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;
     }
   }
 
+  typedef void* _CreateLibCec(const char *, uint8_t, uint16_t);
   _CreateLibCec* CreateLibCec = (_CreateLibCec*) dlsym(g_libCEC, "CECCreate");
   if (!CreateLibCec)
   {
-    cout << "cannot find CreateLibCec" << endl;
+    cout << "cannot find CECCreate" << endl;
     return NULL;
   }
 
   return (CEC::ICECAdapter*) CreateLibCec(strName, iLogicalAddress, iPhysicalAddress);
 }
 
+CEC::ICECAdapter *LibCecInit(const char *strDeviceName, CEC::cec_device_type_list types, 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 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);
+}
+
 void UnloadLibCec(CEC::ICECAdapter *device)
 {
   typedef void* _DestroyLibCec(CEC::ICECAdapter *);