X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FLibCEC.cpp;h=dd8624aeb13b38506385d14078286f8c0ae1a6b5;hb=e69d8f191784c77c156ffec90db50767f91421e3;hp=ef4c84cd024d0960400eee0c5cfce524d082677e;hpb=a2198e5e7bf23df91c2cfe2acc5a75521395d531;p=deb_libcec.git diff --git a/src/lib/LibCEC.cpp b/src/lib/LibCEC.cpp index ef4c84c..dd8624a 100644 --- a/src/lib/LibCEC.cpp +++ b/src/lib/LibCEC.cpp @@ -33,6 +33,7 @@ #include "LibCEC.h" #include "adapter/USBCECAdapterDetection.h" +#include "adapter/USBCECAdapterCommunication.h" #include "CECProcessor.h" #include "devices/CECBusDevice.h" #include "platform/util/timeutils.h" @@ -59,13 +60,12 @@ CLibCEC::CLibCEC(libcec_configuration *configuration) : m_callbacks(configuration->callbacks), m_cbParam(configuration->callbackParam) { - configuration->serverVersion = CEC_SERVER_VERSION_1_5_1; + configuration->serverVersion = CEC_SERVER_VERSION_1_5_3; m_cec = new CCECProcessor(this, configuration); } CLibCEC::~CLibCEC(void) { - Close(); delete m_cec; } @@ -504,17 +504,21 @@ void * CECInitialise(libcec_configuration *configuration) bool CECStartBootloader(void) { - libcec_configuration dummy; - dummy.Clear(); - CLibCEC *lib = new CLibCEC(&dummy); - bool bReturn(false); cec_adapter deviceList[1]; if (CUSBCECAdapterDetection::FindAdapters(deviceList, 1) > 0) { - bReturn = lib->m_cec->StartBootloader(deviceList[0].comm); - delete lib; + CUSBCECAdapterCommunication comm(NULL, deviceList[0].comm); + CTimeout timeout(10000); + while (timeout.TimeLeft() > 0 && (bReturn = comm.Open(NULL, (timeout.TimeLeft() / CEC_CONNECT_TRIES)), true) == false) + { + comm.Close(); + CEvent::Sleep(500); + } + if (comm.IsOpen()) + bReturn = comm.StartBootloader(); } + return bReturn; } @@ -610,7 +614,94 @@ void CLibCEC::RescanActiveDevices(void) bool CLibCEC::IsLibCECActiveSource(void) { - return m_cec ? - m_cec->m_busDevices[m_cec->GetActiveSource()]->GetStatus(false) == CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC : - false; + bool bReturn(false); + if (m_cec) + { + cec_logical_address activeSource = m_cec->GetActiveSource(); + if (activeSource != CECDEVICE_UNKNOWN) + bReturn = m_cec->m_busDevices[activeSource]->GetStatus(false) == CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC; + } + return bReturn; +} + +cec_device_type CLibCEC::GetType(cec_logical_address address) +{ + switch (address) + { + case CECDEVICE_AUDIOSYSTEM: + return CEC_DEVICE_TYPE_AUDIO_SYSTEM; + case CECDEVICE_PLAYBACKDEVICE1: + case CECDEVICE_PLAYBACKDEVICE2: + case CECDEVICE_PLAYBACKDEVICE3: + return CEC_DEVICE_TYPE_PLAYBACK_DEVICE; + case CECDEVICE_RECORDINGDEVICE1: + case CECDEVICE_RECORDINGDEVICE2: + case CECDEVICE_RECORDINGDEVICE3: + return CEC_DEVICE_TYPE_RECORDING_DEVICE; + case CECDEVICE_TUNER1: + case CECDEVICE_TUNER2: + case CECDEVICE_TUNER3: + case CECDEVICE_TUNER4: + return CEC_DEVICE_TYPE_TUNER; + case CECDEVICE_TV: + return CEC_DEVICE_TYPE_TV; + default: + return CEC_DEVICE_TYPE_RESERVED; + } +} + +uint16_t CLibCEC::GetMaskForType(cec_logical_address address) +{ + return GetMaskForType(GetType(address)); +} + +uint16_t CLibCEC::GetMaskForType(cec_device_type type) +{ + switch (type) + { + case CEC_DEVICE_TYPE_AUDIO_SYSTEM: + { + cec_logical_addresses addr; + addr.Clear(); + addr.Set(CECDEVICE_AUDIOSYSTEM); + return addr.AckMask(); + } + case CEC_DEVICE_TYPE_PLAYBACK_DEVICE: + { + cec_logical_addresses addr; + addr.Clear(); + addr.Set(CECDEVICE_PLAYBACKDEVICE1); + addr.Set(CECDEVICE_PLAYBACKDEVICE2); + addr.Set(CECDEVICE_PLAYBACKDEVICE3); + return addr.AckMask(); + } + case CEC_DEVICE_TYPE_RECORDING_DEVICE: + { + cec_logical_addresses addr; + addr.Clear(); + addr.Set(CECDEVICE_RECORDINGDEVICE1); + addr.Set(CECDEVICE_RECORDINGDEVICE2); + addr.Set(CECDEVICE_RECORDINGDEVICE3); + return addr.AckMask(); + } + case CEC_DEVICE_TYPE_TUNER: + { + cec_logical_addresses addr; + addr.Clear(); + addr.Set(CECDEVICE_TUNER1); + addr.Set(CECDEVICE_TUNER2); + addr.Set(CECDEVICE_TUNER3); + addr.Set(CECDEVICE_TUNER4); + return addr.AckMask(); + } + case CEC_DEVICE_TYPE_TV: + { + cec_logical_addresses addr; + addr.Clear(); + addr.Set(CECDEVICE_TV); + return addr.AckMask(); + } + default: + return 0; + } }