X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=1bd39dd84b2cdb90baf068dc8197ba37aff3f742;hb=28089abcc287456abfa31081b7978eced6e4a660;hp=f03f09bef20d7077282fc97df821e04a48b26098;hpb=c0b1d868c775f3b2d8246b183a31fe34a1ad30f5;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index f03f09b..1bd39dd 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -39,6 +39,7 @@ #include "devices/CECRecordingDevice.h" #include "devices/CECTuner.h" #include "devices/CECTV.h" +#include "implementations/CECCommandHandler.h" #include "LibCEC.h" #include "util/StdString.h" #include "platform/timeutils.h" @@ -74,29 +75,29 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, CAdapterCommunication *serComm switch(iPtr) { case CECDEVICE_AUDIOSYSTEM: - m_busDevices[iPtr] = new CCECAudioSystem(this, (cec_logical_address) iPtr, 0); + m_busDevices[iPtr] = new CCECAudioSystem(this, (cec_logical_address) iPtr, 0xFFFF); break; case CECDEVICE_PLAYBACKDEVICE1: case CECDEVICE_PLAYBACKDEVICE2: case CECDEVICE_PLAYBACKDEVICE3: - m_busDevices[iPtr] = new CCECPlaybackDevice(this, (cec_logical_address) iPtr, 0); + m_busDevices[iPtr] = new CCECPlaybackDevice(this, (cec_logical_address) iPtr, 0xFFFF); break; case CECDEVICE_RECORDINGDEVICE1: case CECDEVICE_RECORDINGDEVICE2: case CECDEVICE_RECORDINGDEVICE3: - m_busDevices[iPtr] = new CCECRecordingDevice(this, (cec_logical_address) iPtr, 0); + m_busDevices[iPtr] = new CCECRecordingDevice(this, (cec_logical_address) iPtr, 0xFFFF); break; case CECDEVICE_TUNER1: case CECDEVICE_TUNER2: case CECDEVICE_TUNER3: case CECDEVICE_TUNER4: - m_busDevices[iPtr] = new CCECTuner(this, (cec_logical_address) iPtr, 0); + m_busDevices[iPtr] = new CCECTuner(this, (cec_logical_address) iPtr, 0xFFFF); break; case CECDEVICE_TV: m_busDevices[iPtr] = new CCECTV(this, (cec_logical_address) iPtr, 0); break; default: - m_busDevices[iPtr] = new CCECBusDevice(this, (cec_logical_address) iPtr, 0); + m_busDevices[iPtr] = new CCECBusDevice(this, (cec_logical_address) iPtr, 0xFFFF); break; } } @@ -136,8 +137,9 @@ bool CCECProcessor::Start(void) return false; } -bool CCECProcessor::TryLogicalAddress(cec_logical_address address, const char *strLabel, unsigned int iIndex) +bool CCECProcessor::TryLogicalAddress(cec_logical_address address, unsigned int iIndex) { + const char *strLabel = CCECCommandHandler::ToString(address); CStdString strLog; strLog.Format("trying logical address '%s'", strLabel); AddLog(CEC_LOG_DEBUG, strLog); @@ -148,10 +150,14 @@ bool CCECProcessor::TryLogicalAddress(cec_logical_address address, const char *s strLog.Format("using logical address '%s'", strLabel); AddLog(CEC_LOG_NOTICE, strLog); - /* only set our OSD name for the primary device */ + /* only set our OSD name and active source for the primary device */ if (m_logicalAddresses.empty()) + { m_busDevices[address]->m_strDeviceName = m_strDeviceName; - m_busDevices[address]->m_powerStatus = CEC_POWER_STATUS_ON; + m_busDevices[address]->m_bActiveSource = true; + } + m_busDevices[address]->m_powerStatus = (m_types[0] == m_busDevices[address]->m_type) ? CEC_POWER_STATUS_ON : CEC_POWER_STATUS_STANDBY; + m_busDevices[address]->m_cecVersion = CEC_VERSION_1_3A; m_logicalAddresses.set(address); // TODO @@ -168,32 +174,32 @@ bool CCECProcessor::TryLogicalAddress(cec_logical_address address, const char *s bool CCECProcessor::FindLogicalAddressRecordingDevice(unsigned int iIndex) { AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'recording device'"); - return TryLogicalAddress(CECDEVICE_RECORDINGDEVICE1, "recording 1", iIndex) || - TryLogicalAddress(CECDEVICE_RECORDINGDEVICE2, "recording 2", iIndex) || - TryLogicalAddress(CECDEVICE_RECORDINGDEVICE3, "recording 3", iIndex); + return TryLogicalAddress(CECDEVICE_RECORDINGDEVICE1, iIndex) || + TryLogicalAddress(CECDEVICE_RECORDINGDEVICE2, iIndex) || + TryLogicalAddress(CECDEVICE_RECORDINGDEVICE3, iIndex); } bool CCECProcessor::FindLogicalAddressTuner(unsigned int iIndex) { AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'tuner'"); - return TryLogicalAddress(CECDEVICE_TUNER1, "tuner 1", iIndex) || - TryLogicalAddress(CECDEVICE_TUNER2, "tuner 2", iIndex) || - TryLogicalAddress(CECDEVICE_TUNER3, "tuner 3", iIndex) || - TryLogicalAddress(CECDEVICE_TUNER4, "tuner 4", iIndex); + return TryLogicalAddress(CECDEVICE_TUNER1, iIndex) || + TryLogicalAddress(CECDEVICE_TUNER2, iIndex) || + TryLogicalAddress(CECDEVICE_TUNER3, iIndex) || + TryLogicalAddress(CECDEVICE_TUNER4, iIndex); } bool CCECProcessor::FindLogicalAddressPlaybackDevice(unsigned int iIndex) { AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'playback device'"); - return TryLogicalAddress(CECDEVICE_PLAYBACKDEVICE1, "playback 1", iIndex) || - TryLogicalAddress(CECDEVICE_PLAYBACKDEVICE2, "playback 2", iIndex) || - TryLogicalAddress(CECDEVICE_PLAYBACKDEVICE3, "playback 3", iIndex); + return TryLogicalAddress(CECDEVICE_PLAYBACKDEVICE1, iIndex) || + TryLogicalAddress(CECDEVICE_PLAYBACKDEVICE2, iIndex) || + TryLogicalAddress(CECDEVICE_PLAYBACKDEVICE3, iIndex); } bool CCECProcessor::FindLogicalAddressAudioSystem(unsigned int iIndex) { AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'audio'"); - return TryLogicalAddress(CECDEVICE_AUDIOSYSTEM, "audio", iIndex); + return TryLogicalAddress(CECDEVICE_AUDIOSYSTEM, iIndex); } bool CCECProcessor::FindLogicalAddresses(void) @@ -225,6 +231,7 @@ bool CCECProcessor::FindLogicalAddresses(void) void *CCECProcessor::Process(void) { + bool bParseFrame(false); cec_command command; CCECAdapterMessage msg; @@ -249,24 +256,26 @@ void *CCECProcessor::Process(void) while (!IsStopped()) { - bool bParseFrame(false); command.clear(); msg.clear(); { CLockObject lock(&m_mutex); - if (m_communication->IsOpen() && m_communication->Read(msg, 50)) + if (m_commandBuffer.Pop(command)) + { + bParseFrame = true; + } + else if (m_communication->IsOpen() && m_communication->Read(msg, 50)) { m_controller->AddLog(msg.is_error() ? CEC_LOG_WARNING : CEC_LOG_DEBUG, msg.ToString()); - bParseFrame = ParseMessage(msg) && !IsStopped(); + if ((bParseFrame = (ParseMessage(msg) && !IsStopped()))) + command = m_currentframe; } - - if (bParseFrame) - command = m_currentframe; } if (bParseFrame) ParseCommand(command); + bParseFrame = false; Sleep(5); @@ -420,7 +429,7 @@ bool CCECProcessor::Transmit(CCECAdapterMessage *output) if (output->transmit_timeout > 0) { if ((bReturn = WaitForTransmitSucceeded(output->size(), output->transmit_timeout)) == false) - m_controller->AddLog(CEC_LOG_ERROR, "did not receive ack"); + m_controller->AddLog(CEC_LOG_DEBUG, "did not receive ack"); } else bReturn = true; @@ -476,7 +485,8 @@ bool CCECProcessor::WaitForTransmitSucceeded(uint8_t iLength, uint32_t iTimeout bError = !bTransmitSucceeded; break; default: - ParseMessage(msg); + if (ParseMessage(msg)) + m_commandBuffer.Push(m_currentframe); } iNow = GetTimeMs();