fixed - if we failed to get the physical address of the device that we are connected...
[deb_libcec.git] / src / lib / CECProcessor.cpp
index ad41d3c5f552fc5b854f556d732c2d074c387205..cc6adda8bf4826bfb0c28f63975bae66e60bfd94 100644 (file)
@@ -701,6 +701,14 @@ bool CCECProcessor::AllocateLogicalAddresses(CCECClient* client)
   return true;
 }
 
+uint16_t CCECProcessor::GetPhysicalAddressFromEeprom(void)
+{
+  libcec_configuration config; config.Clear();
+  if (m_communication)
+    m_communication->GetConfiguration(config);
+  return config.iPhysicalAddress;
+}
+
 bool CCECProcessor::RegisterClient(CCECClient *client)
 {
   if (!client)
@@ -708,7 +716,13 @@ bool CCECProcessor::RegisterClient(CCECClient *client)
 
   libcec_configuration &configuration = *client->GetConfiguration();
 
-  if (configuration.clientVersion >= CEC_CLIENT_VERSION_1_6_3 && configuration.bMonitorOnly == 1)
+  if (configuration.clientVersion < CEC_CLIENT_VERSION_2_0_0)
+  {
+    m_libcec->AddLog(CEC_LOG_ERROR, "failed to register a new CEC client: client version %s is no longer supported", ToString((cec_client_version)configuration.clientVersion));
+    return false;
+  }
+
+  if (configuration.bMonitorOnly == 1)
     return true;
 
   if (!CECInitialised())
@@ -724,13 +738,22 @@ bool CCECProcessor::RegisterClient(CCECClient *client)
   // ensure that controlled mode is enabled
   m_communication->SetControlledMode(true);
 
+  // source logical address for requests
+  cec_logical_address sourceAddress(CECDEVICE_UNREGISTERED);
+  if (!m_communication->SupportsSourceLogicalAddress(CECDEVICE_UNREGISTERED))
+  {
+    if (m_communication->SupportsSourceLogicalAddress(CECDEVICE_FREEUSE))
+      sourceAddress = CECDEVICE_FREEUSE;
+    else
+    {
+      m_libcec->AddLog(CEC_LOG_ERROR, "failed to register a new CEC client: both unregistered and free use are not supported by the device");
+      return false;
+    }
+  }
+
   // ensure that we know the vendor id of the TV
   CCECBusDevice *tv = GetTV();
-  cec_vendor_id tvVendor = CEC_VENDOR_UNKNOWN;
-  if (m_communication->SupportsSourceLogicalAddress(CECDEVICE_UNREGISTERED))
-    tvVendor = tv->GetVendorId(CECDEVICE_UNREGISTERED);
-  else if (m_communication->SupportsSourceLogicalAddress(CECDEVICE_FREEUSE))
-    tvVendor = tv->GetVendorId(CECDEVICE_FREEUSE);
+  cec_vendor_id tvVendor(tv->GetVendorId(sourceAddress));
 
   // wait until the handler is replaced, to avoid double registrations
   if (tvVendor != CEC_VENDOR_UNKNOWN &&
@@ -780,6 +803,8 @@ bool CCECProcessor::RegisterClient(CCECClient *client)
   // mark the client as registered
   client->SetRegistered(true);
 
+  sourceAddress = client->GetPrimaryLogicalAdddress();
+
   // initialise the client
   bool bReturn = client->OnRegister();
 
@@ -807,6 +832,9 @@ bool CCECProcessor::RegisterClient(CCECClient *client)
     GetTV()->MarkHandlerReady();
   }
 
+  // request the power status of the TV
+  tv->RequestPowerStatus(sourceAddress, true);
+
   return bReturn;
 }