X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fdevices%2FCECBusDevice.cpp;h=5b9d421bd25c2dea260092887eb04c624d405658;hb=63b566782198773b401502b4db40d24caed0cfc9;hp=429d73fbd162f137870f8c5ed3b479c7fbe80504;hpb=d297cbd4fc30bc93836532a9a31027b7e64150b3;p=deb_libcec.git diff --git a/src/lib/devices/CECBusDevice.cpp b/src/lib/devices/CECBusDevice.cpp index 429d73f..5b9d421 100644 --- a/src/lib/devices/CECBusDevice.cpp +++ b/src/lib/devices/CECBusDevice.cpp @@ -372,7 +372,7 @@ bool CCECBusDevice::RequestVendorId(void) { bool bReturn(false); - if (!MyLogicalAddressContains(m_iLogicalAddress)) + if (!MyLogicalAddressContains(m_iLogicalAddress) && GetMyLogicalAddress() != CECDEVICE_UNKNOWN) { MarkBusy(); CLibCEC::AddLog(CEC_LOG_NOTICE, "<< requesting vendor ID of '%s' (%X)", GetLogicalAddressName(), m_iLogicalAddress); @@ -567,44 +567,49 @@ bool CCECBusDevice::TryLogicalAddress(void) void CCECBusDevice::SetDeviceStatus(const cec_bus_device_status newStatus) { - CLockObject lock(m_mutex); - switch (newStatus) - { - case CEC_DEVICE_STATUS_UNKNOWN: - if (m_deviceStatus != newStatus) - CLibCEC::AddLog(CEC_LOG_DEBUG, "device status of %s changed into 'unknown'", ToString(m_iLogicalAddress)); - m_iStreamPath = 0; - m_powerStatus = CEC_POWER_STATUS_UNKNOWN; - m_vendor = CEC_VENDOR_UNKNOWN; - m_menuState = CEC_MENU_STATE_ACTIVATED; - m_bActiveSource = false; - m_iLastActive = 0; - m_cecVersion = CEC_VERSION_UNKNOWN; - m_deviceStatus = newStatus; - break; - case CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC: - if (m_deviceStatus != newStatus) - CLibCEC::AddLog(CEC_LOG_DEBUG, "device status of %s changed into 'handled by libCEC'", ToString(m_iLogicalAddress)); - m_iStreamPath = 0; - m_powerStatus = CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON; - m_vendor = CEC_VENDOR_UNKNOWN; - m_menuState = CEC_MENU_STATE_ACTIVATED; - m_bActiveSource = false; - m_iLastActive = 0; - m_cecVersion = CEC_VERSION_1_3A; - m_deviceStatus = newStatus; - break; - case CEC_DEVICE_STATUS_PRESENT: - if (m_deviceStatus != newStatus) - CLibCEC::AddLog(CEC_LOG_DEBUG, "device status of %s changed into 'present'", ToString(m_iLogicalAddress)); - m_deviceStatus = newStatus; - break; - case CEC_DEVICE_STATUS_NOT_PRESENT: - if (m_deviceStatus != newStatus) - CLibCEC::AddLog(CEC_LOG_DEBUG, "device status of %s changed into 'not present'", ToString(m_iLogicalAddress)); - m_deviceStatus = newStatus; - break; + { + CLockObject lock(m_mutex); + switch (newStatus) + { + case CEC_DEVICE_STATUS_UNKNOWN: + if (m_deviceStatus != newStatus) + CLibCEC::AddLog(CEC_LOG_DEBUG, "device status of %s changed into 'unknown'", ToString(m_iLogicalAddress)); + m_iStreamPath = 0; + m_powerStatus = CEC_POWER_STATUS_UNKNOWN; + m_vendor = CEC_VENDOR_UNKNOWN; + m_menuState = CEC_MENU_STATE_ACTIVATED; + m_bActiveSource = false; + m_iLastActive = 0; + m_cecVersion = CEC_VERSION_UNKNOWN; + m_deviceStatus = newStatus; + break; + case CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC: + if (m_deviceStatus != newStatus) + CLibCEC::AddLog(CEC_LOG_DEBUG, "device status of %s changed into 'handled by libCEC'", ToString(m_iLogicalAddress)); + m_iStreamPath = 0; + m_powerStatus = CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON; + m_vendor = CEC_VENDOR_UNKNOWN; + m_menuState = CEC_MENU_STATE_ACTIVATED; + m_bActiveSource = false; + m_iLastActive = 0; + m_cecVersion = CEC_VERSION_1_3A; + m_deviceStatus = newStatus; + break; + case CEC_DEVICE_STATUS_PRESENT: + if (m_deviceStatus != newStatus) + CLibCEC::AddLog(CEC_LOG_DEBUG, "device status of %s changed into 'present'", ToString(m_iLogicalAddress)); + m_deviceStatus = newStatus; + break; + case CEC_DEVICE_STATUS_NOT_PRESENT: + if (m_deviceStatus != newStatus) + CLibCEC::AddLog(CEC_LOG_DEBUG, "device status of %s changed into 'not present'", ToString(m_iLogicalAddress)); + m_deviceStatus = newStatus; + break; + } } + + if (newStatus == CEC_DEVICE_STATUS_PRESENT) + RequestVendorId(); } void CCECBusDevice::SetPhysicalAddress(uint16_t iNewAddress) @@ -625,6 +630,20 @@ void CCECBusDevice::SetStreamPath(uint16_t iNewAddress, uint16_t iOldAddress /* 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(); @@ -869,6 +888,35 @@ bool CCECBusDevice::TransmitPhysicalAddress(void) return bReturn; } +bool CCECBusDevice::TransmitSetMenuLanguage(cec_logical_address dest) +{ + bool bReturn(false); + cec_menu_language language = GetMenuLanguage(); + + char lang[3]; + { + CLockObject lock(m_mutex); + lang[0] = language.language[0]; + lang[1] = language.language[1]; + lang[2] = language.language[2]; + } + + MarkBusy(); + if (lang[0] == '?' && lang[1] == '?' && lang[2] == '?') + { + CLibCEC::AddLog(CEC_LOG_NOTICE, "<< %s (%X) -> %s (%X): Menu language feature abort", GetLogicalAddressName(), m_iLogicalAddress, ToString(dest), dest); + m_processor->TransmitAbort(dest, CEC_OPCODE_GIVE_DEVICE_VENDOR_ID); + bReturn = true; + } + else + { + CLibCEC::AddLog(CEC_LOG_NOTICE, "<< %s (%X) -> broadcast (F): Menu language '%s'", GetLogicalAddressName(), m_iLogicalAddress, lang); + bReturn = m_handler->TransmitSetMenuLanguage(m_iLogicalAddress, lang); + } + MarkReady(); + return bReturn; +} + bool CCECBusDevice::TransmitPoll(cec_logical_address dest) { bool bReturn(false);