From 38f1fbcc12f5774288b55e3a75df10338f1ed70f Mon Sep 17 00:00:00 2001 From: Lars Op den Kamp Date: Tue, 26 Jun 2012 13:28:44 +0200 Subject: [PATCH] cec: abi fixes (binary compat with v1.2) --- include/cec.h | 78 +++++++++++---------- include/cectypes.h | 19 ++--- src/cec-config/cec-config.cpp | 2 + src/lib/CECClient.cpp | 1 + src/lib/CECProcessor.cpp | 4 +- src/lib/LibCEC.cpp | 16 ++++- src/lib/adapter/USBCECAdapterMessageQueue.h | 6 +- src/testclient/main.cpp | 1 + 8 files changed, 77 insertions(+), 50 deletions(-) diff --git a/include/cec.h b/include/cec.h index 4626223..a41f507 100644 --- a/include/cec.h +++ b/include/cec.h @@ -60,14 +60,6 @@ namespace CEC */ virtual void Close(void) = 0; - /*! - * @brief Set and enable the callback methods. If this method is not called, the GetNext...() methods will have to be used. - * @param cbParam Parameter to pass to callback methods. - * @param callbacks The callbacks to set. - * @return True when enabled, false otherwise. - */ - virtual bool EnableCallbacks(void *cbParam, ICECCallbacks *callbacks) = 0; - /*! * @brief Try to find all connected CEC adapters. Only implemented on Linux and Windows at the moment. * @param deviceList The vector to store device descriptors in. @@ -153,21 +145,6 @@ namespace CEC */ virtual bool SetPhysicalAddress(uint16_t iPhysicalAddress = CEC_DEFAULT_PHYSICAL_ADDRESS) = 0; - /*! - * @deprecated Use libcec_configuration instead. - * @brief Enable physical address detection (if the connected adapter supports this). - * @return True when physical address detection was enabled, false otherwise. - */ - virtual bool EnablePhysicalAddressDetection(void) = 0; - - /*! - * @brief Changes the active HDMI port. - * @param iBaseDevice The device to which this libcec is connected. - * @param iPort The new port number. - * @return True when changed, false otherwise. - */ - virtual bool SetHDMIPort(cec_logical_address iBaseDevice, uint8_t iPort) = 0; - /*! * @brief Power on the connected CEC capable devices. * @param address The logical address to power on. @@ -269,13 +246,6 @@ namespace CEC */ virtual cec_power_status GetDevicePowerStatus(cec_logical_address iLogicalAddress) = 0; - /*! - * @brief Get the physical address of the device with the given logical address. - * @param iLogicalAddress The device to get the vendor id for. - * @return The physical address or 0 if it wasn't found. - */ - virtual uint16_t GetDevicePhysicalAddress(cec_logical_address iLogicalAddress) = 0; - /*! * @brief Sends a POLL message to a device. * @param iLogicalAddress The device to send the message to. @@ -436,6 +406,36 @@ namespace CEC * @return True when the device was found, false otherwise */ virtual bool GetDeviceInformation(const char *strPort, libcec_configuration *config, uint32_t iTimeoutMs = 10000) = 0; + + /*! + * @brief Set and enable the callback methods. If this method is not called, the GetNext...() methods will have to be used. + * @param cbParam Parameter to pass to callback methods. + * @param callbacks The callbacks to set. + * @return True when enabled, false otherwise. + */ + virtual bool EnableCallbacks(void *cbParam, ICECCallbacks *callbacks) = 0; + + /*! + * @deprecated Use libcec_configuration instead. + * @brief Enable physical address detection (if the connected adapter supports this). + * @return True when physical address detection was enabled, false otherwise. + */ + virtual bool EnablePhysicalAddressDetection(void) = 0; + + /*! + * @brief Changes the active HDMI port. + * @param iBaseDevice The device to which this libcec is connected. + * @param iPort The new port number. + * @return True when changed, false otherwise. + */ + virtual bool SetHDMIPort(cec_logical_address iBaseDevice, uint8_t iPort) = 0; + + /*! + * @brief Get the physical address of the device with the given logical address. + * @param iLogicalAddress The device to get the vendor id for. + * @return The physical address or 0 if it wasn't found. + */ + virtual uint16_t GetDevicePhysicalAddress(cec_logical_address iLogicalAddress) = 0; }; }; @@ -443,10 +443,19 @@ namespace CEC * @brief Load the CEC adapter library. * @param strDeviceName How to present this device to other devices. * @param deviceTypes The device types to use on the CEC bus. - * @param iPhysicalAddress The physical address to assume on the bus. If set to 0, libCEC will try to autodetect the address, with the data provided via SetHDMIPort() * @return An instance of ICECAdapter or NULL on error. */ -extern "C" DECLSPEC void * CECInit(const char *strDeviceName, CEC::cec_device_type_list deviceTypes, uint16_t iPhysicalAddress = 0); +extern "C" DECLSPEC void * CECInit(const char *strDeviceName, CEC::cec_device_type_list deviceTypes); + +/*! + * @deprecated + */ +extern "C" DECLSPEC void * CECCreate(const char *strDeviceName, CEC::cec_logical_address iLogicalAddress = CEC::CECDEVICE_PLAYBACKDEVICE1, uint16_t iPhysicalAddress = CEC_DEFAULT_PHYSICAL_ADDRESS); + +/*! + * @brief Unload the CEC adapter library. + */ +extern "C" DECLSPEC void CECDestroy(CEC::ICECAdapter *instance); /*! * @brief Load the CEC adapter library. @@ -461,9 +470,4 @@ extern "C" DECLSPEC void * CECInitialise(CEC::libcec_configuration *configuratio */ extern "C" DECLSPEC bool CECStartBootloader(void); -/*! - * @brief Unload the CEC adapter library. - */ -extern "C" DECLSPEC void CECDestroy(CEC::ICECAdapter *instance); - #endif /* CECEXPORTS_H_ */ diff --git a/include/cectypes.h b/include/cectypes.h index 4f74d8d..47168a2 100644 --- a/include/cectypes.h +++ b/include/cectypes.h @@ -802,10 +802,11 @@ typedef struct cec_command int32_t transmit_timeout; /**< the timeout to use in ms */ #ifdef __cplusplus - cec_command(void) - { - Clear(); - } + // @todo re-add in v2.0 (breaks ABI) + //cec_command(void) + //{ + // Clear(); + //} cec_command &operator =(const struct cec_command &command) { @@ -1193,8 +1194,9 @@ typedef struct ICECCallbacks CBCecSourceActivatedType CBCecSourceActivated; #ifdef __cplusplus - ICECCallbacks(void) { Clear(); } - ~ICECCallbacks(void) { Clear(); }; + // @todo re-add in v2.0 (breaks ABI) + // ICECCallbacks(void) { Clear(); } + //~ICECCallbacks(void) { Clear(); }; void Clear(void) { @@ -1274,8 +1276,9 @@ typedef struct libcec_configuration uint8_t bMonitorOnly; /*!< won't allocate a CCECClient when starting the connection when set (same as monitor mode). added in 1.6.3 */ #ifdef __cplusplus - libcec_configuration(void) { Clear(); } - ~libcec_configuration(void) { Clear(); } + // @todo re-add in v2.0 (breaks ABI) + // libcec_configuration(void) { Clear(); } + //~libcec_configuration(void) { Clear(); } bool operator==(const libcec_configuration &other) const { diff --git a/src/cec-config/cec-config.cpp b/src/cec-config/cec-config.cpp index 57931ee..7b203cb 100644 --- a/src/cec-config/cec-config.cpp +++ b/src/cec-config/cec-config.cpp @@ -315,6 +315,8 @@ bool PowerOnTV(uint64_t iTimeout = 60000) int main (int UNUSED(argc), char *UNUSED(argv[])) { + g_callbacks.Clear(); + g_config.Clear(); PrintToStdOut("=== USB-CEC Adapter Configuration ===\n"); if (!OpenConnection()) return 1; diff --git a/src/lib/CECClient.cpp b/src/lib/CECClient.cpp index afbaaaf..e403360 100644 --- a/src/lib/CECClient.cpp +++ b/src/lib/CECClient.cpp @@ -53,6 +53,7 @@ CCECClient::CCECClient(CCECProcessor *processor, const libcec_configuration &con m_buttontime(0), m_iPreventForwardingPowerOffCommand(0) { + m_configuration.Clear(); // set the initial configuration SetConfiguration(configuration); } diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index 324c558..4d4abba 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -207,7 +207,7 @@ void *CCECProcessor::Process(void) { m_libcec->AddLog(CEC_LOG_DEBUG, "processor thread started"); - cec_command command; + cec_command command; command.Clear(); CTimeout activeSourceCheck(ACTIVE_SOURCE_CHECK_INTERVAL); // as long as we're not being stopped and the connection is open @@ -679,7 +679,7 @@ bool CCECProcessor::RegisterClient(CCECClient *client) // get the settings from the rom if (configuration.bGetSettingsFromROM == 1) { - libcec_configuration config; + libcec_configuration config; config.Clear(); m_communication->GetConfiguration(config); CLockObject lock(m_mutex); diff --git a/src/lib/LibCEC.cpp b/src/lib/LibCEC.cpp index effade5..c0931c3 100644 --- a/src/lib/LibCEC.cpp +++ b/src/lib/LibCEC.cpp @@ -556,9 +556,9 @@ void * CECInitialise(libcec_configuration *configuration) return static_cast< void* > (lib); } -void * CECInit(const char *strDeviceName, CEC::cec_device_type_list types, uint16_t UNUSED(iPhysicalAddress) /* = 0 */) +void * CECInit(const char *strDeviceName, CEC::cec_device_type_list types) { - libcec_configuration configuration; + libcec_configuration configuration; configuration.Clear(); // client version < 1.5.0 snprintf(configuration.strDeviceName, 13, "%s", strDeviceName); @@ -571,6 +571,18 @@ void * CECInit(const char *strDeviceName, CEC::cec_device_type_list types, uint1 return CECInitialise(&configuration); } +void * CECCreate(const char *strDeviceName, CEC::cec_logical_address iLogicalAddress /* = CEC::CECDEVICE_PLAYBACKDEVICE1 */, uint16_t iPhysicalAddress /* = CEC_DEFAULT_PHYSICAL_ADDRESS */) +{ + libcec_configuration configuration; configuration.Clear(); + + // client version < 1.5.0 + snprintf(configuration.strDeviceName, 13, "%s", strDeviceName); + configuration.iPhysicalAddress = iPhysicalAddress; + configuration.deviceTypes.Add(CEC_DEVICE_TYPE_RECORDING_DEVICE); + + return CECInitialise(&configuration); +} + bool CECStartBootloader(void) { bool bReturn(false); diff --git a/src/lib/adapter/USBCECAdapterMessageQueue.h b/src/lib/adapter/USBCECAdapterMessageQueue.h index 4646fe4..44c930b 100644 --- a/src/lib/adapter/USBCECAdapterMessageQueue.h +++ b/src/lib/adapter/USBCECAdapterMessageQueue.h @@ -136,7 +136,11 @@ namespace CEC CCECAdapterMessageQueue(CUSBCECAdapterCommunication *com) : PLATFORM::CThread(), m_com(com), - m_iNextMessage(0) {} + m_iNextMessage(0) + { + m_currentCECFrame.Clear(); + } + virtual ~CCECAdapterMessageQueue(void); /*! diff --git a/src/testclient/main.cpp b/src/testclient/main.cpp index f2802a6..fe3f893 100644 --- a/src/testclient/main.cpp +++ b/src/testclient/main.cpp @@ -1106,6 +1106,7 @@ bool ProcessCommandLineArguments(int argc, char *argv[]) int main (int argc, char *argv[]) { g_config.Clear(); + g_callbacks.Clear(); snprintf(g_config.strDeviceName, 13, "CECTester"); g_config.clientVersion = CEC_CONFIG_VERSION; g_config.bActivateSource = 0; -- 2.34.1