+ /*!
+ * @return True when this list is empty, false otherwise.
+ */
+ bool IsEmpty() const
+ {
+ bool bReturn(true);
+ for (unsigned int iPtr = 0; bReturn && iPtr < 5; iPtr++)
+ {
+ if (types[iPtr] != CEC_DEVICE_TYPE_RESERVED)
+ bReturn = false;
+ }
+ return bReturn;
+ }
+
+ /*!
+ * @brief Get the type at the requested position.
+ * @param pos The position.
+ * @return The type, or CEC_DEVICE_TYPE_RESERVED when out of bounds.
+ */
+ cec_device_type operator[](uint8_t pos) const { return pos < 5 ? types[pos] : CEC_DEVICE_TYPE_RESERVED; }
+
+ bool operator==(const cec_device_type_list &other) const
+ {
+ bool bEqual(true);
+ for (uint8_t iPtr = 0; iPtr < 5; iPtr++)
+ bEqual &= (types[iPtr] == other[iPtr]);
+ return bEqual;
+ }
+
+ bool operator!=(const cec_device_type_list &other) const
+ {
+ return !(*this == other);
+ }
+#endif
+} cec_device_type_list;
+
+typedef struct cec_logical_addresses
+{
+ cec_logical_address primary; /**< the primary logical address to use */
+ int addresses[16]; /**< the list of addresses */
+
+#ifdef __cplusplus
+ /*!
+ * @brief Clear this list.
+ */
+ void Clear(void)
+ {
+ primary = CECDEVICE_UNKNOWN;
+ for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
+ addresses[iPtr] = 0;
+ }
+
+ /*!
+ * @return True when empty, false otherwise.
+ */
+ bool IsEmpty(void) const
+ {
+ return primary == CECDEVICE_UNKNOWN;
+ }
+
+ /*!
+ * @brief Calculate the ack-mask for this list, the mask to use when determining whether to send an ack message or not.
+ * @return The ack-mask.
+ */
+ uint16_t AckMask(void) const
+ {
+ uint16_t mask = 0;
+ for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
+ if (addresses[iPtr] == 1)
+ mask |= 0x1 << iPtr;
+ return mask;
+ }
+
+ /*!
+ * @brief Mark a logical address as 'set'
+ * @param address The logical address to add to this list.
+ */
+ void Set(cec_logical_address address)
+ {
+ if (primary == CECDEVICE_UNKNOWN)
+ primary = address;
+
+ addresses[(int) address] = 1;
+ }
+
+ /*!
+ * @brief Mark a logical address as 'unset'
+ * @param address The logical address to remove from this list.
+ */
+ void Unset(cec_logical_address address)
+ {
+ if (primary == address)
+ primary = CECDEVICE_UNKNOWN;
+
+ addresses[(int) address] = 0;
+ }
+
+ /*!
+ * @brief Check whether an address is set in this list.
+ * @param address The address to check.
+ * @return True when set, false otherwise.
+ */
+ bool IsSet(cec_logical_address address) const { return addresses[(int) address] == 1; }
+
+ /*!
+ * @brief Check whether an address is set in this list.
+ * @param pos The address to check.
+ * @return True when set, false otherwise.
+ */
+ bool operator[](uint8_t pos) const { return pos < 16 ? IsSet((cec_logical_address) pos) : false; }
+
+ bool operator==(const cec_logical_addresses &other) const
+ {
+ bool bEqual(true);
+ for (uint8_t iPtr = 0; iPtr < 16; iPtr++)
+ bEqual &= ((addresses[(int)iPtr] == 1) == other[iPtr]);
+ return bEqual;
+ }
+
+ bool operator!=(const cec_logical_addresses &other) const
+ {
+ return !(*this == other);
+ }
+#endif
+} cec_logical_addresses;
+
+typedef enum libcec_alert
+{
+ CEC_ALERT_SERVICE_DEVICE
+} libcec_alert;
+
+typedef enum libcec_parameter_type
+{
+ CEC_PARAMETER_TYPE_STRING
+} libcec_parameter_type;
+
+struct libcec_parameter
+{
+ libcec_parameter_type paramType; /**< the type of this parameter */
+ void* paramData; /**< the value of this parameter */
+};
+
+struct libcec_configuration;
+
+typedef int (CEC_CDECL* CBCecLogMessageType)(void *param, const cec_log_message &);
+typedef int (CEC_CDECL* CBCecKeyPressType)(void *param, const cec_keypress &);
+typedef int (CEC_CDECL* CBCecCommandType)(void *param, const cec_command &);
+typedef int (CEC_CDECL* CBCecConfigurationChangedType)(void *param, const libcec_configuration &);
+typedef int (CEC_CDECL* CBCecAlertType)(void *param, const libcec_alert, const libcec_parameter &);
+
+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;
+} 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;
+
+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;
+
+typedef struct libcec_configuration
+{
+ uint32_t clientVersion; /*!< the version of the client that is connecting */
+ char strDeviceName[13]; /*!< how to name the device on the CEC bus */
+ cec_device_type_list deviceTypes; /*!< the CEC device types to emulate */
+ uint8_t bAutodetectAddress; /*!< try to autodetect the physical address when 1 */
+ uint16_t iPhysicalAddress; /*!< the physical address of the CEC adapter. only used when bAutodetectAddress = 0 or when the adapter doesn't support autodetection */
+ cec_logical_address baseDevice; /*!< the logical address of the device to which the adapter is connected. only used when iPhysicalAddress = 0 and bAutodetectAddress = 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 and bAutodetectAddress = 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; /*!< wake these CEC devices when initialising libCEC or when calling PowerOnDevices() without any parameter */
+ cec_logical_addresses powerOffDevices; /*!< power off these devices 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 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; /*!< the current logical addresses. read-only. added in 1.5.3 */
+ uint16_t iFirmwareVersion; /*!< 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/ */
+
+#ifdef __cplusplus
+ /*!
+ * @brief Reset this configution struct to the default values.
+ */
+ void Clear(void)
+ {
+ memset(strDeviceName, 0, 13);
+ deviceTypes.clear();
+ iPhysicalAddress = 0;
+ 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_PRE_1_5;
+ serverVersion = (uint32_t)CEC_SERVER_VERSION_PRE_1_5;
+ wakeDevices.Clear();
+ powerOffDevices.Clear();
+
+ bAutodetectAddress = 1;
+ bGetSettingsFromROM = 0;
+ bUseTVMenuLanguage = CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE;
+ bActivateSource = CEC_DEFAULT_SETTING_ACTIVATE_SOURCE;
+ #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
+ bPowerOffScreensaver = CEC_DEFAULT_SETTING_POWER_OFF_SCREENSAVER;
+ bPowerOffOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY;
+ bShutdownOnStandby = CEC_DEFAULT_SETTING_SHUTDOWN_ON_STANDBY;
+ bSendInactiveSource = CEC_DEFAULT_SETTING_SEND_INACTIVE_SOURCE;
+ logicalAddresses.Clear();
+ iFirmwareVersion = CEC_FW_VERSION_UNKNOWN;
+ bPowerOffDevicesOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_DEVICES_STANDBY;
+ memcpy(strDeviceLanguage, CEC_DEFAULT_DEVICE_LANGUAGE, 3);
+
+ callbackParam = NULL;
+ callbacks = NULL;
+ }
+#endif
+} libcec_configuration;
+
+#ifdef UNUSED
+#elif defined(__GNUC__)
+#define UNUSED(x) UNUSED_ ## x __attribute__((unused))
+#elif defined(__LCLINT__)
+#define UNUSED(x) /*@unused@*/ x
+#else
+#define UNUSED(x) x
+#endif