cec: fix active source switches for the standard CEC implementation. added some log...
[deb_libcec.git] / src / lib / implementations / CECCommandHandler.cpp
index 8c1895894253e0d5e2210da3d9b1e78bf5797205..83d993682b510d97132aa98af76e969410c2536a 100644 (file)
@@ -57,8 +57,6 @@ CCECCommandHandler::CCECCommandHandler(CCECBusDevice *busDevice) :
 
 CCECCommandHandler::~CCECCommandHandler(void)
 {
-  CLockObject lock(m_processor->m_transmitMutex);
-  CLockObject receiveLock(m_receiveMutex);
   m_condition.Broadcast();
 }
 
@@ -341,6 +339,7 @@ bool CCECCommandHandler::HandleGivePhysicalAddress(const cec_command &command)
     {
       device->SetActiveSource();
       return device->TransmitPhysicalAddress() &&
+          device->TransmitImageViewOn() &&
           device->TransmitActiveSource();
     }
   }
@@ -508,6 +507,7 @@ bool CCECCommandHandler::HandleSetStreamPath(const cec_command &command)
     if (device && m_busDevice->MyLogicalAddressContains(device->GetLogicalAddress()))
     {
       device->SetActiveSource();
+      device->TransmitImageViewOn();
       device->TransmitActiveSource();
 
       device->SetMenuState(CEC_MENU_STATE_ACTIVATED);
@@ -607,6 +607,7 @@ bool CCECCommandHandler::HandleUserControlPressed(const cec_command &command)
           if (device->MyLogicalAddressContains(device->GetLogicalAddress()))
           {
             device->SetActiveSource();
+            device->TransmitImageViewOn();
             device->TransmitActiveSource();
 
             if (device->GetType() == CEC_DEVICE_TYPE_PLAYBACK_DEVICE ||
@@ -715,6 +716,15 @@ void CCECCommandHandler::SetPhysicalAddress(cec_logical_address iAddress, uint16
   }
 }
 
+bool CCECCommandHandler::PowerOn(const cec_logical_address iInitiator, const cec_logical_address iDestination)
+{
+  if (iDestination == CECDEVICE_TV)
+    return TransmitImageViewOn(iInitiator, iDestination);
+
+  return TransmitKeypress(iInitiator, iDestination, CEC_USER_CONTROL_CODE_POWER) &&
+    TransmitKeyRelease(iInitiator, iDestination);
+}
+
 bool CCECCommandHandler::TransmitImageViewOn(const cec_logical_address iInitiator, const cec_logical_address iDestination)
 {
   cec_command command;
@@ -973,18 +983,20 @@ bool CCECCommandHandler::Transmit(cec_command &command, bool bExpectResponse /*
 
 bool CCECCommandHandler::ActivateSource(void)
 {
-  if (m_busDevice->GetLogicalAddress() == CECDEVICE_TV)
+  if (m_busDevice->IsActiveSource() &&
+    m_busDevice->GetStatus(false) == CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC)
   {
-    CCECBusDevice *primary = m_processor->GetPrimaryDevice();
-    primary->SetPowerStatus(CEC_POWER_STATUS_ON);
-    primary->SetMenuState(CEC_MENU_STATE_ACTIVATED);
+    m_busDevice->SetPowerStatus(CEC_POWER_STATUS_ON);
+    m_busDevice->SetMenuState(CEC_MENU_STATE_ACTIVATED);
 
-    if (m_processor->GetPrimaryDevice()->GetPhysicalAddress(false) != 0xffff)
-    {
-      m_processor->SetActiveSource();
-      primary->TransmitMenuState(m_busDevice->GetLogicalAddress());
-      m_bHandlerInited = true;
-    }
+    m_busDevice->TransmitImageViewOn();
+    m_busDevice->TransmitActiveSource();
+    m_busDevice->TransmitMenuState(CECDEVICE_TV);
+    if ((m_busDevice->GetType() == CEC_DEVICE_TYPE_PLAYBACK_DEVICE ||
+      m_busDevice->GetType() == CEC_DEVICE_TYPE_RECORDING_DEVICE) &&
+      SendDeckStatusUpdateOnActiveSource())
+      ((CCECPlaybackDevice *)m_busDevice)->TransmitDeckStatus(CECDEVICE_TV);
+    m_bHandlerInited = true;
   }
   return true;
 }