X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=2391ca7e411d9b8d32c7fc060e7adef96f1003fa;hb=30a09f32c9fb0c3d56e3a4e8da58a04fd4c3756f;hp=afe87a979f48cdfb944291575a969f9d5009fcd7;hpb=f6b94ad2fcaf7b7e09734b32c885d507cc30e45d;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index afe87a9..2391ca7 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -48,6 +48,7 @@ using namespace std; using namespace PLATFORM; CCECProcessor::CCECProcessor(CLibCEC *controller, libcec_configuration *configuration) : + m_bConnectionOpened(false), m_bInitialised(false), m_communication(NULL), m_controller(controller), @@ -64,11 +65,10 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, libcec_configuration *configur if (m_configuration.tvVendor != CEC_VENDOR_UNKNOWN) m_busDevices[CECDEVICE_TV]->ReplaceHandler(false); - - GetCurrentConfiguration(configuration); } CCECProcessor::CCECProcessor(CLibCEC *controller, const char *strDeviceName, const cec_device_type_list &types, uint16_t iPhysicalAddress) : + m_bConnectionOpened(false), m_bInitialised(false), m_communication(NULL), m_controller(controller), @@ -143,8 +143,14 @@ void CCECProcessor::Close(void) SetInitialised(false); StopThread(); - CLockObject lock(m_mutex); - if (m_communication) + bool bClose(false); + { + CLockObject lock(m_mutex); + bClose = m_bConnectionOpened; + m_bConnectionOpened = false; + } + + if (bClose && m_communication) { m_communication->Close(); delete m_communication; @@ -155,16 +161,19 @@ void CCECProcessor::Close(void) bool CCECProcessor::OpenConnection(const char *strPort, uint16_t iBaudRate, uint32_t iTimeoutMs) { bool bReturn(false); - CLockObject lock(m_mutex); - if (m_communication) + Close(); + { - CLibCEC::AddLog(CEC_LOG_WARNING, "existing connection handler found, deleting it"); - m_communication->Close(); - delete m_communication; + CLockObject lock(m_mutex); + if (m_bConnectionOpened) + { + CLibCEC::AddLog(CEC_LOG_ERROR, "connection already opened"); + return false; + } + m_communication = new CUSBCECAdapterCommunication(this, strPort, iBaudRate); + m_bConnectionOpened = (m_communication != NULL); } - m_communication = new CUSBCECAdapterCommunication(this, strPort, iBaudRate); - /* check for an already opened connection */ if (m_communication->IsOpen()) { @@ -218,6 +227,10 @@ bool CCECProcessor::Initialise(void) /* only set our OSD name for the primary device */ m_busDevices[m_logicalAddresses.primary]->m_strDeviceName = m_configuration.strDeviceName; + + /* make the primary device the active source if the option is set */ + if (m_configuration.bActivateSource == 1) + m_busDevices[m_logicalAddresses.primary]->m_bActiveSource = true; } /* get the vendor id from the TV, so we are using the correct handler */ @@ -233,8 +246,12 @@ 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) + m_busDevices[m_logicalAddresses.primary]->ActivateSource(); + SetInitialised(bReturn); - CLibCEC::ConfigurationChanged(m_configuration); + if (bReturn) + CLibCEC::ConfigurationChanged(m_configuration); return bReturn; } @@ -554,7 +571,6 @@ bool CCECProcessor::SetHDMIPort(cec_logical_address iBaseDevice, uint8_t iPort, CLockObject lock(m_mutex); m_configuration.baseDevice = iBaseDevice; m_configuration.iHDMIPort = iPort; - m_configuration.bAutodetectAddress = false; } if (!IsRunning() && !bForce) @@ -660,11 +676,7 @@ bool CCECProcessor::SetPhysicalAddress(uint16_t iPhysicalAddress, bool bSendUpda { CLockObject lock(m_mutex); m_configuration.iPhysicalAddress = iPhysicalAddress; - if (m_configuration.bAutodetectAddress) - { - m_configuration.baseDevice = CECDEVICE_UNKNOWN; - m_configuration.iHDMIPort = 0; - } + CLibCEC::AddLog(CEC_LOG_DEBUG, "setting physical address to '%4x'", iPhysicalAddress); if (!m_logicalAddresses.IsEmpty()) { @@ -864,9 +876,11 @@ bool CCECProcessor::Transmit(const cec_command &data) return false; } - cec_adapter_message_state retVal(ADAPTER_MESSAGE_STATE_UNKNOWN); + uint8_t iMaxTries(0); { CLockObject lock(m_mutex); + if (IsStopped()) + return false; LogOutput(data); m_iLastTransmission = GetTimeMs(); if (!m_communication || !m_communication->IsOpen()) @@ -874,16 +888,11 @@ bool CCECProcessor::Transmit(const cec_command &data) CLibCEC::AddLog(CEC_LOG_ERROR, "cannot transmit command: connection closed"); return false; } - uint8_t iMaxTries = m_busDevices[data.initiator]->GetHandler()->GetTransmitRetries() + 1; - retVal = m_communication->Write(data, iMaxTries, m_iLineTimeout, m_iRetryLineTimeout); + iMaxTries = m_busDevices[data.initiator]->GetHandler()->GetTransmitRetries() + 1; } - /* set to "not present" on failed ack */ - if (retVal == ADAPTER_MESSAGE_STATE_SENT_NOT_ACKED && - data.destination != CECDEVICE_BROADCAST) - m_busDevices[data.destination]->SetDeviceStatus(CEC_DEVICE_STATUS_NOT_PRESENT); - - return retVal == ADAPTER_MESSAGE_STATE_SENT_ACKED; + return m_communication->Write(data, iMaxTries, m_iLineTimeout, m_iRetryLineTimeout) + == ADAPTER_MESSAGE_STATE_SENT_ACKED; } void CCECProcessor::TransmitAbort(cec_logical_address address, cec_opcode opcode, cec_abort_reason reason /* = CEC_ABORT_REASON_UNRECOGNIZED_OPCODE */) @@ -1303,6 +1312,8 @@ const char *CCECProcessor::ToString(const cec_opcode opcode) return "system audio mode status"; case CEC_OPCODE_SET_AUDIO_RATE: return "set audio rate"; + case CEC_OPCODE_NONE: + return "poll"; default: return "UNKNOWN"; } @@ -1347,6 +1358,8 @@ const char *CCECProcessor::ToString(const cec_vendor_id vendor) return "Philips"; case CEC_VENDOR_SONY: return "Sony"; + case CEC_VENDOR_TOSHIBA: + return "Toshiba"; default: return "Unknown"; } @@ -1451,9 +1464,9 @@ bool CCECProcessor::SetStreamPath(uint16_t iPhysicalAddress) bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) { - bool bReinit(false); + bool bReinit(false); CCECBusDevice *primary = IsRunning() ? GetPrimaryDevice() : NULL; - cec_device_type oldPrimaryType = primary ? primary->GetType() : CEC_DEVICE_TYPE_RECORDING_DEVICE; + cec_device_type oldPrimaryType = primary ? primary->GetType() : CEC_DEVICE_TYPE_RECORDING_DEVICE; m_configuration.clientVersion = configuration->clientVersion; // client version 1.5.0 @@ -1462,51 +1475,59 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) bool bDeviceTypeChanged = IsRunning () && m_configuration.deviceTypes != configuration->deviceTypes; m_configuration.deviceTypes = configuration->deviceTypes; + bool bPhysicalAddressChanged(false); + // autodetect address - uint16_t iPhysicalAddress = IsRunning() && configuration->bAutodetectAddress ? m_communication->GetPhysicalAddress() : 0; - bool bPhysicalAutodetected = IsRunning() && configuration->bAutodetectAddress && iPhysicalAddress != m_configuration.iPhysicalAddress && iPhysicalAddress != 0; - if (bPhysicalAutodetected) - { - m_configuration.iPhysicalAddress = iPhysicalAddress; - m_configuration.bAutodetectAddress = true; - } - else + bool bPhysicalAutodetected(false); + if (IsRunning() && configuration->bAutodetectAddress == 1) { - m_configuration.bAutodetectAddress = false; + uint16_t iPhysicalAddress = m_communication->GetPhysicalAddress(); + if (iPhysicalAddress != 0) + { + if (IsRunning()) + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - autodetected physical address '%4x'", __FUNCTION__, iPhysicalAddress); + bPhysicalAddressChanged = (m_configuration.iPhysicalAddress != iPhysicalAddress); + m_configuration.iPhysicalAddress = iPhysicalAddress; + m_configuration.iHDMIPort = 0; + m_configuration.baseDevice = CECDEVICE_UNKNOWN; + bPhysicalAutodetected = true; + } } // physical address - bool bPhysicalAddressChanged(false); if (!bPhysicalAutodetected) { - bPhysicalAddressChanged = IsRunning() && m_configuration.iPhysicalAddress != configuration->iPhysicalAddress; + if (configuration->iPhysicalAddress != 0) + bPhysicalAddressChanged = IsRunning() && m_configuration.iPhysicalAddress != configuration->iPhysicalAddress; + if (IsRunning()) + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using physical address '%4x'", __FUNCTION__, configuration->iPhysicalAddress); m_configuration.iPhysicalAddress = configuration->iPhysicalAddress; } - // base device bool bHdmiPortChanged(false); if (!bPhysicalAutodetected && !bPhysicalAddressChanged) { + // 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); m_configuration.baseDevice = configuration->baseDevice; - } - else - { - m_configuration.baseDevice = CECDEVICE_UNKNOWN; - } - // hdmi port - if (!bPhysicalAutodetected && !bPhysicalAddressChanged) - { + // hdmi port bHdmiPortChanged |= IsRunning() && m_configuration.iHDMIPort != configuration->iHDMIPort; + if (IsRunning()) + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using HDMI port '%d'", __FUNCTION__, configuration->iHDMIPort); m_configuration.iHDMIPort = configuration->iHDMIPort; } else { - m_configuration.iHDMIPort = 0; + if (IsRunning()) + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - resetting HDMI port and base device to defaults", __FUNCTION__); + m_configuration.baseDevice = CECDEVICE_UNKNOWN; + m_configuration.iHDMIPort = 0; } - bReinit = bPhysicalAddressChanged || bHdmiPortChanged || bDeviceTypeChanged || bPhysicalAutodetected; + bReinit = bPhysicalAddressChanged || bHdmiPortChanged || bDeviceTypeChanged; // device name snprintf(m_configuration.strDeviceName, 13, "%s", configuration->strDeviceName); @@ -1546,10 +1567,10 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) if (bReinit) { - if (bDeviceTypeChanged) - return ChangeDeviceType(oldPrimaryType, m_configuration.deviceTypes[0]); - else if (bPhysicalAddressChanged) - return SetPhysicalAddress(m_configuration.iPhysicalAddress); + if (bDeviceTypeChanged) + return ChangeDeviceType(oldPrimaryType, m_configuration.deviceTypes[0]); + else if (bPhysicalAddressChanged) + return SetPhysicalAddress(m_configuration.iPhysicalAddress); else return SetHDMIPort(m_configuration.baseDevice, m_configuration.iHDMIPort); }