X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=708536f3ae2c3eeaeca87b26eb117465ca68f388;hb=4c2e665c0dcf87d0b45c07eb592a1aebf4ccf1f7;hp=204a3c431e98672ae25abea6dd8488b0c455545f;hpb=7c5c5bf4a9f3bf8725b5018d6fe7add742edea14;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index 204a3c4..708536f 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -59,7 +59,7 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, libcec_configuration *configur { CreateBusDevices(); m_configuration.Clear(); - m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_0; + m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_1; SetConfiguration(configuration); if (m_configuration.tvVendor != CEC_VENDOR_UNKNOWN) @@ -77,7 +77,7 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, const char *strDeviceName, con m_iLastTransmission(0) { m_configuration.Clear(); - m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_0; + m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_1; // client version < 1.5.0 m_configuration.clientVersion = (uint32_t)CEC_CLIENT_VERSION_PRE_1_5; @@ -240,6 +240,21 @@ bool CCECProcessor::Initialise(void) /* 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 */ @@ -377,12 +392,6 @@ bool CCECProcessor::ChangeDeviceType(cec_device_type from, cec_device_type to) 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); @@ -894,7 +903,9 @@ cec_logical_address CCECProcessor::GetActiveSource(void) bool CCECProcessor::IsActiveSource(cec_logical_address iAddress) { - return m_busDevices[iAddress]->IsActiveSource(); + return iAddress > CECDEVICE_TV && iAddress < CECDEVICE_BROADCAST ? + m_busDevices[iAddress]->IsActiveSource() : + false; } bool CCECProcessor::Transmit(const cec_command &data) @@ -920,8 +931,21 @@ bool CCECProcessor::Transmit(const cec_command &data) 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 */) @@ -1412,6 +1436,8 @@ const char *CCECProcessor::ToString(const cec_client_version version) return "1.5.3"; case CEC_CLIENT_VERSION_1_6_0: return "1.6.0"; + case CEC_CLIENT_VERSION_1_6_1: + return "1.6.1"; default: return "Unknown"; } @@ -1433,6 +1459,8 @@ const char *CCECProcessor::ToString(const cec_server_version version) return "1.5.3"; case CEC_SERVER_VERSION_1_6_0: return "1.6.0"; + case CEC_SERVER_VERSION_1_6_1: + return "1.6.1"; default: return "Unknown"; } @@ -1648,6 +1676,12 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) 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); @@ -1656,7 +1690,7 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) if (IsRunning()) m_communication->PersistConfiguration(&m_configuration); - if (bReinit) + if (bReinit || m_configuration.logicalAddresses.IsEmpty()) { if (bDeviceTypeChanged) return ChangeDeviceType(oldPrimaryType, m_configuration.deviceTypes[0]);