cec: added SendKeypress()/cec_send_keypress() and SendKeyRelease()/cec_send_key_release()
authorLars Op den Kamp <lars@opdenkamp.eu>
Sun, 27 Nov 2011 23:03:35 +0000 (00:03 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Sun, 27 Nov 2011 23:03:35 +0000 (00:03 +0100)
include/cec.h
include/cecc.h
src/lib/CECProcessor.cpp
src/lib/CECProcessor.h
src/lib/LibCEC.cpp
src/lib/LibCEC.h
src/lib/LibCECC.cpp
src/lib/devices/CECAudioSystem.cpp
src/lib/devices/CECAudioSystem.h
src/lib/devices/CECBusDevice.cpp
src/lib/devices/CECBusDevice.h

index 1486b28881321f4ca9855ff2da1b24df8f97bd7c..70c17ce5693411d1092bd964521f628836eae89c 100644 (file)
@@ -290,6 +290,23 @@ namespace CEC
      * @return The new audio status.
      */
     virtual uint8_t MuteAudio(bool bWait = true) = 0;
+
+    /*!
+     * @brief Send a keypress to a device on the CEC bus.
+     * @param iDestination The address to send the message to.
+     * @param key The key to send.
+     * @param bWait True to wait for a response, false otherwise.
+     * @return True when the keypress was acked, false otherwise.
+     */
+    virtual bool SendKeypress(cec_logical_address iDestination, cec_user_control_code key, bool bWait = false) = 0;
+
+    /*!
+     * @brief Send a key release to a device on the CEC bus.
+     * @param iDestination The address to send the message to.
+     * @param bWait True to wait for a response, false otherwise.
+     * @return True when the keypress was acked, false otherwise.
+     */
+    virtual bool SendKeyRelease(cec_logical_address iDestination, bool bWait = false) = 0;
   };
 };
 
index d4765e0a75b763cc35db035fb31872768143775e..07050bcb5f577f1ee4146fe69bd086cc6bd429df 100644 (file)
@@ -187,11 +187,24 @@ extern DECLSPEC int cec_is_active_device_type(cec_device_type type);
 
 extern DECLSPEC int cec_set_hdmi_port(uint8_t iPort);
 
-extern DECLSPEC int cec_volume_up(int bWait = 1);
+extern DECLSPEC int cec_volume_up(int bWait);
 
-extern DECLSPEC int cec_volume_down(int bWait = 1);
+extern DECLSPEC int cec_volume_down(int bWait);
+
+extern DECLSPEC int cec_mute_audio(int bWait);
+
+#ifdef __cplusplus
+extern DECLSPEC int cec_send_keypress(CEC::cec_logical_address iDestination, CEC::cec_user_control_code key, int bWait);
+#else
+extern DECLSPEC int cec_send_keypress(cec_logical_address iDestination, cec_user_control_code key, int bWait);
+#endif
+
+#ifdef __cplusplus
+extern DECLSPEC int cec_send_key_release(CEC::cec_logical_address iDestination, int bWait);
+#else
+extern DECLSPEC int cec_send_key_release(cec_logical_address iDestination, int bWait);
+#endif
 
-extern DECLSPEC int cec_mute_audio(int bWait = 1);
 
 #ifdef __cplusplus
 };
index d8fdb99f145a1763a6f11a8588178116fb702e19..021e4317d7812e6d303e5a0737fa104dc498ef44 100644 (file)
@@ -813,3 +813,13 @@ bool CCECProcessor::SetAckMask(uint16_t iMask)
 
   return bReturn;
 }
+
+bool CCECProcessor::SendKeypress(cec_logical_address iDestination, cec_user_control_code key, bool bWait /* = false */)
+{
+  return m_busDevices[iDestination]->SendKeypress(key, bWait);
+}
+
+bool CCECProcessor::SendKeyRelease(cec_logical_address iDestination, bool bWait /* = false */)
+{
+  return m_busDevices[iDestination]->SendKeyRelease(bWait);
+}
index ea8f6a48f4855bd3ed2c21e6e1cb81a330130a8f..c1c28740079d7d7e3cb7cc92c5a8acc1c38fab9d 100644 (file)
@@ -88,6 +88,8 @@ namespace CEC
       virtual uint8_t VolumeUp(bool bWait = true);
       virtual uint8_t VolumeDown(bool bWait = true);
       virtual uint8_t MuteAudio(bool bWait = true);
