X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2Fadapter%2FUSBCECAdapterCommunication.cpp;h=80670e42f5c981f01bb2b1aff2c2d6c0fec345f6;hb=9ceaabcd6eabe161b36056153c5513ab95be29a8;hp=2d8597205214408c5f9f8ba72aa6255dc550c3c3;hpb=f9e01dac894ab26e63aaa38a8df5cba237195b76;p=deb_libcec.git diff --git a/src/lib/adapter/USBCECAdapterCommunication.cpp b/src/lib/adapter/USBCECAdapterCommunication.cpp index 2d85972..80670e4 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.cpp +++ b/src/lib/adapter/USBCECAdapterCommunication.cpp @@ -40,6 +40,24 @@ using namespace std; using namespace CEC; using namespace PLATFORM; +void *CUSBCECAdapterProcessor::Process(void) +{ + cec_command command; + while (!IsStopped()) + { + if (m_inBuffer.Pop(command)) + m_callback->OnCommandReceived(command); + Sleep(5); + } + + return NULL; +} + +void CUSBCECAdapterProcessor::AddCommand(cec_command command) +{ + m_inBuffer.Push(command); +} + CUSBCECAdapterCommunication::CUSBCECAdapterCommunication(CCECProcessor *processor, const char *strPort, uint16_t iBaudRate /* = 38400 */) : m_port(NULL), m_processor(processor), @@ -48,7 +66,8 @@ CUSBCECAdapterCommunication::CUSBCECAdapterCommunication(CCECProcessor *processo m_iFirmwareVersion(CEC_FW_VERSION_UNKNOWN), m_lastInitiator(CECDEVICE_UNKNOWN), m_bNextIsEscaped(false), - m_bGotStart(false) + m_bGotStart(false), + m_messageProcessor(NULL) { m_port = new PLATFORM::CSerialPort(strPort, iBaudRate); } @@ -178,7 +197,11 @@ void CUSBCECAdapterCommunication::Close(void) void *CUSBCECAdapterCommunication::Process(void) { + m_messageProcessor = new CUSBCECAdapterProcessor(m_callback); + m_messageProcessor->CreateThread(); + cec_command command; + command.Clear(); bool bCommandReceived(false); while (!IsStopped()) { @@ -190,7 +213,7 @@ void *CUSBCECAdapterCommunication::Process(void) /* push the next command to the callback method if there is one */ if (!IsStopped() && bCommandReceived) - m_callback->OnCommandReceived(command); + m_messageProcessor->AddCommand(command); if (!IsStopped()) { @@ -199,6 +222,10 @@ void *CUSBCECAdapterCommunication::Process(void) } } + /* stop the message processor */ + m_messageProcessor->StopThread(); + delete m_messageProcessor; + /* notify all threads that are waiting on messages to be sent */ CCECAdapterMessage *msg(NULL); while (m_outBuffer.Pop(msg)) @@ -364,6 +391,7 @@ bool CUSBCECAdapterCommunication::ParseMessage(const CCECAdapterMessage &msg) if (msg.IsEmpty()) return bEom; + CLockObject adapterLock(m_mutex); switch(msg.Message()) { case MSGCODE_FRAME_START: @@ -636,7 +664,7 @@ void CUSBCECAdapterCommunication::AddData(uint8_t *data, size_t iLen) m_bGotStart = false; m_bNextIsEscaped = false; m_bHasData = true; - m_rcvCondition.Signal(); + m_rcvCondition.Broadcast(); } else if (m_bNextIsEscaped) {