cec: attempt to get the edid from nvidia's driver on linux via /proc/acpi/video/NGFX...
[deb_libcec.git] / src / lib / CECClient.cpp
index 6df9dbab4288f6898fa1316b3fbf38697a22da2d..6fe35d6d87bdbb298b3ebbed4608af38b3374807 100644 (file)
@@ -33,6 +33,7 @@
 #include "CECClient.h"
 #include "CECProcessor.h"
 #include "LibCEC.h"
+#include "CECTypeUtils.h"
 #include "devices/CECPlaybackDevice.h"
 #include "devices/CECAudioSystem.h"
 #include "devices/CECTV.h"
@@ -41,7 +42,7 @@ using namespace CEC;
 using namespace PLATFORM;
 
 #define LIB_CEC     m_processor->GetLib()
-#define ToString(x) LIB_CEC->ToString(x)
+#define ToString(x) CCECTypeUtils::ToString(x)
 
 CCECClient::CCECClient(CCECProcessor *processor, const libcec_configuration &configuration) :
     m_processor(processor),
@@ -148,7 +149,7 @@ bool CCECClient::SetHDMIPort(const cec_logical_address iBaseDevice, const uint8_
   }
 
   // don't continue if the connection isn't opened
-  if (!m_processor->IsRunning() && !bForce)
+  if (!m_processor->CECInitialised() && !bForce)
     return true;
 
   // get the PA of the base device
@@ -196,7 +197,7 @@ void CCECClient::SetPhysicalAddress(const libcec_configuration &configuration)
 {
   // try to autodetect the address
   bool bPASet(false);
-  if (m_processor->IsRunning() && configuration.bAutodetectAddress == 1)
+  if (m_processor->CECInitialised() && configuration.bAutodetectAddress == 1)
     bPASet = AutodetectPhysicalAddress();
 
   // try to use physical address setting
@@ -234,8 +235,7 @@ bool CCECClient::SetPhysicalAddress(const uint16_t iPhysicalAddress)
   }
 
   // persist the new configuration
-  if (m_processor->IsRunning())
-    m_processor->PersistConfiguration(m_configuration);
+  m_processor->PersistConfiguration(m_configuration);
 
   // set the physical address for each device
   SetDevicePhysicalAddress(iPhysicalAddress);
@@ -467,7 +467,7 @@ bool CCECClient::SendSetActiveSource(const cec_device_type type /* = CEC_DEVICE_
     CCECBusDevice *device = *devices.begin();
 
     // and activate it
-    if (!m_processor->IsRunning())
+    if (!m_processor->CECInitialised())
       device->MarkAsActiveSource();
     else if (device->HasValidPhysicalAddress())
       return device->ActivateSource();
@@ -679,21 +679,19 @@ uint8_t CCECClient::SendMuteAudio(void)
 
 bool CCECClient::SendKeypress(const cec_logical_address iDestination, const cec_user_control_code key, bool bWait /* = true */)
 {
-  CCECBusDevice *device = GetPrimaryDevice();
   CCECBusDevice *dest = m_processor->GetDevice(iDestination);
 
-  return device && dest ?
-      device->TransmitKeypress(GetPrimaryLogicalAdddress(), key, bWait) :
+  return dest ?
+      dest->TransmitKeypress(GetPrimaryLogicalAdddress(), key, bWait) :
       false;
 }
 
 bool CCECClient::SendKeyRelease(const cec_logical_address iDestination, bool bWait /* = true */)
 {
-  CCECBusDevice *device = GetPrimaryDevice();
   CCECBusDevice *dest = m_processor->GetDevice(iDestination);
 
-  return device && dest ?
-      device->TransmitKeyRelease(GetPrimaryLogicalAdddress(), bWait) :
+  return dest ?
+      dest->TransmitKeyRelease(GetPrimaryLogicalAdddress(), bWait) :
       false;
 }
 
@@ -742,12 +740,19 @@ bool CCECClient::GetCurrentConfiguration(libcec_configuration &configuration)
     memcpy(configuration.strDeviceLanguage, m_configuration.strDeviceLanguage, 3);
     configuration.iFirmwareBuildDate      = m_configuration.iFirmwareBuildDate;
   }
+
+  // client version 1.6.3
+  if (configuration.clientVersion >= CEC_CLIENT_VERSION_1_6_3)
+  {
+    configuration.bMonitorOnly            = m_configuration.bMonitorOnly;
+  }
+
   return true;
 }
 
 bool CCECClient::SetConfiguration(const libcec_configuration &configuration)
 {
-  bool bIsRunning(m_processor && m_processor->IsRunning());
+  bool bIsRunning(m_processor && m_processor->CECInitialised());
   CCECBusDevice *primary = bIsRunning ? GetPrimaryDevice() : NULL;
   uint16_t iPA = primary ? primary->GetCurrentPhysicalAddress() : CEC_INVALID_PHYSICAL_ADDRESS;
 
@@ -793,6 +798,12 @@ bool CCECClient::SetConfiguration(const libcec_configuration &configuration)
       memcpy(m_configuration.strDeviceLanguage, configuration.strDeviceLanguage, 3);
     }
 
+    // client version 1.6.3
+    if (configuration.clientVersion >= CEC_CLIENT_VERSION_1_6_3)
+    {
+      m_configuration.bMonitorOnly = configuration.bMonitorOnly;
+    }
+
     // ensure that there is at least 1 device type set
     if (m_configuration.deviceTypes.IsEmpty())
       m_configuration.deviceTypes.Add(CEC_DEVICE_TYPE_RECORDING_DEVICE);
@@ -818,8 +829,7 @@ bool CCECClient::SetConfiguration(const libcec_configuration &configuration)
     SetPhysicalAddress(configuration);
   }
 
-  if (bIsRunning)
-    m_processor->PersistConfiguration(m_configuration);
+  m_processor->PersistConfiguration(m_configuration);
 
   if (!primary)
     primary = GetPrimaryDevice();
@@ -1044,7 +1054,7 @@ void CCECClient::SetOSDName(const CStdString &strDeviceName)
   if (primary && !primary->GetCurrentOSDName().Equals(strDeviceName))
   {
     primary->SetOSDName(strDeviceName);
-    if (m_processor && m_processor->IsRunning())
+    if (m_processor && m_processor->CECInitialised())
       primary->TransmitOSDName(CECDEVICE_TV);
   }
 }
@@ -1109,7 +1119,7 @@ bool CCECClient::SetDeviceTypes(const cec_device_type_list &deviceTypes)
 
   {
     CLockObject lock(m_mutex);
-    bNeedReinit = m_processor && m_processor->IsRunning() &&
+    bNeedReinit = m_processor && m_processor->CECInitialised() &&
         (m_configuration.deviceTypes != deviceTypes);
     m_configuration.deviceTypes = deviceTypes;
   }
@@ -1157,7 +1167,7 @@ bool CCECClient::SetDevicePhysicalAddress(const uint16_t iPhysicalAddress)
 
   // reactivate the previous active source
   if (reactivateSource != CECDEVICE_UNKNOWN &&
-      m_processor->IsRunning() &&
+      m_processor->CECInitialised() &&
       IsInitialised())
   {
     CCECBusDevice *device = m_processor->GetDevice(reactivateSource);
@@ -1177,7 +1187,10 @@ bool CCECClient::SwitchMonitoring(bool bEnable)
     if (bEnable)
       return m_processor->UnregisterClient(this);
     else
+    {
+      m_configuration.bMonitorOnly = false;
       return m_processor->RegisterClient(this);
+    }
   }
 
   return false;