bool CCECProcessor::IsInitialised(void)
{
- CLockObject lock(m_mutex);
+ CLockObject lock(m_threadMutex);
return m_bInitialised;
}
/* make the primary device the active source if the option is set */
if (m_configuration.bActivateSource == 1)
m_busDevices[m_configuration.logicalAddresses.primary]->m_bActiveSource = true;
+
+ /* set the default menu language for devices we control */
+ cec_menu_language language;
+ language.device = m_configuration.logicalAddresses.primary;
+ memcpy(language.language, m_configuration.strDeviceLanguage, 3);
+ language.language[3] = 0;
+
+ for (uint8_t iPtr = 0; iPtr < 16; iPtr++)
+ {
+ if (m_configuration.logicalAddresses[iPtr])
+ {
+ language.device = (cec_logical_address) iPtr;
+ m_busDevices[iPtr]->SetMenuLanguage(language);
+ }
+ }
}
/* get the vendor id from the TV, so we are using the correct handler */
previousDevice->SetCecVersion(CEC_VERSION_UNKNOWN);
newDevice->SetMenuLanguage(previousDevice->GetMenuLanguage(false));
- cec_menu_language lang;
- lang.device = previousDevice->GetLogicalAddress();
- for (unsigned int iPtr = 0; iPtr < 4; iPtr++)
- lang.language[iPtr] = '?';
- lang.language[3] = 0;
- previousDevice->SetMenuLanguage(lang);
newDevice->SetMenuState(previousDevice->GetMenuState());
previousDevice->SetMenuState(CEC_MENU_STATE_DEACTIVATED);
iMaxTries = m_busDevices[data.initiator]->GetHandler()->GetTransmitRetries() + 1;
}
- return m_communication->Write(data, iMaxTries, m_iStandardLineTimeout, m_iRetryLineTimeout)
- == ADAPTER_MESSAGE_STATE_SENT_ACKED;
+ bool bRetry(true);
+ uint8_t iTries(0);
+ uint8_t iLineTimeout = m_iStandardLineTimeout;
+ cec_adapter_message_state adapterState = ADAPTER_MESSAGE_STATE_UNKNOWN;
+
+ while (bRetry && ++iTries < iMaxTries)
+ {
+ if (m_busDevices[data.initiator]->IsUnsupportedFeature(data.opcode))
+ return false;
+
+ adapterState = m_communication->Write(data, bRetry, iLineTimeout);
+ iLineTimeout = m_iRetryLineTimeout;
+ }
+
+ return adapterState == ADAPTER_MESSAGE_STATE_SENT_ACKED;
}
void CCECProcessor::TransmitAbort(cec_logical_address address, cec_opcode opcode, cec_abort_reason reason /* = CEC_ABORT_REASON_UNRECOGNIZED_OPCODE */)
bool CCECProcessor::SetAckMask(uint16_t iMask)
{
- return m_communication->SetAckMask(iMask);
+ return m_communication ? m_communication->SetAckMask(iMask) : false;
}
bool CCECProcessor::TransmitKeypress(cec_logical_address iDestination, cec_user_control_code key, bool bWait /* = true */)
return "1.6.0";
case CEC_CLIENT_VERSION_1_6_1:
return "1.6.1";
+ case CEC_CLIENT_VERSION_1_6_2:
+ return "1.6.2";
default:
return "Unknown";
}
return "1.6.0";
case CEC_SERVER_VERSION_1_6_1:
return "1.6.1";
+ case CEC_SERVER_VERSION_1_6_2:
+ return "1.6.2";
default:
return "Unknown";
}
m_configuration.bShutdownOnStandby = configuration->bShutdownOnStandby;
}
+ // client version 1.6.2
+ if (configuration->clientVersion >= CEC_CLIENT_VERSION_1_6_2)
+ {
+ snprintf(m_configuration.strDeviceLanguage, 3, "%s", configuration->strDeviceLanguage);
+ }
+
// ensure that there is at least 1 device type set
if (m_configuration.deviceTypes.IsEmpty())
m_configuration.deviceTypes.Add(CEC_DEVICE_TYPE_RECORDING_DEVICE);
bool CCECProcessor::CanPersistConfiguration(void)
{
- return m_communication->GetFirmwareVersion() >= 2;
+ return m_communication ? m_communication->GetFirmwareVersion() >= 2 : false;
}
bool CCECProcessor::PersistConfiguration(libcec_configuration *configuration)
{
- return m_communication->PersistConfiguration(configuration);
+ return m_communication ? m_communication->PersistConfiguration(configuration) : false;
}
void CCECProcessor::RescanActiveDevices(void)