bool CCECBusDevice::TransmitImageViewOn(void) { { CLockObject lock(m_mutex); if (m_powerStatus != CEC_POWER_STATUS_ON && m_powerStatus != CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON) { LIB_CEC->AddLog(CEC_LOG_DEBUG, "<< %s (%X) is not powered on", GetLogicalAddressName(), m_iLogicalAddress); return false; } } CCECBusDevice* tv = m_processor->GetDevice(CECDEVICE_TV); if (!tv) { LIB_CEC->AddLog(CEC_LOG_ERROR, "%s - couldn't get TV instance", __FUNCTION__); return false; } if (tv->ImageViewOnSent()) { LIB_CEC->AddLog(CEC_LOG_DEBUG, "%s - 'image view on' already sent", __FUNCTION__); return true; } bool bImageViewOnSent(false); MarkBusy(); bImageViewOnSent = m_handler->TransmitImageViewOn(m_iLogicalAddress, CECDEVICE_TV); MarkReady(); if (bImageViewOnSent) tv->OnImageViewOnSent(true); return bImageViewOnSent; }
void CCECBusDevice::MarkAsActiveSource(void) { bool bWasActivated(false); // set the power status to powered on SetPowerStatus(CEC_POWER_STATUS_ON); // mark this device as active source { CLockObject lock(m_mutex); if (!m_bActiveSource) { LIB_CEC->AddLog(CEC_LOG_DEBUG, "making %s (%x) the active source", GetLogicalAddressName(), m_iLogicalAddress); bWasActivated = true; } else LIB_CEC->AddLog(CEC_LOG_DEBUG, "%s (%x) was already marked as active source", GetLogicalAddressName(), m_iLogicalAddress); m_bActiveSource = true; } CCECBusDevice* tv = m_processor->GetDevice(CECDEVICE_TV); if (tv) tv->OnImageViewOnSent(false); // mark other devices as inactive sources CECDEVICEVEC devices; m_processor->GetDevices()->Get(devices); for (CECDEVICEVEC::iterator it = devices.begin(); it != devices.end(); it++) if ((*it)->GetLogicalAddress() != m_iLogicalAddress) (*it)->MarkAsInactiveSource(); if (bWasActivated) { if (IsHandledByLibCEC()) m_processor->SetActiveSource(true, false); CCECClient *client = GetClient(); if (client) client->SourceActivated(m_iLogicalAddress); } }
void* CImageViewOnCheck::Process(void) { CCECBusDevice* tv = m_handler->m_processor->GetDevice(CECDEVICE_TV); cec_power_status status(CEC_POWER_STATUS_UNKNOWN); while (status != CEC_POWER_STATUS_ON) { m_event.Wait(TV_ON_CHECK_TIME_MS); if (!IsRunning()) return NULL; status = tv->GetPowerStatus(m_handler->m_busDevice->GetLogicalAddress()); if (status != CEC_POWER_STATUS_ON && status != CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON) { CLockObject lock(m_handler->m_mutex); tv->OnImageViewOnSent(false); m_handler->m_iActiveSourcePending = GetTimeMs(); } } return NULL; }