cec: don't hold a lock in CCECBusDevice when calling GetStatus()
[deb_libcec.git] / src / lib / implementations / CECCommandHandler.cpp
index 561819f3f47d77401c5c00b6fea3f172eafb13e8..8ec93eee09d22a9902bbc24f55dc776441d61d3d 100644 (file)
@@ -716,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;
@@ -980,10 +989,14 @@ bool CCECCommandHandler::ActivateSource(void)
     primary->SetPowerStatus(CEC_POWER_STATUS_ON);
     primary->SetMenuState(CEC_MENU_STATE_ACTIVATED);
 
-    if (m_processor->GetPrimaryDevice()->GetPhysicalAddress(false) != 0xffff)
+    if (m_busDevice->GetStatus(false) == CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC)
     {
-      m_processor->SetActiveSource();
-      primary->TransmitMenuState(m_busDevice->GetLogicalAddress());
+      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;
     }
   }