+ {
+ uint8_t iTries(0), iMaxTries(command.opcode == CEC_OPCODE_NONE ? 1 : m_iTransmitRetries + 1);
+ CLockObject writeLock(m_processor->m_transmitMutex);
+ CLockObject receiveLock(m_receiveMutex);
+ ++m_iUseCounter;
+ while (!bReturn && ++iTries <= iMaxTries)
+ {
+ m_expectedResponse = expectedResponse;
+ if ((bReturn = m_processor->Transmit(command)) == true)
+ {
+ CLibCEC::AddLog(CEC_LOG_DEBUG, "command transmitted");
+ if (bExpectResponse)
+ bReturn = m_condition.Wait(m_receiveMutex, m_iTransmitWait);
+ }
+ }
+ --m_iUseCounter;
+ }
+
+ MarkReady();
+ return bReturn;
+}
+
+bool CCECCommandHandler::ActivateSource(void)
+{
+ if (m_busDevice->GetLogicalAddress() == CECDEVICE_TV)
+ {
+ CCECBusDevice *primary = m_processor->GetPrimaryDevice();
+ primary->SetPowerStatus(CEC_POWER_STATUS_ON);
+ primary->SetMenuState(CEC_MENU_STATE_ACTIVATED);
+
+ if (m_processor->GetPrimaryDevice()->GetPhysicalAddress(false) != 0xffff)
+ {
+ m_processor->SetActiveSource();
+ primary->TransmitMenuState(m_busDevice->GetLogicalAddress());
+ m_bHandlerInited = true;
+ }
+ }
+ return true;
+}
+
+void CCECCommandHandler::MarkBusy(void)
+{
+ CLockObject receiveLock(m_receiveMutex);
+ ++m_iUseCounter;
+}
+
+bool CCECCommandHandler::MarkReady(void)
+{
+ CLockObject receiveLock(m_receiveMutex);
+ return m_iUseCounter > 0 ? (--m_iUseCounter == 0) : true;
+}
+
+bool CCECCommandHandler::InUse(void)
+{
+ CLockObject receiveLock(m_receiveMutex);
+ return m_iUseCounter > 0;