X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=204a3c431e98672ae25abea6dd8488b0c455545f;hb=7c5c5bf4a9f3bf8725b5018d6fe7add742edea14;hp=59a537f63c78c38c922106808a7c0f1ed26c317a;hpb=2270ce69c7ecb1914caf617f9a9cfa2222244741;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index 59a537f..204a3c4 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -153,8 +153,6 @@ void CCECProcessor::Close(void) if (bClose && m_communication) { - m_communication->PersistConfiguration(&m_configuration); - m_communication->Close(); delete m_communication; m_communication = NULL; } @@ -176,18 +174,11 @@ bool CCECProcessor::OpenConnection(const char *strPort, uint16_t iBaudRate, uint m_bConnectionOpened = (m_communication != NULL); } - /* check for an already opened connection */ - if (m_communication->IsOpen()) - { - CLibCEC::AddLog(CEC_LOG_ERROR, "connection already opened"); - return bReturn; - } - CTimeout timeout(iTimeoutMs > 0 ? iTimeoutMs : CEC_DEFAULT_TRANSMIT_WAIT); /* open a new connection */ unsigned iConnectTry(0); - while (timeout.TimeLeft() > 0 && (bReturn = m_communication->Open(this, (timeout.TimeLeft() / CEC_CONNECT_TRIES), false, bStartListening)) == false) + while (timeout.TimeLeft() > 0 && (bReturn = m_communication->Open((timeout.TimeLeft() / CEC_CONNECT_TRIES), false, bStartListening)) == false) { CLibCEC::AddLog(CEC_LOG_ERROR, "could not open a connection (try %d)", ++iConnectTry); m_communication->Close(); @@ -201,7 +192,18 @@ bool CCECProcessor::OpenConnection(const char *strPort, uint16_t iBaudRate, uint } if (m_configuration.bGetSettingsFromROM == 1) - m_communication->GetConfiguration(&m_configuration); + { + libcec_configuration config; + config.Clear(); + m_communication->GetConfiguration(&config); + + CLockObject lock(m_mutex); + if (!config.deviceTypes.IsEmpty()) + m_configuration.deviceTypes = config.deviceTypes; + if (config.iPhysicalAddress > 0) + m_configuration.iPhysicalAddress = config.iPhysicalAddress; + snprintf(m_configuration.strDeviceName, 13, "%s", config.strDeviceName); + } return bReturn; } @@ -253,7 +255,7 @@ bool CCECProcessor::Initialise(void) else if (m_configuration.iPhysicalAddress == 0 && (bReturn = SetHDMIPort(m_configuration.baseDevice, m_configuration.iHDMIPort, true)) == false) CLibCEC::AddLog(CEC_LOG_ERROR, "unable to set HDMI port %d on %s (%x)", m_configuration.iHDMIPort, ToString(m_configuration.baseDevice), (uint8_t)m_configuration.baseDevice); - if (m_configuration.bActivateSource == 1) + if (bReturn && m_configuration.bActivateSource == 1) m_busDevices[m_configuration.logicalAddresses.primary]->ActivateSource(); SetInitialised(bReturn); @@ -514,7 +516,8 @@ bool CCECProcessor::SetActiveSource(uint16_t iStreamPath) { bool bReturn(false); - CCECBusDevice *device = GetDeviceByPhysicalAddress(iStreamPath); + // suppress polls when searching for a device + CCECBusDevice *device = GetDeviceByPhysicalAddress(iStreamPath, false, true); if (device) { device->SetActiveSource(); @@ -721,7 +724,16 @@ bool CCECProcessor::SetPhysicalAddress(uint16_t iPhysicalAddress, bool bSendUpda SetActiveView(); if (bReturn) - CLibCEC::ConfigurationChanged(m_configuration); + { + libcec_configuration config; + { + CLockObject lock(m_mutex); + config = m_configuration; + } + + PersistConfiguration(&config); + CLibCEC::ConfigurationChanged(config); + } return bReturn; } @@ -779,7 +791,7 @@ uint8_t CCECProcessor::MuteAudio(bool bSendRelease /* = true */) return status; } -CCECBusDevice *CCECProcessor::GetDeviceByPhysicalAddress(uint16_t iPhysicalAddress, bool bRefresh /* = false */) const +CCECBusDevice *CCECProcessor::GetDeviceByPhysicalAddress(uint16_t iPhysicalAddress, bool bRefresh /* = false */, bool bSuppressPoll /* = false */) const { if (m_busDevices[m_configuration.logicalAddresses.primary]->GetPhysicalAddress(false) == iPhysicalAddress) return m_busDevices[m_configuration.logicalAddresses.primary]; @@ -787,7 +799,7 @@ CCECBusDevice *CCECProcessor::GetDeviceByPhysicalAddress(uint16_t iPhysicalAddre CCECBusDevice *device = NULL; for (unsigned int iPtr = 0; iPtr < 16; iPtr++) { - if (m_busDevices[iPtr]->GetPhysicalAddress(bRefresh) == iPhysicalAddress) + if (m_busDevices[iPtr]->GetPhysicalAddress(bRefresh, bSuppressPoll) == iPhysicalAddress) { device = m_busDevices[iPtr]; break; @@ -1479,7 +1491,7 @@ bool CCECProcessor::StartBootloader(const char *strPort /* = NULL */) IAdapterCommunication *comm = new CUSBCECAdapterCommunication(this, strPort); CTimeout timeout(10000); int iConnectTry(0); - while (timeout.TimeLeft() > 0 && (bReturn = comm->Open(NULL, (timeout.TimeLeft() / CEC_CONNECT_TRIES)), true) == false) + while (timeout.TimeLeft() > 0 && (bReturn = comm->Open(timeout.TimeLeft() / CEC_CONNECT_TRIES, true)) == false) { CLibCEC::AddLog(CEC_LOG_ERROR, "could not open a connection (try %d)", ++iConnectTry); comm->Close(); @@ -1505,7 +1517,8 @@ bool CCECProcessor::PingAdapter(void) void CCECProcessor::HandlePoll(cec_logical_address initiator, cec_logical_address destination) { - m_busDevices[destination]->HandlePoll(initiator); + if (destination < CECDEVICE_BROADCAST) + m_busDevices[destination]->HandlePollFrom(initiator); } bool CCECProcessor::HandleReceiveFailed(cec_logical_address initiator) @@ -1525,12 +1538,15 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) CCECBusDevice *primary = IsRunning() ? GetPrimaryDevice() : NULL; cec_device_type oldPrimaryType = primary ? primary->GetType() : CEC_DEVICE_TYPE_RECORDING_DEVICE; m_configuration.clientVersion = configuration->clientVersion; + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using client version '%s'", __FUNCTION__, ToString((cec_client_version)configuration->clientVersion)); // client version 1.5.0 // device types bool bDeviceTypeChanged = IsRunning () && m_configuration.deviceTypes != configuration->deviceTypes; m_configuration.deviceTypes = configuration->deviceTypes; + if (bDeviceTypeChanged) + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using primary device type '%s'", __FUNCTION__, ToString(configuration->deviceTypes[0])); bool bPhysicalAddressChanged(false); @@ -1543,6 +1559,8 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) { if (IsRunning()) CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - autodetected physical address '%4x'", __FUNCTION__, iPhysicalAddress); + else + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using physical address '%x'", __FUNCTION__, iPhysicalAddress); bPhysicalAddressChanged = (m_configuration.iPhysicalAddress != iPhysicalAddress); m_configuration.iPhysicalAddress = iPhysicalAddress; m_configuration.iHDMIPort = 0; @@ -1558,8 +1576,7 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) bPhysicalAddressChanged = IsRunning() && m_configuration.iPhysicalAddress != configuration->iPhysicalAddress; if (bPhysicalAddressChanged) { - if (IsRunning()) - CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using physical address '%4x'", __FUNCTION__, configuration->iPhysicalAddress); + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - physical address '%x'", __FUNCTION__, configuration->iPhysicalAddress); m_configuration.iPhysicalAddress = configuration->iPhysicalAddress; } } @@ -1569,20 +1586,17 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) { // base device bHdmiPortChanged = IsRunning() && m_configuration.baseDevice != configuration->baseDevice; - if (IsRunning()) - CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using base device '%x'", __FUNCTION__, (int)configuration->baseDevice); + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using base device '%x'", __FUNCTION__, (int)configuration->baseDevice); m_configuration.baseDevice = configuration->baseDevice; // hdmi port bHdmiPortChanged |= IsRunning() && m_configuration.iHDMIPort != configuration->iHDMIPort; - if (IsRunning()) - CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using HDMI port '%d'", __FUNCTION__, configuration->iHDMIPort); + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using HDMI port '%d'", __FUNCTION__, configuration->iHDMIPort); m_configuration.iHDMIPort = configuration->iHDMIPort; } else { - if (IsRunning()) - CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - resetting HDMI port and base device to defaults", __FUNCTION__); + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - resetting HDMI port and base device to defaults", __FUNCTION__); m_configuration.baseDevice = CECDEVICE_UNKNOWN; m_configuration.iHDMIPort = 0; } @@ -1590,6 +1604,7 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) bReinit = bPhysicalAddressChanged || bHdmiPortChanged || bDeviceTypeChanged; // device name + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using OSD name '%s'", __FUNCTION__, configuration->strDeviceName); snprintf(m_configuration.strDeviceName, 13, "%s", configuration->strDeviceName); if (primary && !primary->GetOSDName().Equals(m_configuration.strDeviceName)) { @@ -1599,6 +1614,7 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) } // tv vendor id override + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - vendor id '%s'", __FUNCTION__, ToString((cec_vendor_id)configuration->tvVendor)); if (m_configuration.tvVendor != configuration->tvVendor) { m_configuration.tvVendor= configuration->tvVendor; @@ -1614,7 +1630,6 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) } // just copy these - m_configuration.clientVersion = configuration->clientVersion; m_configuration.bUseTVMenuLanguage = configuration->bUseTVMenuLanguage; m_configuration.bActivateSource = configuration->bActivateSource; m_configuration.bGetSettingsFromROM = configuration->bGetSettingsFromROM; @@ -1628,12 +1643,19 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) // client version 1.6.0 if (configuration->clientVersion >= CEC_CLIENT_VERSION_1_6_0) + { m_configuration.bPowerOffDevicesOnStandby = configuration->bPowerOffDevicesOnStandby; + m_configuration.bShutdownOnStandby = configuration->bShutdownOnStandby; + } // ensure that there is at least 1 device type set if (m_configuration.deviceTypes.IsEmpty()) m_configuration.deviceTypes.Add(CEC_DEVICE_TYPE_RECORDING_DEVICE); + // persist the configuration + if (IsRunning()) + m_communication->PersistConfiguration(&m_configuration); + if (bReinit) { if (bDeviceTypeChanged) @@ -1686,6 +1708,7 @@ bool CCECProcessor::GetCurrentConfiguration(libcec_configuration *configuration) { configuration->iFirmwareVersion = m_configuration.iFirmwareVersion; configuration->bPowerOffDevicesOnStandby = m_configuration.bPowerOffDevicesOnStandby; + configuration->bShutdownOnStandby = m_configuration.bShutdownOnStandby; } return true;