cec: add a void* parameter to the callback methods, that can be set when enabling...
authorLars Op den Kamp <lars@opdenkamp.eu>
Thu, 12 Jan 2012 19:55:02 +0000 (20:55 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Thu, 12 Jan 2012 19:55:02 +0000 (20:55 +0100)
include/cec.h
include/cecc.h
include/cectypes.h
src/lib/LibCEC.cpp
src/lib/LibCEC.h
src/lib/LibCECC.cpp
src/testclient/main.cpp

index 0e463eb91fb4a88359f0a3b723dcc90681b81ac6..9e09902fe01aa1e676dcec72f1687846f7c395eb 100644 (file)
@@ -60,10 +60,11 @@ namespace CEC
 
     /*!
      * @brief Set and enable the callback methods. If this method is not called, the GetNext...() methods will have to be used.
+     * @param cbParam Parameter to pass to callback methods.
      * @param callbacks The callbacks to set.
      * @return True when enabled, false otherwise.
      */
-    virtual bool EnableCallbacks(ICECCallbacks *callbacks) = 0;
+    virtual bool EnableCallbacks(void *cbParam, ICECCallbacks *callbacks) = 0;
 
     /*!
      * @brief Try to find all connected CEC adapters. Only implemented on Linux and Windows at the moment.
index c8e0d0e2d23805d9a2cb696588f1f8679cdf943f..8c9bc932b82907edcf8936c6f45d31bde95bff6d 100644 (file)
@@ -60,9 +60,9 @@ extern DECLSPEC int cec_open(const char *strPort, uint32_t iTimeout);
 extern DECLSPEC void cec_close(void);
 
 #ifdef __cplusplus
-extern DECLSPEC int cec_enable_callbacks(CEC::ICECCallbacks *callbacks);
+extern DECLSPEC int cec_enable_callbacks(void *cbParam, CEC::ICECCallbacks *callbacks);
 #else
-extern DECLSPEC int cec_enable_callbacks(ICECCallbacks *callbacks);
+extern DECLSPEC int cec_enable_callbacks(void *cbParam, ICECCallbacks *callbacks);
 #endif
 
 #ifdef __cplusplus
index 46b25e483324bc6b5b9c536063377915693f539d..1c52cb79b6ac2d50b47396be769a2b59945cd5ad 100644 (file)
@@ -874,9 +874,9 @@ typedef struct cec_logical_addresses
 } cec_logical_addresses;
 
 
-typedef int (CDECL* CBCecLogMessageType)(const CEC::cec_log_message &);
-typedef int (CDECL* CBCecKeyPressType)(const cec_keypress &key);
-typedef int (CDECL* CBCecCommandType)(const cec_command &command);
+typedef int (CDECL* CBCecLogMessageType)(void *param, const CEC::cec_log_message &);
+typedef int (CDECL* CBCecKeyPressType)(void *param, const cec_keypress &key);
+typedef int (CDECL* CBCecCommandType)(void *param, const cec_command &command);
 
 typedef struct ICECCallbacks
 {
index 55af1803b7c1d951a9937e2df2adc8d420214911..52dfa515776a7beada82a77e5c831b7f24209945 100644 (file)
@@ -46,7 +46,8 @@ CLibCEC::CLibCEC(const char *strDeviceName, cec_device_type_list types) :
     m_iStartTime(GetTimeMs()),
     m_iCurrentButton(CEC_USER_CONTROL_CODE_UNKNOWN),
     m_buttontime(0),
-    m_callbacks(NULL)
+    m_callbacks(NULL),
+    m_cbParam(NULL)
 {
   m_cec = new CCECProcessor(this, strDeviceName, types);
 }
@@ -55,7 +56,8 @@ CLibCEC::CLibCEC(const char *strDeviceName, cec_logical_address iLogicalAddress
     m_iStartTime(GetTimeMs()),
     m_iCurrentButton(CEC_USER_CONTROL_CODE_UNKNOWN),
     m_buttontime(0),
-    m_callbacks(NULL)
+    m_callbacks(NULL),
+    m_cbParam(NULL)
 {
   m_cec = new CCECProcessor(this, strDeviceName, iLogicalAddress, iPhysicalAddress);
 }
@@ -89,11 +91,14 @@ void CLibCEC::Close(void)
     m_cec->StopThread();
 }
 
-bool CLibCEC::EnableCallbacks(ICECCallbacks *callbacks)
+bool CLibCEC::EnableCallbacks(void *cbParam, ICECCallbacks *callbacks)
 {
   CLockObject lock(&m_mutex);
   if (m_cec)
+  {
+    m_cbParam   = cbParam;
     m_callbacks = callbacks;
+  }
   return false;
 }
 
@@ -347,7 +352,7 @@ void CLibCEC::AddLog(cec_log_level level, const string &strMessage)
     snprintf(message.message, sizeof(message.message), "%s", strMessage.c_str());
 
     if (m_callbacks)
-      m_callbacks->CBCecLogMessage(message);
+      m_callbacks->CBCecLogMessage(m_cbParam, message);
     else
       m_logBuffer.Push(message);
   }
@@ -357,7 +362,7 @@ void CLibCEC::AddKey(cec_keypress &key)
 {
   CLockObject lock(&m_mutex);
   if (m_callbacks)
-    m_callbacks->CBCecKeyPress(key);
+    m_callbacks->CBCecKeyPress(m_cbParam, key);
   else
     m_keyBuffer.Push(key);
   m_iCurrentButton = CEC_USER_CONTROL_CODE_UNKNOWN;
@@ -375,7 +380,7 @@ void CLibCEC::AddKey(void)
     key.keycode = m_iCurrentButton;
 
     if (m_callbacks)
-      m_callbacks->CBCecKeyPress(key);
+      m_callbacks->CBCecKeyPress(m_cbParam, key);
     else
       m_keyBuffer.Push(key);
     m_iCurrentButton = CEC_USER_CONTROL_CODE_UNKNOWN;
@@ -388,7 +393,7 @@ void CLibCEC::AddCommand(const cec_command &command)
   CLockObject lock(&m_mutex);
   if (m_callbacks)
   {
-    m_callbacks->CBCecCommand(command);
+    m_callbacks->CBCecCommand(m_cbParam, command);
   }
   else if (m_commandBuffer.Push(command))
   {
index dde69f4bae61afe55a24d38716a43d954e3f0d92..ef1ded29f5c5fdee7272f4fd44f5f8b1e33513b9 100644 (file)
@@ -53,7 +53,7 @@ namespace CEC
 
       virtual bool Open(const char *strPort, uint32_t iTimeout = 10000);
       virtual void Close(void);
-      virtual bool EnableCallbacks(ICECCallbacks *callbacks);
+      virtual bool EnableCallbacks(void *cbParam, ICECCallbacks *callbacks);
       virtual int8_t FindAdapters(cec_adapter *deviceList, uint8_t iBufSize, const char *strDevicePath = NULL);
       virtual bool PingAdapter(void);
       virtual bool StartBootloader(void);
@@ -128,6 +128,7 @@ namespace CEC
       CecBuffer<cec_keypress>    m_keyBuffer;
       CecBuffer<cec_command>     m_commandBuffer;
       ICECCallbacks             *m_callbacks;
+      void                      *m_cbParam;
       CMutex                     m_mutex;
   };
 };
index 5ca2885d48edeeb5425a87a3238bd2cb9bb61439..91ab395eca5fa61e30657bbede26abb8c4d2757e 100644 (file)
@@ -74,10 +74,10 @@ void cec_close(void)
     cec_parser->Close();
 }
 
-int cec_enable_callbacks(ICECCallbacks *callbacks)
+int cec_enable_callbacks(void *cbParam, ICECCallbacks *callbacks)
 {
   if (cec_parser)
-    return cec_parser->EnableCallbacks(callbacks) ? 1 : 0;
+    return cec_parser->EnableCallbacks(cbParam, callbacks) ? 1 : 0;
   return -1;
 }
 
index 5858eb6689050a7b2f3f01ed5d471488e7d4f226..256a484e47cb91e8da42a21dca9d04619e025cd5 100644 (file)
@@ -123,7 +123,7 @@ bool GetWord(string& data, string& word)
   return true;
 }
 
-int CecLogMessage(const cec_log_message &message)
+int CecLogMessage(void *UNUSED(cbParam), const cec_log_message &message)
 {
   if ((message.level & g_cecLogLevel) == message.level)
   {
@@ -165,12 +165,12 @@ int CecLogMessage(const cec_log_message &message)
   return 0;
 }
 
-int CecKeyPress(const cec_keypress &UNUSED(key))
+int CecKeyPress(void *UNUSED(cbParam), const cec_keypress &UNUSED(key))
 {
   return 0;
 }
 
-int CecCommand(const cec_command &UNUSED(command))
+int CecCommand(void *UNUSED(cbParam), const cec_command &UNUSED(command))
 {
   return 0;
 }
@@ -180,7 +180,7 @@ void EnableCallbacks(ICECAdapter *adapter)
   g_callbacks.CBCecLogMessage = &CecLogMessage;
   g_callbacks.CBCecKeyPress   = &CecKeyPress;
   g_callbacks.CBCecCommand    = &CecCommand;
-  adapter->EnableCallbacks(&g_callbacks);
+  adapter->EnableCallbacks(NULL, &g_callbacks);
 }
 
 void ListDevices(ICECAdapter *parser)