+      virtual bool SendKeypress(cec_logical_address iDestination, cec_user_control_code key, bool bWait = false);
+      virtual bool SendKeyRelease(cec_logical_address iDestination, bool bWait = false);
 
       virtual bool Transmit(const cec_command &data);
       virtual bool Transmit(CCECAdapterMessage *output);
@@ -129,5 +131,6 @@ namespace CEC
       CLibCEC*               m_controller;
       bool                   m_bMonitor;
       CecBuffer<cec_command> m_commandBuffer;
+      cec_keypress           m_previousKey;
   };
 };
index 26fd7b0bdb68b26402b6e3ca1588cd938f124ed3..50239bc7e5a6529dfedf7e0d20f8f88b45bb4daa 100644 (file)
@@ -302,6 +302,20 @@ uint8_t CLibCEC::MuteAudio(bool bWait /* = true */)
   return 0;
 }
 
+bool CLibCEC::SendKeypress(cec_logical_address iDestination, cec_user_control_code key, bool bWait /* = false */)
+{
+  if (m_cec)
+    return m_cec->SendKeypress(iDestination, key, bWait);
+  return false;
+}
+
+bool CLibCEC::SendKeyRelease(cec_logical_address iDestination, bool bWait /* = false */)
+{
+  if (m_cec)
+    return m_cec->SendKeyRelease(iDestination, bWait);
+  return false;
+}
+
 void CLibCEC::AddLog(cec_log_level level, const string &strMessage)
 {
   if (m_cec)
index ad3b1cdcd992064100add735b5041531b408f001..050fcc194ab47a403d2ae628a6662a0b19ed0e0a 100644 (file)
@@ -91,6 +91,8 @@ namespace CEC
       virtual uint8_t VolumeUp(bool bWait = true);
       virtual uint8_t VolumeDown(bool bWait = true);
       virtual uint8_t MuteAudio(bool bWait = true);
+      virtual bool SendKeypress(cec_logical_address iDestination, cec_user_control_code key, bool bWait = false);
+      virtual bool SendKeyRelease(cec_logical_address iDestination, bool bWait = false);
     //@}
 
       virtual void AddLog(cec_log_level level, const std::string &strMessage);
index 0193124e84cb07d78b78ceb5b8c0ad49a12d6e9c..f1e80fa57df5af4491a2b607a6561fe219188717 100644 (file)
@@ -271,25 +271,39 @@ int cec_set_hdmi_port(uint8_t iPort)
   return -1;
 }
 
-int cec_volume_up(int bWait /* = 1 */)
+int cec_volume_up(int bWait)
 {
   if (cec_parser)
     return cec_parser->VolumeUp(bWait == 1);
   return -1;
 }
 
-int cec_volume_down(int bWait /* = 1 */)
+int cec_volume_down(int bWait)
 {
   if (cec_parser)
     return cec_parser->VolumeDown(bWait == 1);
   return -1;
 }
 
-int cec_mute_audio(int bWait /* = 1 */)
+int cec_mute_audio(int bWait)
 {
   if (cec_parser)
     return cec_parser->MuteAudio(bWait == 1);
   return -1;
 }
 
+int cec_send_keypress(cec_logical_address iDestination, cec_user_control_code key, int bWait)
+{
+  if (cec_parser)
+    return cec_parser->SendKeypress(iDestination, key, bWait == 1) ? 1 : 0;
+  return -1;
+}
+
+int cec_send_key_release(cec_logical_address iDestination, int bWait)
+{
+  if (cec_parser)
+    return cec_parser->SendKeyRelease(iDestination, bWait == 1) ? 1 : 0;
+  return -1;
+}
+
 //@}
index 87735f4a5ed7aa8c6e83f1e6231946c57dc63e21..9dd3123adb55d275a6fed2718240532164b0f162 100644 (file)
@@ -111,39 +111,26 @@ bool CCECAudioSystem::TransmitSystemAudioModeStatus(cec_logical_address dest)
 
 uint8_t CCECAudioSystem::VolumeUp(bool bWait /* = true */)
 {
-  return SendKey(CEC_USER_CONTROL_CODE_VOLUME_UP, bWait);
+  if (SendKeypress(CEC_USER_CONTROL_CODE_VOLUME_UP))
+    SendKeyRelease(bWait);
+
+  CLockObject lock(&m_mutex);
+  return m_audioStatus;
 }
 
 uint8_t CCECAudioSystem::VolumeDown(bool bWait /* = true */)
 {
-  return SendKey(CEC_USER_CONTROL_CODE_VOLUME_DOWN, bWait);
-}
+  if (SendKeypress(CEC_USER_CONTROL_CODE_VOLUME_DOWN))
+    SendKeyRelease(bWait);
 
