+typedef enum libcec_alert
+{
+ CEC_ALERT_SERVICE_DEVICE,
+ CEC_ALERT_CONNECTION_LOST,
+ CEC_ALERT_PERMISSION_ERROR,
+ CEC_ALERT_PORT_BUSY,
+ CEC_ALERT_PHYSICAL_ADDRESS_ERROR,
+ CEC_ALERT_TV_POLL_FAILED
+} libcec_alert;
+
+typedef enum libcec_parameter_type
+{
+ CEC_PARAMETER_TYPE_STRING,
+ CEC_PARAMETER_TYPE_UNKOWN
+} libcec_parameter_type;
+
+typedef struct libcec_parameter
+{
+ libcec_parameter_type paramType; /**< the type of this parameter */
+ void* paramData; /**< the value of this parameter */
+} libcec_parameter;
+
+typedef struct libcec_configuration libcec_configuration;
+
+typedef int (CEC_CDECL* CBCecLogMessageType)(void*, const cec_log_message);
+typedef int (CEC_CDECL* CBCecKeyPressType)(void*, const cec_keypress);
+typedef int (CEC_CDECL* CBCecCommandType)(void*, const cec_command);
+typedef int (CEC_CDECL* CBCecConfigurationChangedType)(void*, const libcec_configuration);
+typedef int (CEC_CDECL* CBCecAlertType)(void*, const libcec_alert, const libcec_parameter);
+typedef int (CEC_CDECL* CBCecMenuStateChangedType)(void*, const cec_menu_state);
+typedef void (CEC_CDECL* CBCecSourceActivatedType)(void*, const cec_logical_address, const uint8_t);
+
+typedef struct ICECCallbacks
+{
+ /*!
+ * @brief Transfer a log message from libCEC to the client.
+ * @param message The message to transfer.
+ * @return 1 when ok, 0 otherwise.
+ */
+ CBCecLogMessageType CBCecLogMessage;
+
+ /*!
+ * @brief Transfer a keypress from libCEC to the client.
+ * @param key The keypress to transfer.
+ * @return 1 when ok, 0 otherwise.
+ */
+ CBCecKeyPressType CBCecKeyPress;
+
+ /*!
+ * @brief Transfer a CEC command from libCEC to the client.
+ * @param command The command to transfer.
+ * @return 1 when ok, 0 otherwise.
+ */
+ CBCecCommandType CBCecCommand;
+
+ /*!
+ * @brief Transfer a changed configuration from libCEC to the client
+ * @param configuration The configuration to transfer
+ * @return 1 when ok, 0 otherwise
+ */
+ CBCecConfigurationChangedType CBCecConfigurationChanged;
+
+ /*!
+ * @brief Transfer a libcec alert message from libCEC to the client
+ * @param alert The alert type transfer.
+ * @param data Misc. additional information.
+ * @return 1 when ok, 0 otherwise
+ */
+ CBCecAlertType CBCecAlert;
+
+ /*!
+ * @brief Transfer a menu state change to the client.
+ * Transfer a menu state change to the client. If the command returns 1, then the change will be processed by
+ * the busdevice. If 0, then the state of the busdevice won't be changed, and will always be kept 'activated',
+ * @warning CEC does not allow the player to suppress the menu state change on the TV, so the menu on the TV will always be displayed, whatever the return value of this method is.
+ * so keypresses are always routed.
+ * @param newVal The new value.
+ * @return 1 when libCEC should use this new value, 0 otherwise.
+ */
+ CBCecMenuStateChangedType CBCecMenuStateChanged;
+
+ /*!
+ * @brief Called when a source that's handled by this client is activated.
+ * @param logicalAddress The address that was just activated.
+ * @param bActivated 1 when activated, 0 when deactivated.
+ */
+ CBCecSourceActivatedType CBCecSourceActivated;
+
+#ifdef __cplusplus
+ ICECCallbacks(void) { Clear(); }
+ ~ICECCallbacks(void) { Clear(); };
+
+ void Clear(void)
+ {
+ CBCecLogMessage = NULL;
+ CBCecKeyPress = NULL;
+ CBCecCommand = NULL;
+ CBCecConfigurationChanged = NULL;
+ CBCecAlert = NULL;
+ CBCecMenuStateChanged = NULL;
+ CBCecSourceActivated = NULL;
+ }
+#endif
+} ICECCallbacks;
+
+typedef enum cec_client_version
+{
+ CEC_CLIENT_VERSION_PRE_1_5 = 0,
+ CEC_CLIENT_VERSION_1_5_0 = 0x1500,
+ CEC_CLIENT_VERSION_1_5_1 = 0x1501,
+ CEC_CLIENT_VERSION_1_5_2 = 0x1502,
+ CEC_CLIENT_VERSION_1_5_3 = 0x1503,
+ CEC_CLIENT_VERSION_1_6_0 = 0x1600,
+ CEC_CLIENT_VERSION_1_6_1 = 0x1601,
+ CEC_CLIENT_VERSION_1_6_2 = 0x1602,
+ CEC_CLIENT_VERSION_1_6_3 = 0x1603,
+ CEC_CLIENT_VERSION_1_7_0 = 0x1700,
+ CEC_CLIENT_VERSION_1_7_1 = 0x1701,
+ CEC_CLIENT_VERSION_1_7_2 = 0x1702,
+ CEC_CLIENT_VERSION_1_8_0 = 0x1800,
+ CEC_CLIENT_VERSION_1_8_1 = 0x1801,
+ CEC_CLIENT_VERSION_1_8_2 = 0x1802,
+ CEC_CLIENT_VERSION_1_9_0 = 0x1900,
+ CEC_CLIENT_VERSION_1_99_0 = 0x1990,
+ CEC_CLIENT_VERSION_2_0_0 = 0x2000,
+ CEC_CLIENT_VERSION_2_0_1 = 0x2001,
+ CEC_CLIENT_VERSION_2_0_2 = 0x2002,
+ CEC_CLIENT_VERSION_2_0_3 = 0x2003,
+ CEC_CLIENT_VERSION_2_0_4 = 0x2004,
+ CEC_CLIENT_VERSION_2_0_5 = 0x2005,
+ CEC_CLIENT_VERSION_2_1_0 = 0x2100,
+ CEC_CLIENT_VERSION_2_1_1 = 0x2101,
+ CEC_CLIENT_VERSION_2_1_2 = 0x2102,
+ CEC_CLIENT_VERSION_2_1_3 = 0x2103,
+ CEC_CLIENT_VERSION_2_1_4 = 0x2104,
+ CEC_CLIENT_VERSION_CURRENT = 0x2104
+} cec_client_version;
+
+typedef enum cec_server_version
+{
+ CEC_SERVER_VERSION_PRE_1_5 = 0,
+ CEC_SERVER_VERSION_1_5_0 = 0x1500,
+ CEC_SERVER_VERSION_1_5_1 = 0x1501,
+ CEC_SERVER_VERSION_1_5_2 = 0x1502,
+ CEC_SERVER_VERSION_1_5_3 = 0x1503,
+ CEC_SERVER_VERSION_1_6_0 = 0x1600,
+ CEC_SERVER_VERSION_1_6_1 = 0x1601,
+ CEC_SERVER_VERSION_1_6_2 = 0x1602,
+ CEC_SERVER_VERSION_1_6_3 = 0x1603,
+ CEC_SERVER_VERSION_1_7_0 = 0x1700,
+ CEC_SERVER_VERSION_1_7_1 = 0x1701,
+ CEC_SERVER_VERSION_1_7_2 = 0x1702,
+ CEC_SERVER_VERSION_1_8_0 = 0x1800,
+ CEC_SERVER_VERSION_1_8_1 = 0x1801,
+ CEC_SERVER_VERSION_1_8_2 = 0x1802,
+ CEC_SERVER_VERSION_1_9_0 = 0x1900,
+ CEC_SERVER_VERSION_1_99_0 = 0x1990,
+ CEC_SERVER_VERSION_2_0_0 = 0x2000,
+ CEC_SERVER_VERSION_2_0_1 = 0x2001,
+ CEC_SERVER_VERSION_2_0_2 = 0x2002,
+ CEC_SERVER_VERSION_2_0_3 = 0x2003,
+ CEC_SERVER_VERSION_2_0_4 = 0x2004,
+ CEC_SERVER_VERSION_2_0_5 = 0x2005,
+ CEC_SERVER_VERSION_2_1_0 = 0x2100,
+ CEC_SERVER_VERSION_2_1_1 = 0x2101,
+ CEC_SERVER_VERSION_2_1_2 = 0x2102,
+ CEC_SERVER_VERSION_2_1_3 = 0x2103,
+ CEC_SERVER_VERSION_2_1_4 = 0x2104,
+ CEC_SERVER_VERSION_CURRENT = 0x2104
+} cec_server_version;
+
+struct libcec_configuration
+{
+ uint32_t clientVersion; /*!< the version of the client that is connecting */
+ char strDeviceName[13]; /*!< the device name to use on the CEC bus */
+ cec_device_type_list deviceTypes; /*!< the device type(s) to use on the CEC bus for libCEC */
+ uint8_t bAutodetectAddress; /*!< (read only) set to 1 by libCEC when the physical address was autodetected */
+ uint16_t iPhysicalAddress; /*!< the physical address of the CEC adapter */
+ cec_logical_address baseDevice; /*!< the logical address of the device to which the adapter is connected. only used when iPhysicalAddress = 0 or when the adapter doesn't support autodetection */
+ uint8_t iHDMIPort; /*!< the HDMI port to which the adapter is connected. only used when iPhysicalAddress = 0 or when the adapter doesn't support autodetection */
+ uint64_t tvVendor; /*!< override the vendor ID of the TV. leave this untouched to autodetect */
+ cec_logical_addresses wakeDevices; /*!< list of devices to wake when initialising libCEC or when calling PowerOnDevices() without any parameter. */
+ cec_logical_addresses powerOffDevices; /*!< list of devices to power off when calling StandbyDevices() without any parameter. */
+
+ uint32_t serverVersion; /*!< the version number of the server. read-only */
+
+ // player specific settings
+ uint8_t bGetSettingsFromROM; /*!< true to get the settings from the ROM (if set, and a v2 ROM is present), false to use these settings. */
+ uint8_t bUseTVMenuLanguage; /*!< use the menu language of the TV in the player application */
+ uint8_t bActivateSource; /*!< make libCEC the active source on the bus when starting the player application */
+ uint8_t bPowerOffScreensaver; /*!< put devices in standby mode when activating the screensaver */
+ uint8_t bPowerOnScreensaver; /*!< wake devices when deactivating the screensaver */
+ uint8_t bPowerOffOnStandby; /*!< put this PC in standby mode when the TV is switched off. only used when bShutdownOnStandby = 0 */
+ uint8_t bSendInactiveSource; /*!< send an 'inactive source' message when stopping the player. added in 1.5.1 */
+
+ void * callbackParam; /*!< the object to pass along with a call of the callback methods. NULL to ignore */
+ ICECCallbacks * callbacks; /*!< the callback methods to use. set this to NULL when not using callbacks */
+
+ cec_logical_addresses logicalAddresses; /*!< (read-only) the current logical addresses. added in 1.5.3 */
+ uint16_t iFirmwareVersion; /*!< (read-only) the firmware version of the adapter. added in 1.6.0 */
+ uint8_t bPowerOffDevicesOnStandby; /*!< put devices in standby when the PC/player is put in standby. added in 1.6.0 */
+ uint8_t bShutdownOnStandby; /*!< shutdown this PC when the TV is switched off. only used when bPowerOffOnStandby = 0. added in 1.6.0 */
+ char strDeviceLanguage[3]; /*!< the menu language used by the client. 3 character ISO 639-2 country code. see http://http://www.loc.gov/standards/iso639-2/ added in 1.6.2 */
+ uint32_t iFirmwareBuildDate; /*!< (read-only) the build date of the firmware, in seconds since epoch. if not available, this value will be set to 0. added in 1.6.2 */
+ uint8_t bMonitorOnly; /*!< won't allocate a CCECClient when starting the connection when set (same as monitor mode). added in 1.6.3 */
+ cec_version cecVersion; /*!< CEC spec version to use by libCEC. defaults to v1.4. added in 1.8.0 */
+ cec_adapter_type adapterType; /*!< type of the CEC adapter that we're connected to. added in 1.8.2 */
+ uint8_t iDoubleTapTimeoutMs; /*!< prevent double taps withing this timeout. defaults to 200ms. added in 2.0.0 */
+ cec_user_control_code comboKey; /*!< key code that initiates combo keys. defaults to CEC_USER_CONTROL_CODE_F1_BLUE. CEC_USER_CONTROL_CODE_UNKNOWN to disable. added in 2.0.5 */
+ uint32_t iComboKeyTimeoutMs; /*!< timeout until the combo key is sent as normal keypress */
+
+#ifdef __cplusplus
+ libcec_configuration(void) { Clear(); }
+ ~libcec_configuration(void) { Clear(); }
+
+ bool operator==(const libcec_configuration &other) const
+ {
+ return ( clientVersion == other.clientVersion &&
+ !strncmp(strDeviceName, other.strDeviceName, 13) &&
+ deviceTypes == other.deviceTypes &&
+ bAutodetectAddress == other.bAutodetectAddress &&
+ iPhysicalAddress == other.iPhysicalAddress &&
+ baseDevice == other.baseDevice &&
+ iHDMIPort == other.iHDMIPort &&
+ tvVendor == other.tvVendor &&
+ wakeDevices == other.wakeDevices &&
+ powerOffDevices == other.powerOffDevices &&
+ serverVersion == other.serverVersion &&
+ bGetSettingsFromROM == other.bGetSettingsFromROM &&
+ bUseTVMenuLanguage == other.bUseTVMenuLanguage &&
+ bActivateSource == other.bActivateSource &&
+ bPowerOffScreensaver == other.bPowerOffScreensaver &&
+ bPowerOffOnStandby == other.bPowerOffOnStandby &&
+ bSendInactiveSource == other.bSendInactiveSource &&
+ logicalAddresses == other.logicalAddresses &&
+ iFirmwareVersion == other.iFirmwareVersion &&
+ bPowerOffDevicesOnStandby == other.bPowerOffDevicesOnStandby &&
+ bShutdownOnStandby == other.bShutdownOnStandby &&
+ !strncmp(strDeviceLanguage, other.strDeviceLanguage, 3) &&
+ iFirmwareBuildDate == other.iFirmwareBuildDate &&
+ bMonitorOnly == other.bMonitorOnly &&
+ cecVersion == other.cecVersion &&
+ adapterType == other.adapterType &&
+ iDoubleTapTimeoutMs == other.iDoubleTapTimeoutMs &&
+ (other.clientVersion <= CEC_CLIENT_VERSION_2_0_4 || comboKey == other.comboKey) &&
+ (other.clientVersion <= CEC_CLIENT_VERSION_2_0_4 || iComboKeyTimeoutMs == other.iComboKeyTimeoutMs) &&
+ (other.clientVersion < CEC_CLIENT_VERSION_2_1_0 || bPowerOnScreensaver == other.bPowerOnScreensaver));
+ }
+
+ bool operator!=(const libcec_configuration &other) const
+ {
+ return !(*this == other);
+ }
+
+ /*!
+ * @brief Reset this configution struct to the default values.
+ */
+ void Clear(void)
+ {
+ iPhysicalAddress = CEC_PHYSICAL_ADDRESS_TV;
+ baseDevice = (cec_logical_address)CEC_DEFAULT_BASE_DEVICE;
+ iHDMIPort = CEC_DEFAULT_HDMI_PORT;
+ tvVendor = (uint64_t)CEC_VENDOR_UNKNOWN;
+ clientVersion = (uint32_t)CEC_CLIENT_VERSION_CURRENT;
+ serverVersion = (uint32_t)CEC_SERVER_VERSION_CURRENT;
+ bAutodetectAddress = 0;
+ bGetSettingsFromROM = CEC_DEFAULT_SETTING_GET_SETTINGS_FROM_ROM;
+ bUseTVMenuLanguage = CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE;
+ bActivateSource = CEC_DEFAULT_SETTING_ACTIVATE_SOURCE;
+ bPowerOffScreensaver = CEC_DEFAULT_SETTING_POWER_OFF_SCREENSAVER;
+ bPowerOnScreensaver = CEC_DEFAULT_SETTING_POWER_ON_SCREENSAVER;
+ bPowerOffOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY;
+ bShutdownOnStandby = CEC_DEFAULT_SETTING_SHUTDOWN_ON_STANDBY;
+ bSendInactiveSource = CEC_DEFAULT_SETTING_SEND_INACTIVE_SOURCE;
+ iFirmwareVersion = CEC_FW_VERSION_UNKNOWN;
+ bPowerOffDevicesOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_DEVICES_STANDBY;
+ memcpy(strDeviceLanguage, CEC_DEFAULT_DEVICE_LANGUAGE, 3);
+ iFirmwareBuildDate = CEC_FW_BUILD_UNKNOWN;
+ bMonitorOnly = 0;
+ cecVersion = (cec_version)CEC_DEFAULT_SETTING_CEC_VERSION;
+ adapterType = ADAPTERTYPE_UNKNOWN;
+ iDoubleTapTimeoutMs = CEC_DOUBLE_TAP_TIMEOUT_MS;
+ comboKey = CEC_USER_CONTROL_CODE_STOP;
+ iComboKeyTimeoutMs = CEC_DEFAULT_COMBO_TIMEOUT_MS;
+
+ memset(strDeviceName, 0, 13);
+ deviceTypes.Clear();
+ logicalAddresses.Clear();
+ wakeDevices.Clear();
+ powerOffDevices.Clear();
+
+ #if CEC_DEFAULT_SETTING_POWER_OFF_SHUTDOWN == 1
+ powerOffDevices.Set(CECDEVICE_BROADCAST);
+ #endif
+ #if CEC_DEFAULT_SETTING_ACTIVATE_SOURCE == 1
+ wakeDevices.Set(CECDEVICE_TV);
+ #endif
+
+ callbackParam = NULL;
+ callbacks = NULL;
+ }