m_cecVersion(CEC_VERSION_UNKNOWN),
m_deviceStatus(CEC_DEVICE_STATUS_UNKNOWN),
m_iHandlerUseCount(0),
- m_bAwaitingReceiveFailed(false)
+ m_bAwaitingReceiveFailed(false),
+ m_bVendorIdRequested(false)
{
m_handler = new CCECCommandHandler(this);
CLockObject lock(m_mutex);
m_iLastActive = GetTimeMs();
+ /* don't call GetStatus() here, just read the value with the mutex locked */
if (m_deviceStatus != CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC)
m_deviceStatus = CEC_DEVICE_STATUS_PRESENT;
//@{
cec_version CCECBusDevice::GetCecVersion(bool bUpdate /* = false */)
{
- bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT);
+ bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT);
bool bRequestUpdate(false);
{
CLockObject lock(m_mutex);
bRequestUpdate = bIsPresent &&
- (bUpdate || m_cecVersion == CEC_VERSION_UNKNOWN);
+ (bUpdate || m_cecVersion == CEC_VERSION_UNKNOWN);
}
if (bRequestUpdate)
+ {
+ CheckVendorIdRequested();
RequestCecVersion();
+ }
CLockObject lock(m_mutex);
return m_cecVersion;
{
bool bReturn(false);
- if (!MyLogicalAddressContains(m_iLogicalAddress))
+ if (!MyLogicalAddressContains(m_iLogicalAddress) &&
+ !IsUnsupportedFeature(CEC_OPCODE_GET_CEC_VERSION))
{
MarkBusy();
CLibCEC::AddLog(CEC_LOG_NOTICE, "<< requesting CEC version of '%s' (%X)", GetLogicalAddressName(), m_iLogicalAddress);
cec_menu_language &CCECBusDevice::GetMenuLanguage(bool bUpdate /* = false */)
{
- bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT);
+ bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT);
bool bRequestUpdate(false);
{
CLockObject lock(m_mutex);
}
if (bRequestUpdate)
+ {
+ CheckVendorIdRequested();
RequestMenuLanguage();
+ }
CLockObject lock(m_mutex);
return m_menuLanguage;
CStdString CCECBusDevice::GetOSDName(bool bUpdate /* = false */)
{
- bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT);
+ bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT);
bool bRequestUpdate(false);
{
CLockObject lock(m_mutex);
}
if (bRequestUpdate)
+ {
+ CheckVendorIdRequested();
RequestOSDName();
+ }
CLockObject lock(m_mutex);
return m_strDeviceName;
uint16_t CCECBusDevice::GetPhysicalAddress(bool bUpdate /* = false */)
{
- bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT);
+ bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT);
bool bRequestUpdate(false);
{
CLockObject lock(m_mutex);
(m_iPhysicalAddress == 0xFFFF || bUpdate);
}
- if (bRequestUpdate && !RequestPhysicalAddress())
- CLibCEC::AddLog(CEC_LOG_ERROR, "failed to request the physical address");
+ if (bRequestUpdate)
+ {
+ CheckVendorIdRequested();
+ if (!RequestPhysicalAddress())
+ CLibCEC::AddLog(CEC_LOG_ERROR, "failed to request the physical address");
+ }
CLockObject lock(m_mutex);
return m_iPhysicalAddress;
cec_power_status CCECBusDevice::GetPowerStatus(bool bUpdate /* = false */)
{
- bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT);
+ bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT);
bool bRequestUpdate(false);
{
CLockObject lock(m_mutex);
}
if (bRequestUpdate)
+ {
+ CheckVendorIdRequested();
RequestPowerStatus();
+ }
CLockObject lock(m_mutex);
return m_powerStatus;
cec_vendor_id CCECBusDevice::GetVendorId(bool bUpdate /* = false */)
{
- bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT);
+ bool bIsPresent(GetStatus() == CEC_DEVICE_STATUS_PRESENT);
bool bRequestUpdate(false);
{
CLockObject lock(m_mutex);
cec_bus_device_status CCECBusDevice::GetStatus(bool bForcePoll /* = false */)
{
- CLockObject lock(m_mutex);
- if (m_deviceStatus != CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC &&
- (m_deviceStatus == CEC_DEVICE_STATUS_UNKNOWN || bForcePoll))
+ cec_bus_device_status status(CEC_DEVICE_STATUS_UNKNOWN);
+ bool bNeedsPoll(false);
+
+ {
+ CLockObject lock(m_mutex);
+ status = m_deviceStatus;
+ bNeedsPoll = (m_deviceStatus != CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC &&
+ (m_deviceStatus == CEC_DEVICE_STATUS_UNKNOWN || bForcePoll));
+ }
+
+ if (bNeedsPoll)
{
- lock.Unlock();
bool bPollAcked(false);
- if (bForcePoll || NeedsPoll())
+ if (bNeedsPoll && NeedsPoll())
bPollAcked = m_processor->PollDevice(m_iLogicalAddress);
- lock.Lock();
- m_deviceStatus = bPollAcked ? CEC_DEVICE_STATUS_PRESENT : CEC_DEVICE_STATUS_NOT_PRESENT;
+ status = bPollAcked ? CEC_DEVICE_STATUS_PRESENT : CEC_DEVICE_STATUS_NOT_PRESENT;
+ SetDeviceStatus(status);
}
- return m_deviceStatus;
+ return status;
}
//@}
{
{
CLockObject lock(m_mutex);
+ if (m_bActiveSource)
+ CLibCEC::AddLog(CEC_LOG_DEBUG, "marking %s (%X) as inactive source", GetLogicalAddressName(), m_iLogicalAddress);
m_bActiveSource = false;
}
bool CCECBusDevice::TransmitOSDString(cec_logical_address dest, cec_display_control duration, const char *strMessage)
{
bool bReturn(false);
- if (!IsUnsupportedFeature(CEC_OPCODE_SET_OSD_STRING))
+ if (!m_processor->m_busDevices[dest]->IsUnsupportedFeature(CEC_OPCODE_SET_OSD_STRING))
{
CLibCEC::AddLog(CEC_LOG_NOTICE, "<< %s (%X) -> %s (%X): display OSD message '%s'", GetLogicalAddressName(), m_iLogicalAddress, ToString(dest), dest, strMessage);
MarkBusy();
{
CLockObject lock(m_mutex);
if (!IsActiveSource())
+ {
+ CLibCEC::AddLog(CEC_LOG_NOTICE, "power state requested of %s (%X), but we are not the active source. setting power state to standby", GetLogicalAddressName(), m_iLogicalAddress);
SetPowerStatus(CEC_POWER_STATUS_STANDBY);
+ }
CLibCEC::AddLog(CEC_LOG_NOTICE, "<< %s (%X) -> %s (%X): %s", GetLogicalAddressName(), m_iLogicalAddress, ToString(dest), dest, ToString(m_powerStatus));
state = m_powerStatus;
bool CCECBusDevice::IsUnsupportedFeature(cec_opcode opcode) const
{
- return m_unsupportedFeatures.find(opcode) != m_unsupportedFeatures.end();
+ bool bUnsupported = (m_unsupportedFeatures.find(opcode) != m_unsupportedFeatures.end());
+ if (bUnsupported)
+ CLibCEC::AddLog(CEC_LOG_NOTICE, "'%s' is marked as unsupported feature for device '%s'", ToString(opcode), GetLogicalAddressName());
+ return bUnsupported;
}
void CCECBusDevice::SetUnsupportedFeature(cec_opcode opcode)
{
+ CLibCEC::AddLog(CEC_LOG_DEBUG, "marking opcode '%s' as unsupported feature for device '%s'", ToString(opcode), GetLogicalAddressName());
m_unsupportedFeatures.insert(opcode);
}
return bReturn;
}
+void CCECBusDevice::CheckVendorIdRequested(void)
+{
+ bool bRequestVendorId(false);
+ {
+ CLockObject lock(m_mutex);
+ bRequestVendorId = !m_bVendorIdRequested;
+ m_bVendorIdRequested = true;
+ }
+
+ if (bRequestVendorId)
+ {
+ ReplaceHandler(false);
+ GetVendorId();
+ }
+}
+
//@}