#include <stdint.h>
#include <string.h>
+#if defined(_WIN32) || defined(_WIN64)
+#define CEC_CDECL __cdecl
+#else
+#define CEC_CDECL
+#endif
+
#if !defined(DECLSPEC)
#if defined(_WIN32) || defined(_WIN64)
#include <windows.h>
//default physical address 1.0.0.0, HDMI port 1
#define CEC_DEFAULT_PHYSICAL_ADDRESS 0x1000
+#define CEC_DEFAULT_HDMI_PORT 1
+#define CEC_DEFAULT_BASE_DEVICE 0
#define MSGSTART 0xFF
#define MSGEND 0xFE
#define MSGESC 0xFD
#define ESCOFFSET 3
#define CEC_BUTTON_TIMEOUT 500
+#define CEC_POWER_STATE_REFRESH_TIME 30000
+
+#define CEC_DEFAULT_TRANSMIT_TIMEOUT 1000
+#define CEC_DEFAULT_TRANSMIT_WAIT 2000
+#define CEC_DEFAULT_TRANSMIT_RETRIES 1
#define CEC_MIN_LIB_VERSION 1
#define CEC_LIB_VERSION_MAJOR 1
-#define CEC_LIB_VERSION_MINOR 2
+#define CEC_LIB_VERSION_MINOR 4
typedef enum cec_abort_reason
{
CEC_DECK_INFO_SKIP_REVERSE_REWIND = 0x1C,
CEC_DECK_INFO_INDEX_SEARCH_FORWARD = 0x1D,
CEC_DECK_INFO_INDEX_SEARCH_REVERSE = 0x1E,
- CEC_DECK_INFO_OTHER_STATUS = 0x1F
+ CEC_DECK_INFO_OTHER_STATUS = 0x1F,
+ CEC_DECK_INFO_OTHER_STATUS_LG = 0x20
} cec_deck_info;
typedef enum cec_device_type
MSGCODE_FRAME_ACK = 0x40,
} cec_adapter_messagecode;
+typedef enum cec_bus_device_status
+{
+ CEC_DEVICE_STATUS_UNKNOWN,
+ CEC_DEVICE_STATUS_PRESENT,
+ CEC_DEVICE_STATUS_NOT_PRESENT,
+ CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC
+} cec_bus_device_status;
+
typedef enum cec_vendor_id
{
- CEC_VENDOR_SAMSUNG = 0x00F0,
- CEC_VENDOR_LG = 0xE091,
- CEC_VENDOR_PANASONIC = 0x8045,
- CEC_VENDOR_PIONEER = 0xE036,
- CEC_VENDOR_ONKYO = 0x09B0,
+ CEC_VENDOR_SAMSUNG = 0x0000F0,
+ CEC_VENDOR_LG = 0x00E091,
+ CEC_VENDOR_PANASONIC = 0x008045,
+ CEC_VENDOR_PIONEER = 0x00E036,
+ CEC_VENDOR_ONKYO = 0x0009B0,
+ CEC_VENDOR_YAMAHA = 0x00A0DE,
+ CEC_VENDOR_PHILIPS = 0x00903E,
+ CEC_VENDOR_SONY = 0x080046,
CEC_VENDOR_UNKNOWN = 0
} cec_vendor_id;
cec_logical_address device;
} cec_menu_language;
+typedef struct cec_osd_name
+{
+ char name[14];
+ cec_logical_address device;
+} cec_osd_name;
+
typedef struct cec_log_message
{
char message[1024];
return *this;
}
- static void Format(cec_command &command, cec_logical_address initiator, cec_logical_address destination, cec_opcode opcode)
+ static void Format(cec_command &command, cec_logical_address initiator, cec_logical_address destination, cec_opcode opcode, int32_t timeout = CEC_DEFAULT_TRANSMIT_TIMEOUT)
{
command.Clear();
- command.initiator = initiator;
- command.destination = destination;
+ command.initiator = initiator;
+ command.destination = destination;
+ command.transmit_timeout = timeout;
if (opcode != CEC_OPCODE_NONE)
{
command.opcode = opcode;
eom = 0;
opcode_set = 0;
opcode = CEC_OPCODE_FEATURE_ABORT;
- transmit_timeout = 1000;
+ transmit_timeout = CEC_DEFAULT_TRANSMIT_TIMEOUT;
parameters.Clear();
};
#endif
#endif
} cec_logical_addresses;
+
+typedef int (CEC_CDECL* CBCecLogMessageType)(void *param, const CEC::cec_log_message &);
+typedef int (CEC_CDECL* CBCecKeyPressType)(void *param, const cec_keypress &key);
+typedef int (CEC_CDECL* CBCecCommandType)(void *param, const cec_command &command);
+
+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;
+} ICECCallbacks;
+
+#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
+
#ifdef __cplusplus
};
};