X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=279c79ff5dbc9535ad038fa3facf31c65cb19e2f;hb=a3269a0a9e8973e29cfe073dd8e558aad173f984;hp=54794c343853a2727d27cd50a56098d439e2bb7f;hpb=271e7778636b66aa854b31288c351b774d91bd79;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index 54794c3..279c79f 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -42,7 +42,7 @@ using namespace CEC; using namespace std; CCECProcessor::CCECProcessor(CLibCEC *controller, CAdapterCommunication *serComm, const char *strDeviceName, cec_logical_address iLogicalAddress /* = CECDEVICE_PLAYBACKDEVICE1 */, uint16_t iPhysicalAddress /* = CEC_DEFAULT_PHYSICAL_ADDRESS*/) : - m_iLogicalAddress(iLogicalAddress), + m_iLogicalAddress(CECDEVICE_UNKNOWN), m_strDeviceName(strDeviceName), m_communication(serComm), m_controller(controller), @@ -54,6 +54,7 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, CAdapterCommunication *serComm CCECProcessor::~CCECProcessor(void) { + m_startCondition.Broadcast(); StopThread(); m_communication = NULL; m_controller = NULL; @@ -63,6 +64,7 @@ CCECProcessor::~CCECProcessor(void) bool CCECProcessor::Start(void) { + CLockObject lock(&m_mutex); if (!m_communication || !m_communication->IsOpen()) { m_controller->AddLog(CEC_LOG_ERROR, "connection is closed"); @@ -76,7 +78,14 @@ bool CCECProcessor::Start(void) } if (CreateThread()) + { + if (!m_startCondition.Wait(&m_mutex)) + { + m_controller->AddLog(CEC_LOG_ERROR, "could not create a processor thread"); + return false; + } return true; + } else m_controller->AddLog(CEC_LOG_ERROR, "could not create a processor thread"); @@ -85,12 +94,18 @@ bool CCECProcessor::Start(void) void *CCECProcessor::Process(void) { - m_controller->AddLog(CEC_LOG_DEBUG, "processor thread started"); + { + CLockObject lock(&m_mutex); + m_controller->AddLog(CEC_LOG_DEBUG, "processor thread started"); + m_startCondition.Signal(); + } cec_command command; CCECAdapterMessage msg; CCECAdapterMessagePtr msgPtr; + m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress); + while (!IsStopped()) { bool bParseFrame(false); @@ -187,7 +202,18 @@ bool CCECProcessor::SwitchMonitoring(bool bEnable) return m_communication && m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress); } -bool CCECProcessor::Transmit(const cec_command &data, bool bWaitForAck /* = true */) +cec_version CCECProcessor::GetDeviceCecVersion(cec_logical_address iAddress) +{ + return m_busDevices[iAddress]->GetCecVersion(); +} + +bool CCECProcessor::GetDeviceMenuLanguage(cec_logical_address iAddress, cec_menu_language *language) +{ + *language = m_busDevices[iAddress]->GetMenuLanguage(); + return (strcmp(language->language, "???")); +} + +bool CCECProcessor::Transmit(const cec_command &data) { bool bReturn(false); LogOutput(data); @@ -195,18 +221,30 @@ bool CCECProcessor::Transmit(const cec_command &data, bool bWaitForAck /* = true CCECAdapterMessagePtr output(new CCECAdapterMessage(data)); CLockObject lock(&m_mutex); - if (!m_communication || !m_communication->Write(output)) - return bReturn; - - if (bWaitForAck) - { - bool bError(false); - if ((bReturn = WaitForAck(&bError, output->size(), 1000)) == false) - m_controller->AddLog(CEC_LOG_ERROR, "did not receive ack"); - } - else { - bReturn = true; + CLockObject msgLock(&output->mutex); + if (!m_communication || !m_communication->Write(output)) + return bReturn; + else + { + output->condition.Wait(&output->mutex); + if (output->state != ADAPTER_MESSAGE_STATE_SENT) + { + m_controller->AddLog(CEC_LOG_ERROR, "command was not sent"); + return bReturn; + } + } + + if (data.ack_timeout > 0) + { + bool bError(false); + if ((bReturn = WaitForAck(&bError, output->size(), data.ack_timeout)) == false) + m_controller->AddLog(CEC_LOG_ERROR, "did not receive ack"); + } + else + { + bReturn = true; + } } return bReturn;