/*
* This file is part of the libCEC(R) library.
*
- * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved.
+ * libCEC(R) is Copyright (C) 2011-2013 Pulse-Eight Limited. All rights reserved.
* libCEC(R) is an original work, containing original code.
*
* libCEC(R) is a trademark of Pulse-Eight Limited.
#define LIB_CEC m_processor->GetLib()
#define ToString(x) CCECTypeUtils::ToString(x)
-#define COMBO_KEY CEC_USER_CONTROL_CODE_STOP
-#define COMBO_TIMEOUT_MS 1000
-
CCECClient::CCECClient(CCECProcessor *processor, const libcec_configuration &configuration) :
m_processor(processor),
m_bInitialised(false),
(uint8_t)CEC_AUDIO_VOLUME_STATUS_UNKNOWN;
}
+uint8_t CCECClient::AudioToggleMute(void)
+{
+ CCECBusDevice *device = GetPrimaryDevice();
+ CCECAudioSystem *audio = m_processor->GetAudioSystem();
+
+ return device && audio && audio->IsPresent() ?
+ audio->MuteAudio(device->GetLogicalAddress()) :
+ (uint8_t)CEC_AUDIO_VOLUME_STATUS_UNKNOWN;
+}
+
+uint8_t CCECClient::AudioMute(void)
+{
+ CCECBusDevice *device = GetPrimaryDevice();
+ CCECAudioSystem *audio = m_processor->GetAudioSystem();
+ uint8_t iStatus = device && audio && audio->IsPresent() ? audio->GetAudioStatus(device->GetLogicalAddress()) : (uint8_t)CEC_AUDIO_VOLUME_STATUS_UNKNOWN;
+ if ((iStatus & CEC_AUDIO_MUTE_STATUS_MASK) != CEC_AUDIO_MUTE_STATUS_MASK)
+ iStatus = audio->MuteAudio(device->GetLogicalAddress());
+
+ return iStatus;
+}
+
+uint8_t CCECClient::AudioUnmute(void)
+{
+ CCECBusDevice *device = GetPrimaryDevice();
+ CCECAudioSystem *audio = m_processor->GetAudioSystem();
+ uint8_t iStatus = device && audio && audio->IsPresent() ? audio->GetAudioStatus(device->GetLogicalAddress()) : (uint8_t)CEC_AUDIO_VOLUME_STATUS_UNKNOWN;
+ if ((iStatus & CEC_AUDIO_MUTE_STATUS_MASK) == CEC_AUDIO_MUTE_STATUS_MASK)
+ iStatus = audio->MuteAudio(device->GetLogicalAddress());
+
+ return iStatus;
+}
+
+uint8_t CCECClient::AudioStatus(void)
+{
+ CCECBusDevice *device = GetPrimaryDevice();
+ CCECAudioSystem *audio = m_processor->GetAudioSystem();
+ return device && audio && audio->IsPresent() ? audio->GetAudioStatus(device->GetLogicalAddress()) : (uint8_t)CEC_AUDIO_VOLUME_STATUS_UNKNOWN;
+}
+
bool CCECClient::SendKeypress(const cec_logical_address iDestination, const cec_user_control_code key, bool bWait /* = true */)
{
CCECBusDevice *dest = m_processor->GetDevice(iDestination);
configuration.wakeDevices = m_configuration.wakeDevices;
configuration.powerOffDevices = m_configuration.powerOffDevices;
configuration.bPowerOffScreensaver = m_configuration.bPowerOffScreensaver;
+ configuration.bPowerOnScreensaver = m_configuration.bPowerOnScreensaver;
configuration.bPowerOffOnStandby = m_configuration.bPowerOffOnStandby;
configuration.bSendInactiveSource = m_configuration.bSendInactiveSource;
configuration.logicalAddresses = m_configuration.logicalAddresses;
bool CCECClient::SetConfiguration(const libcec_configuration &configuration)
{
+ libcec_configuration defaultSettings;
bool bIsRunning(m_processor && m_processor->CECInitialised());
CCECBusDevice *primary = bIsRunning ? GetPrimaryDevice() : NULL;
uint16_t iPA = primary ? primary->GetCurrentPhysicalAddress() : CEC_INVALID_PHYSICAL_ADDRESS;
m_configuration.bMonitorOnly = configuration.bMonitorOnly;
m_configuration.cecVersion = configuration.cecVersion;
m_configuration.adapterType = configuration.adapterType;
- m_configuration.deviceTypes.Add(CEC_DEVICE_TYPE_RECORDING_DEVICE);
+ m_configuration.iDoubleTapTimeoutMs = configuration.iDoubleTapTimeoutMs;
+ m_configuration.deviceTypes.Add(configuration.deviceTypes[0]);
+
+ if (m_configuration.clientVersion >= CEC_CLIENT_VERSION_2_0_5)
+ {
+ m_configuration.comboKey = configuration.comboKey;
+ m_configuration.iComboKeyTimeoutMs = configuration.iComboKeyTimeoutMs;
+ }
+ else
+ {
+ m_configuration.comboKey = defaultSettings.comboKey;
+ m_configuration.iComboKeyTimeoutMs = defaultSettings.iComboKeyTimeoutMs;
+ }
+
+ if (m_configuration.clientVersion >= CEC_CLIENT_VERSION_2_1_0)
+ m_configuration.bPowerOnScreensaver = configuration.bPowerOnScreensaver;
+ else
+ m_configuration.bPowerOnScreensaver = defaultSettings.bPowerOnScreensaver;
}
bool bNeedReinit(false);
{
key.duration = (unsigned int) (GetTimeMs() - m_buttontime);
- if (key.duration > COMBO_TIMEOUT_MS || m_iCurrentButton != COMBO_KEY || bSendComboKey)
+ if (key.duration > m_configuration.iComboKeyTimeoutMs ||
+ m_configuration.iComboKeyTimeoutMs == 0 ||
+ m_iCurrentButton != m_configuration.comboKey ||
+ bSendComboKey)
{
key.keycode = m_iCurrentButton;
void CCECClient::AddKey(const cec_keypress &key)
{
- // send back the previous key if there is one
- AddKey();
-
if (key.keycode > CEC_USER_CONTROL_CODE_MAX &&
key.keycode < CEC_USER_CONTROL_CODE_SELECT)
+ {
+ // send back the previous key if there is one
+ AddKey();
return;
+ }
cec_keypress transmitKey(key);
+ cec_user_control_code comboKey(m_configuration.clientVersion >= CEC_CLIENT_VERSION_2_0_5 ?
+ m_configuration.comboKey : CEC_USER_CONTROL_CODE_STOP);
{
CLockObject lock(m_mutex);
- if (m_iCurrentButton == COMBO_KEY && key.duration == 0)
+ if (m_configuration.iComboKeyTimeoutMs > 0 && m_iCurrentButton == comboKey && key.duration == 0)
{
// stop + ok -> exit
if (key.keycode == CEC_USER_CONTROL_CODE_SELECT)
AddKey(true);
}
- if (key.duration == 0)
+ if (m_iCurrentButton == key.keycode)
{
- m_iCurrentButton = transmitKey.keycode;
- m_buttontime = m_iCurrentButton == CEC_USER_CONTROL_CODE_UNKNOWN || key.duration > 0 ? 0 : GetTimeMs();
+ m_buttontime = GetTimeMs();
+ }
+ else
+ {
+ AddKey();
+ if (key.duration == 0)
+ {
+ m_iCurrentButton = transmitKey.keycode;
+ m_buttontime = m_iCurrentButton == CEC_USER_CONTROL_CODE_UNKNOWN || key.duration > 0 ? 0 : GetTimeMs();
+ }
}
}
- if (key.keycode != COMBO_KEY || key.duration > 0)
+ if (key.keycode != comboKey || key.duration > 0)
{
LIB_CEC->AddLog(CEC_LOG_DEBUG, "key pressed: %s (%1x)", ToString(transmitKey.keycode), transmitKey.keycode);
CallbackAddKey(transmitKey);
{
CLockObject lock(m_mutex);
uint64_t iNow = GetTimeMs();
+ cec_user_control_code comboKey(m_configuration.clientVersion >= CEC_CLIENT_VERSION_2_0_5 ?
+ m_configuration.comboKey : CEC_USER_CONTROL_CODE_STOP);
+ uint32_t iTimeoutMs(m_configuration.clientVersion >= CEC_CLIENT_VERSION_2_0_5 ?
+ m_configuration.iComboKeyTimeoutMs : CEC_DEFAULT_COMBO_TIMEOUT_MS);
if (m_iCurrentButton != CEC_USER_CONTROL_CODE_UNKNOWN &&
- ((m_iCurrentButton == COMBO_KEY && iNow - m_buttontime > COMBO_TIMEOUT_MS) ||
- (m_iCurrentButton != COMBO_KEY && iNow - m_buttontime > CEC_BUTTON_TIMEOUT)))
+ ((m_iCurrentButton == comboKey && iTimeoutMs > 0 && iNow - m_buttontime > iTimeoutMs) ||
+ (m_iCurrentButton != comboKey && iNow - m_buttontime > CEC_BUTTON_TIMEOUT)))
{
key.duration = (unsigned int) (iNow - m_buttontime);
key.keycode = m_iCurrentButton;