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 int (CEC_CDECL* CBCecMenuStatusChangedType)(void *param, const cec_menu_state newVal);
typedef struct ICECCallbacks
{
* @return 1 when ok, 0 otherwise
*/
CBCecAlertType CBCecAlert;
+
+ /*!
+ * @brief Transfer a menu status change to the client.
+ * Transfer a menu status 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',
+ * so keypresses are always routed.
+ * @param newVal The new value.
+ * @return 1 when this change should be pr
+ */
+ CBCecMenuStatusChangedType CBMenuStatusChanged;
+
+#ifdef __cplusplus
+ ICECCallbacks(void) { Clear(); }
+ ~ICECCallbacks(void) { Clear(); };
+
+ void Clear(void)
+ {
+ CBCecLogMessage = NULL;
+ CBCecKeyPress = NULL;
+ CBCecCommand = NULL;
+ CBCecConfigurationChanged = NULL;
+ CBCecAlert = NULL;
+ CBMenuStatusChanged = NULL;
+ }
+#endif
} ICECCallbacks;
typedef enum cec_client_version
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
+ libcec_configuration(void) { Clear(); }
+ ~libcec_configuration(void) { Clear(); }
+
/*!
* @brief Reset this configution struct to the default values.
*/
void EnableCallbacks(ICECAdapter *adapter)
{
- g_callbacks.CBCecLogMessage = &CecLogMessage;
- g_callbacks.CBCecKeyPress = &CecKeyPress;
- g_callbacks.CBCecCommand = &CecCommand;
- g_callbacks.CBCecConfigurationChanged = NULL;
- g_callbacks.CBCecAlert = NULL;
+ g_callbacks.CBCecLogMessage = &CecLogMessage;
+ g_callbacks.CBCecKeyPress = &CecKeyPress;
+ g_callbacks.CBCecCommand = &CecCommand;
adapter->EnableCallbacks(NULL, &g_callbacks);
}
}
}
+int CLibCEC::MenuStateChanged(const cec_menu_state newState)
+{
+ int iReturn(0);
+
+ CLibCEC *instance = CLibCEC::GetInstance();
+ if (!instance)
+ return iReturn;
+ CLockObject lock(instance->m_mutex);
+
+ AddLog(CEC_LOG_NOTICE, ">> %s: %s", instance->m_cec->ToString(CEC_OPCODE_MENU_REQUEST), instance->m_cec->ToString(newState));
+
+ libcec_configuration config;
+ instance->GetCurrentConfiguration(&config);
+
+ if (instance->m_callbacks &&
+ config.clientVersion >= CEC_CLIENT_VERSION_1_6_2 &&
+ instance->m_callbacks->CBMenuStatusChanged)
+ iReturn = instance->m_callbacks->CBMenuStatusChanged(instance->m_cbParam, newState);
+
+ return iReturn;
+}
+
bool CLibCEC::SetStreamPath(cec_logical_address iAddress)
{
uint16_t iPhysicalAddress = GetDevicePhysicalAddress(iAddress);
static void ConfigurationChanged(const libcec_configuration &config);
static void SetCurrentButton(cec_user_control_code iButtonCode);
virtual void CheckKeypressTimeout(void);
+ static int MenuStateChanged(const cec_menu_state newState);
static CLibCEC *GetInstance(void);
static void SetInstance(CLibCEC *instance);
{
if (m_processor->IsRunning() && m_busDevice->MyLogicalAddressContains(command.destination))
{
- if (command.parameters[0] == CEC_MENU_REQUEST_TYPE_QUERY)
+ CCECBusDevice *device = GetDevice(command.destination);
+ if (device)
{
- CCECBusDevice *device = GetDevice(command.destination);
- if (device)
- return device->TransmitMenuState(command.initiator);
+ if (command.parameters[0] == CEC_MENU_REQUEST_TYPE_ACTIVATE)
+ {
+ if (CLibCEC::MenuStateChanged(CEC_MENU_STATE_ACTIVATED) == 1)
+ device->SetMenuState(CEC_MENU_STATE_ACTIVATED);
+ }
+ else if (command.parameters[0] == CEC_MENU_REQUEST_TYPE_DEACTIVATE)
+ {
+ if (CLibCEC::MenuStateChanged(CEC_MENU_STATE_DEACTIVATED) == 1)
+ device->SetMenuState(CEC_MENU_STATE_DEACTIVATED);
+ }
+ return device->TransmitMenuState(command.initiator);
}
}
void EnableCallbacks(ICECAdapter *adapter)
{
- g_callbacks.CBCecLogMessage = &CecLogMessage;
- g_callbacks.CBCecKeyPress = &CecKeyPress;
- g_callbacks.CBCecCommand = &CecCommand;
- g_callbacks.CBCecConfigurationChanged = NULL;
- g_callbacks.CBCecAlert = NULL;
+ g_callbacks.CBCecLogMessage = &CecLogMessage;
+ g_callbacks.CBCecKeyPress = &CecKeyPress;
+ g_callbacks.CBCecCommand = &CecCommand;
adapter->EnableCallbacks(NULL, &g_callbacks);
}