diff --git a/Makefile.am b/Makefile.am index b62cccd..b5e72af 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,8 @@ AUTOMAKE_OPTIONS = subdir-objects ACLOCAL_AMFLAGS = -I m4 +AM_LDFLAGS = "-pthread" + bin_PROGRAMS = libcec-daemon libcec_daemon_SOURCES = src/accumulator.hpp \ src/hdmi.cpp \ diff --git a/README.md b/README.md index 23c4859..8ca8388 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,8 @@ sudo apt-get install build-essential autoconf sudo apt-get install libboost-program-options-dev libboost-thread-dev libboost-system-dev liblog4cplus-dev ``` -* Also we need the libcec (version 3.x) libraries. Pulse eight provides east way to install +* Also we need the libcec (version 4.x) libraries. Pulse eight + provides an easy way to install ``` apt-get install libcec-dev libcec-platform-dev diff --git a/configure.ac b/configure.ac index 08a9d18..4e7c119 100644 --- a/configure.ac +++ b/configure.ac @@ -16,7 +16,7 @@ AX_CXX_COMPILE_STDCXX_11(,[mandatory]) AC_CHECK_LIB([dl], [dlopen]) # #AC_CHECK_LIB(cec, cec_initialize) -PKG_CHECK_MODULES([LIBCEC], [libcec >= 2.1], [LIBS="${LIBCEC_LIBS} ${LIBS}"], AC_MSG_ERROR("required package libcec is missing")) +PKG_CHECK_MODULES([LIBCEC], [libcec >= 4.0], [LIBS="${LIBCEC_LIBS} ${LIBS}"], AC_MSG_ERROR("required package libcec is missing")) # AC_LANG_PUSH([C++]) # diff --git a/src/libcec.cpp b/src/libcec.cpp index 1191aa9..f954c52 100644 --- a/src/libcec.cpp +++ b/src/libcec.cpp @@ -51,39 +51,34 @@ const map Cec::cecUserControlCodeName // We store a global handle, so we can use g_cec->ToString(..) in certain cases. This is a bit of a HACK :( static ICECAdapter * g_cec = NULL; -int cecLogMessage(void *cbParam, const cec_log_message message) { +void cecLogMessage(void *cbParam, const cec_log_message *message) { try { - return ((CecCallback*) cbParam)->onCecLogMessage(message); + ((CecCallback*) cbParam)->onCecLogMessage(*message); } catch (...) {} - return 0; } -int cecKeyPress(void *cbParam, const cec_keypress key) { +void cecKeyPress(void *cbParam, const cec_keypress *key) { try { - return ((CecCallback*) cbParam)->onCecKeyPress(key); + ((CecCallback*) cbParam)->onCecKeyPress(*key); } catch (...) {} - return 0; } -int cecCommand(void *cbParam, const cec_command command) { +void cecCommand(void *cbParam, const cec_command *command) { try { - return ((CecCallback*) cbParam)->onCecCommand(command); + ((CecCallback*) cbParam)->onCecCommand(*command); } catch (...) {} - return 0; } -int cecAlert(void *cbParam, const libcec_alert alert, const libcec_parameter param) { +void cecAlert(void *cbParam, const libcec_alert alert, const libcec_parameter param) { try { - return ((CecCallback*) cbParam)->onCecAlert(alert, param); + ((CecCallback*) cbParam)->onCecAlert(alert, param); } catch (...) {} - return 0; } -int cecConfigurationChanged(void *cbParam, const libcec_configuration configuration) { +void cecConfigurationChanged(void *cbParam, const libcec_configuration *configuration) { try { - return ((CecCallback*) cbParam)->onCecConfigurationChanged(configuration); + ((CecCallback*) cbParam)->onCecConfigurationChanged(*configuration); } catch (...) {} - return 0; } int cecMenuStateChanged(void *cbParam, const cec_menu_state menu_state) { @@ -95,7 +90,7 @@ int cecMenuStateChanged(void *cbParam, const cec_menu_state menu_state) { void cecSourceActivated(void *cbParam, const cec_logical_address address, const uint8_t val) { try { - return ((CecCallback*) cbParam)->onCecSourceActivated(address, val); + ((CecCallback*) cbParam)->onCecSourceActivated(address, val); } catch (...) {} } @@ -142,13 +137,13 @@ Cec::Cec(const char * name, CecCallback * callback) strncpy(config.strDeviceName, name, sizeof(config.strDeviceName)); config.deviceTypes.Add(CEC_DEVICE_TYPE_RECORDING_DEVICE); - callbacks.CBCecLogMessage = &::cecLogMessage; - callbacks.CBCecKeyPress = &::cecKeyPress; - callbacks.CBCecCommand = &::cecCommand; - callbacks.CBCecConfigurationChanged = &::cecConfigurationChanged; - callbacks.CBCecAlert = &::cecAlert; - callbacks.CBCecMenuStateChanged = &::cecMenuStateChanged; - callbacks.CBCecSourceActivated = &::cecSourceActivated; + callbacks.logMessage = &::cecLogMessage; + callbacks.keyPress = &::cecKeyPress; + callbacks.commandReceived = &::cecCommand; + callbacks.configurationChanged = &::cecConfigurationChanged; + callbacks.alert = &::cecAlert; + callbacks.menuStateChanged = &::cecMenuStateChanged; + callbacks.sourceActivated = &::cecSourceActivated; config.callbackParam = callback; config.callbacks = &callbacks; @@ -178,9 +173,9 @@ void Cec::open(const std::string &name) { init(); // Search for adapters - cec_adapter devices[MAX_CEC_PORTS]; + cec_adapter_descriptor devices[MAX_CEC_PORTS]; - uint8_t ret = cec->FindAdapters(devices, MAX_CEC_PORTS, NULL); + uint8_t ret = cec->DetectAdapters(devices, MAX_CEC_PORTS); if (ret < 0) { throw std::runtime_error("Error occurred searching for adapters"); } @@ -194,9 +189,9 @@ void Cec::open(const std::string &name) { LOG4CPLUS_INFO(logger, "Looking for " << name); for(id=0; idOpen(devices[id].comm)) { + if (!cec->Open(devices[id].strComName)) { throw std::runtime_error("Failed to open adapter"); } - LOG4CPLUS_INFO(logger, "Opened " << devices[id].path); + LOG4CPLUS_INFO(logger, "Opened " << devices[id].strComPath); } void Cec::close(bool makeInactive) { @@ -253,11 +248,11 @@ bool Cec::ping() { * This will close any open device! */ ostream & Cec::listDevices(ostream & out) { - cec_adapter devices[MAX_CEC_PORTS]; + cec_adapter_descriptor devices[MAX_CEC_PORTS]; init(); - int8_t ret = cec->FindAdapters(devices, MAX_CEC_PORTS, NULL); + int8_t ret = cec->DetectAdapters(devices, MAX_CEC_PORTS); if (ret < 0) { LOG4CPLUS_ERROR(logger, "Error occurred searching for adapters"); return out; @@ -268,9 +263,9 @@ ostream & Cec::listDevices(ostream & out) { } for (int8_t i = 0; i < ret; i++) { - out << "[" << (int) i << "] port:" << devices[i].comm << " path:" << devices[i].path << endl; + out << "[" << (int) i << "] port:" << devices[i].strComName << " path:" << devices[i].strComPath << endl; - if (!cec->Open(devices[i].comm)) { + if (!cec->Open(devices[i].strComPath)) { out << "\tFailed to open" << endl; } @@ -280,12 +275,12 @@ ostream & Cec::listDevices(ostream & out) { cec_logical_address logical_addres = (cec_logical_address) j; HDMI::physical_address physical_address(cec->GetDevicePhysicalAddress(logical_addres)); - cec_osd_name name = cec->GetDeviceOSDName(logical_addres); + std::string name = cec->GetDeviceOSDName(logical_addres); cec_vendor_id vendor = (cec_vendor_id) cec->GetDeviceVendorId(logical_addres); out << "\t" << cec->ToString(logical_addres) << " @ 0x" << hex << physical_address - << " " << name.name << " (" << cec->ToString(vendor) << ")" + << " " << name << " (" << cec->ToString(vendor) << ")" << endl; } } diff --git a/src/libcec.h b/src/libcec.h index d0678a2..6db2f1f 100644 --- a/src/libcec.h +++ b/src/libcec.h @@ -69,13 +69,13 @@ class Cec { bool ping(); // These are just wrapper functions, to map C callbacks to C++ - friend int cecLogMessage (void *cbParam, const CEC::cec_log_message &message); - friend int cecKeyPress (void *cbParam, const CEC::cec_keypress &key); - friend int cecCommand (void *cbParam, const CEC::cec_command &command); - friend int cecConfigurationChanged (void *cbParam, const CEC::libcec_configuration & configuration); - friend int cecAlert(void *cbParam, const CEC::libcec_alert alert, const CEC::libcec_parameter & param); - friend int cecMenuStateChanged(void *cbParam, const CEC::cec_menu_state & menu_state); - friend void cecSourceActivated(void *cbParam, const CEC::cec_logical_address & address, const uint8_t bActivated); + friend void cecLogMessage (void *cbParam, const CEC::cec_log_message *message); + friend void cecKeyPress (void *cbParam, const CEC::cec_keypress *key); + friend void cecCommand (void *cbParam, const CEC::cec_command *command); + friend void cecConfigurationChanged (void *cbParam, const CEC::libcec_configuration *configuration); + friend void cecAlert(void *cbParam, const CEC::libcec_alert alert, const CEC::libcec_parameter param); + friend int cecMenuStateChanged(void *cbParam, const CEC::cec_menu_state menu_state); + friend void cecSourceActivated(void *cbParam, const CEC::cec_logical_address address, const uint8_t bActivated); };