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)
+ if (m_deviceStatus != CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC && command.opcode_set == 1)
m_deviceStatus = CEC_DEVICE_STATUS_PRESENT;
MarkBusy();
if (bNeedsPoll)
{
bool bPollAcked(false);
- if (bNeedsPoll || NeedsPoll())
+ if (bNeedsPoll && NeedsPoll())
bPollAcked = m_processor->PollDevice(m_iLogicalAddress);
status = bPollAcked ? CEC_DEVICE_STATUS_PRESENT : CEC_DEVICE_STATUS_NOT_PRESENT;
{
{
CLockObject lock(m_mutex);
+ if (m_bActiveSource)
+ CLibCEC::AddLog(CEC_LOG_DEBUG, "marking %s (%X) as inactive source", GetLogicalAddressName(), m_iLogicalAddress);
m_bActiveSource = false;
}
CLibCEC::AddLog(CEC_LOG_DEBUG, ">> %s (%X): stream path changed from %04x to %04x", GetLogicalAddressName(), m_iLogicalAddress, iOldAddress == 0 ? m_iStreamPath : iOldAddress, iNewAddress);
m_iStreamPath = iNewAddress;
+ CCECBusDevice *device = m_processor->GetDeviceByPhysicalAddress(iNewAddress, false);
+ if (device)
+ {
+ // if a device is found with the new physical address, mark it as active, which will automatically mark all other devices as inactive
+ device->SetActiveSource();
+ }
+ else
+ {
+ // try to find the device with the old address, and mark it as inactive when found
+ device = m_processor->GetDeviceByPhysicalAddress(iOldAddress, false);
+ if (device)
+ device->SetInactiveSource();
+ }
+
if (iNewAddress > 0)
{
lock.Unlock();
{
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;