cec: added VolumeUp()/cec_volume_up(), VolumeDown()/cec_volume_down(), MuteAudio...
authorLars Op den Kamp <lars@opdenkamp.eu>
Fri, 25 Nov 2011 16:43:23 +0000 (17:43 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Fri, 25 Nov 2011 17:02:16 +0000 (18:02 +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/testclient/main.cpp

index 5edbe1819fd2b777f8133e9f75a3423d1a740cba..7ac25fdfaf9b68b47839235e4fcf225651b21c80 100644 (file)
@@ -269,6 +269,24 @@ namespace CEC
      * @return True when changed, false otherwise.
      */
     virtual bool SetHDMIPort(uint8_t iPort) = 0;
+
+    /*!
+     * @brief Sends a volume up keypress to an audiosystem if it's present.
+     * @return The new audio status.
+     */
+    virtual uint8_t VolumeUp(void) = 0;
+
+    /*!
+     * @brief Sends a volume down keypress to an audiosystem if it's present.
+     * @return The new audio status.
+     */
+    virtual uint8_t VolumeDown(void) = 0;
+
+    /*!
+     * @brief Sends a mute keypress to an audiosystem if it's present.
+     * @return The new audio status.
+     */
+    virtual uint8_t MuteAudio(void) = 0;
   };
 };
 
index 409f03a57e730cfe7a471964fa9728611de9623c..c7e5ad4ac88ae96c6598aadd985af7b78b08ff00 100644 (file)
@@ -187,6 +187,12 @@ 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(void);
+
+extern DECLSPEC int cec_volume_down(void);
+
+extern DECLSPEC int cec_mute_audio(void);
+
 #ifdef __cplusplus
 };
 #endif
index 8315cd297b1f66ba6d204b924351f939b7bdd6df..8f2ea98f24ac4529bca5339717e4a90ad1e3b0cb 100644 (file)
@@ -492,6 +492,33 @@ bool CCECProcessor::PollDevice(cec_logical_address iAddress)
   return false;
 }
 
+uint8_t CCECProcessor::VolumeUp(void)
+{
+  uint8_t status = 0;
+  if (IsActiveDevice(CECDEVICE_AUDIOSYSTEM))
+    status = ((CCECAudioSystem *)m_busDevices[CECDEVICE_AUDIOSYSTEM])->VolumeUp();
+
+  return status;
+}
+
+uint8_t CCECProcessor::VolumeDown(void)
+{
+  uint8_t status = 0;
+  if (IsActiveDevice(CECDEVICE_AUDIOSYSTEM))
+    status = ((CCECAudioSystem *)m_busDevices[CECDEVICE_AUDIOSYSTEM])->VolumeDown();
+
+  return status;
+}
+
+uint8_t CCECProcessor::MuteAudio(void)
+{
+  uint8_t status = 0;
+  if (IsActiveDevice(CECDEVICE_AUDIOSYSTEM))
+    status = ((CCECAudioSystem *)m_busDevices[CECDEVICE_AUDIOSYSTEM])->MuteAudio();
+
+  return status;
+}
+
 CCECBusDevice *CCECProcessor::GetDeviceByPhysicalAddress(uint16_t iPhysicalAddress, bool bRefresh /* = false */) const
 {
   if (m_busDevices[m_logicalAddresses.primary]->GetPhysicalAddress(false) == iPhysicalAddress)
index cf9980ca9429ddc310046ffb30dae294a33bd2bb..178978e116228550852e9aae325e11a8adefa159 100644 (file)
@@ -85,6 +85,9 @@ namespace CEC
       virtual bool SetStreamPath(uint16_t iStreamPath);
       virtual bool SwitchMonitoring(bool bEnable);
       virtual bool PollDevice(cec_logical_address iAddress);
+      virtual uint8_t VolumeUp(void);
+      virtual uint8_t VolumeDown(void);
+      virtual uint8_t MuteAudio(void);
 
       virtual bool Transmit(const cec_command &data);
       virtual bool Transmit(CCECAdapterMessage *output);
index 50ab94fc6949b1b3515a13b2102036656db3c6f3..2e9dac01c7071c622123f271bf2fc730a9462a65 100644 (file)
@@ -280,6 +280,28 @@ bool CLibCEC::IsActiveDeviceType(cec_device_type type)
   return false;
 }
 