-uint8_t CCECAudioSystem::MuteAudio(bool bWait /* = true */)
-{
-  return SendKey(CEC_USER_CONTROL_CODE_MUTE, bWait);
+  CLockObject lock(&m_mutex);
+  return m_audioStatus;
 }
 
-uint8_t CCECAudioSystem::SendKey(cec_user_control_code key, bool bWait /* = true */)
+uint8_t CCECAudioSystem::MuteAudio(bool bWait /* = true */)
 {
-  {
-    CLockObject lock(&m_transmitMutex);
-    cec_command command;
-    cec_command::Format(command, m_processor->GetLogicalAddress(), m_iLogicalAddress, CEC_OPCODE_USER_CONTROL_PRESSED);
-    command.parameters.PushBack(key);
-    m_processor->Transmit(command);
-
-    cec_command::Format(command, m_processor->GetLogicalAddress(), m_iLogicalAddress, CEC_OPCODE_USER_CONTROL_RELEASE);
-    if (bWait)
-    {
-      if (m_processor->Transmit(command))
-        m_condition.Wait(&m_transmitMutex, 1000);
-    }
-    else
-    {
-      m_processor->Transmit(command);
-    }
-  }
+  if (SendKeypress(CEC_USER_CONTROL_CODE_MUTE))
+    SendKeyRelease(bWait);
 
   CLockObject lock(&m_mutex);
   return m_audioStatus;
index 6c04ad940c7dbbc0548dff2d04027abd2866d781..7a7a16eec67e5852d6058e3400f9315ef49df515 100644 (file)
@@ -50,7 +50,6 @@ namespace CEC
     virtual uint8_t VolumeUp(bool bWait = true);
     virtual uint8_t VolumeDown(bool bWait = true);
     virtual uint8_t MuteAudio(bool bWait = true);
-    virtual uint8_t SendKey(cec_user_control_code key, bool bWait = true);
 
     virtual bool TransmitActiveSource(void) { return false; }
 
index d5a0be6aef11dcb76351ad0bea58eaf4e3eb408a..5c38f635060be704a9e7cb55121980d235bbbdf1 100644 (file)
@@ -748,4 +748,43 @@ bool CCECBusDevice::TransmitVendorID(cec_logical_address dest)
     return m_processor->Transmit(command);
   }
 }
+
+bool CCECBusDevice::SendKeypress(cec_user_control_code key, bool bWait /* = false */)
+{
+  {
+    CLockObject lock(&m_transmitMutex);
+    cec_command command;
+    cec_command::Format(command, m_processor->GetLogicalAddress(), m_iLogicalAddress, CEC_OPCODE_USER_CONTROL_PRESSED);
+    command.parameters.PushBack(key);
+
+    if (bWait)
+    {
+      if (m_processor->Transmit(command))
+        return m_condition.Wait(&m_transmitMutex, 1000);
+      return false;
+    }
+
+    return m_processor->Transmit(command);
+  }
+}
+
+bool CCECBusDevice::SendKeyRelease(bool bWait /* = false */)
+{
+  {
+    CLockObject lock(&m_transmitMutex);
+    cec_command command;
+    cec_command::Format(command, m_processor->GetLogicalAddress(), m_iLogicalAddress, CEC_OPCODE_USER_CONTROL_RELEASE);
+
+    if (bWait)
+    {
+      if (m_processor->Transmit(command))
+        return m_condition.Wait(&m_transmitMutex, 1000);
+      return false;
+    }
+    else
+    {
+      return m_processor->Transmit(command);
+    }
+  }
+}
 //@}
index 57d353b4ff3e8547114c54dbcd67be44458e16af..c86a1f2c8f1f57ad0b0cb1212ebc23e00daa51ed 100644 (file)
@@ -102,6 +102,8 @@ namespace CEC
     virtual bool TransmitPowerState(cec_logical_address dest);
     virtual bool TransmitPoll(cec_logical_address dest);
     virtual bool TransmitVendorID(cec_logical_address dest);
+    virtual bool SendKeypress(cec_user_control_code key, bool bWait = true);
+    virtual bool SendKeyRelease(bool bWait = true);
 
   protected:
     cec_device_type       m_type;