cec: fix venodor id change. fix physical address change
[deb_libcec.git] / src / lib / devices / CECBusDevice.cpp
index 01be1d2254f1398486e1cc1ed00333c1a50be176..fc44ebddb2b8294b3b956760074db385c0b55ed5 100644 (file)
@@ -216,7 +216,8 @@ CStdString CCECBusDevice::GetOSDName(void)
 {
   CLockObject lock(&m_mutex);
   if (GetStatus() == CEC_DEVICE_STATUS_PRESENT &&
-      m_strDeviceName.Equals(ToString(m_iLogicalAddress)))
+      m_strDeviceName.Equals(ToString(m_iLogicalAddress)) &&
+      m_type != CEC_DEVICE_TYPE_TV)
     RequestOSDName();
 
   return m_strDeviceName;
@@ -565,46 +566,41 @@ void CCECBusDevice::SetPowerStatus(const cec_power_status powerStatus)
   }
 }
 
-void CCECBusDevice::SetVendorId(uint64_t iVendorId)
+void CCECBusDevice::SetVendorId(uint64_t iVendorId, bool bInitHandler /* = true */)
 {
+  bool bVendorChanged(false);
+
   {
     CLockObject lock(&m_writeMutex);
+    bVendorChanged = (m_vendor != (cec_vendor_id)iVendorId);
     m_vendor = (cec_vendor_id)iVendorId;
 
+    if (bVendorChanged)
+      delete m_handler;
+
     switch (iVendorId)
     {
     case CEC_VENDOR_SAMSUNG:
-      if (m_handler->GetVendorId() != CEC_VENDOR_SAMSUNG)
-      {
-        delete m_handler;
+      if (bVendorChanged)
         m_handler = new CANCommandHandler(this);
-      }
       break;
     case CEC_VENDOR_LG:
-      if (m_handler->GetVendorId() != CEC_VENDOR_LG)
-      {
-        delete m_handler;
+      if (bVendorChanged)
         m_handler = new CSLCommandHandler(this);
-      }
       break;
     case CEC_VENDOR_PANASONIC:
-      if (m_handler->GetVendorId() != CEC_VENDOR_PANASONIC)
-      {
-        delete m_handler;
+      if (bVendorChanged)
         m_handler = new CVLCommandHandler(this);
-      }
       break;
     default:
-      if (m_handler->GetVendorId() != CEC_VENDOR_UNKNOWN)
-      {
-        delete m_handler;
+      if (bVendorChanged)
         m_handler = new CCECCommandHandler(this);
-      }
       break;
     }
   }
 
-  m_handler->InitHandler();
+  if (bVendorChanged && bInitHandler)
+    m_handler->InitHandler();
 
   CStdString strLog;
   strLog.Format("%s (%X): vendor = %s (%06x)", GetLogicalAddressName(), m_iLogicalAddress, ToString(m_vendor), m_vendor);
@@ -729,6 +725,10 @@ bool CCECBusDevice::TransmitOSDString(cec_logical_address dest, cec_display_cont
 bool CCECBusDevice::TransmitPhysicalAddress(void)
 {
   CLockObject lock(&m_writeMutex);
+
+  if (m_iPhysicalAddress == 0xffff)
+    return false;
+
   CStdString strLog;
   strLog.Format("<< %s (%X) -> broadcast (F): physical adddress %4x", GetLogicalAddressName(), m_iLogicalAddress, m_iPhysicalAddress);
   AddLog(CEC_LOG_NOTICE, strLog.c_str());
@@ -749,6 +749,8 @@ bool CCECBusDevice::TransmitPoll(cec_logical_address dest)
   if (dest == CECDEVICE_UNKNOWN)
     dest = m_iLogicalAddress;
 
+  CLockObject lock(&m_writeMutex);
+
   CStdString strLog;
   strLog.Format("<< %s (%X) -> %s (%X): POLL", GetLogicalAddressName(), m_iLogicalAddress, ToString(dest), dest);
   AddLog(CEC_LOG_NOTICE, strLog.c_str());
@@ -763,12 +765,8 @@ bool CCECBusDevice::TransmitPoll(cec_logical_address dest)
   }
 
   AddLog(CEC_LOG_DEBUG, bReturn ? ">> POLL sent" : ">> POLL not sent");
-
   if (bReturn)
-  {
-    CLockObject lock(&m_writeMutex);
     m_iLastActive = GetTimeMs();
-  }
 
   return bReturn;
 }