+uint8_t CLibCEC::VolumeUp(void)
+{
+  if (m_cec)
+    return m_cec->VolumeUp();
+  return 0;
+}
+
+uint8_t CLibCEC::VolumeDown(void)
+{
+  if (m_cec)
+    return m_cec->VolumeDown();
+  return 0;
+}
+
+
+uint8_t CLibCEC::MuteAudio(void)
+{
+  if (m_cec)
+    return m_cec->MuteAudio();
+  return 0;
+}
+
 void CLibCEC::AddLog(cec_log_level level, const string &strMessage)
 {
   if (m_cec)
index 66f1b75eb5c78542094908fa19b5b932e3631e03..5c9196b0224d107dec3c9dbb367b27810402a287 100644 (file)
@@ -88,6 +88,9 @@ namespace CEC
       virtual bool IsActiveDevice(cec_logical_address iAddress);
       virtual bool IsActiveDeviceType(cec_device_type type);
       virtual bool SetHDMIPort(uint8_t iPort = CEC_DEFAULT_HDMI_PORT);
+      virtual uint8_t VolumeUp(void);
+      virtual uint8_t VolumeDown(void);
+      virtual uint8_t MuteAudio(void);
     //@}
 
       virtual void AddLog(cec_log_level level, const std::string &strMessage);
index 76f2992882a97c41d4bd255da8b21aad1498ea44..08e69878d5a16becc392abadfc15883cefd24467 100644 (file)
@@ -271,4 +271,25 @@ int cec_set_hdmi_port(uint8_t iPort)
   return -1;
 }
 
+int cec_volume_up(void)
+{
+  if (cec_parser)
+    return cec_parser->VolumeUp();
+  return -1;
+}
+
+int cec_volume_down(void)
+{
+  if (cec_parser)
+    return cec_parser->VolumeDown();
+  return -1;
+}
+
+int cec_mute_audio(void)
+{
+  if (cec_parser)
+    return cec_parser->MuteAudio();
+  return -1;
+}
+
 //@}
index 11965440f037dbf581ced33b692f07545d4d809e..4a4f11fbe2434a898df529176772f57749f5c0f3 100644 (file)
@@ -108,3 +108,36 @@ bool CCECAudioSystem::TransmitSystemAudioModeStatus(cec_logical_address dest)
 
   return m_processor->Transmit(command);
 }
+
+uint8_t CCECAudioSystem::VolumeUp(void)
+{
+  return SendKey(CEC_USER_CONTROL_CODE_VOLUME_UP);
+}
+
+uint8_t CCECAudioSystem::VolumeDown(void)
+{
+  return SendKey(CEC_USER_CONTROL_CODE_VOLUME_DOWN);
+}
+
+uint8_t CCECAudioSystem::MuteAudio(void)
+{
+  return SendKey(CEC_USER_CONTROL_CODE_MUTE);
+}
+
+uint8_t CCECAudioSystem::SendKey(cec_user_control_code key)
+{
+  {
+    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 (m_processor->Transmit(command))
+      m_condition.Wait(&m_transmitMutex, 1000);
+  }
+
+  CLockObject lock(&m_mutex);
+  return m_audioStatus;
+}
index 9a9603e3af58900c02f2e4efc7548dea67411cb4..5602931a7a8602093751efcec172456606f88444 100644 (file)
@@ -47,6 +47,11 @@ namespace CEC
     virtual bool TransmitAudioStatus(cec_logical_address dest);
     virtual bool TransmitSystemAudioModeStatus(cec_logical_address dest);
 
+    virtual uint8_t VolumeUp(void);
+    virtual uint8_t VolumeDown(void);
+    virtual uint8_t MuteAudio(void);
+    virtual uint8_t SendKey(cec_user_control_code key);
+
     virtual bool TransmitActiveSource(void) { return false; }
 
   protected:
index 7a60eb2c5a9e9673c899aad00816356459da482c..e293f80b9c9225eca99039eb8e0f211f898615e0 100644 (file)
@@ -594,6 +594,18 @@ int main (int argc, char *argv[])
         {
           parser->PingAdapter();
         }
+        else if (command == "volup")
+        {
+          parser->VolumeUp();
+        }
+        else if (command == "voldown")
+        {
+          parser->VolumeDown();
+        }
+        else if (command == "mute")
+        {
+          parser->MuteAudio();
+        }
         else if (command == "mon")
         {
           CStdString strEnable;