#include "CECClient.h"
#include "CECProcessor.h"
#include "LibCEC.h"
+#include "CECTypeUtils.h"
#include "devices/CECPlaybackDevice.h"
#include "devices/CECAudioSystem.h"
#include "devices/CECTV.h"
using namespace PLATFORM;
#define LIB_CEC m_processor->GetLib()
-#define ToString(x) LIB_CEC->ToString(x)
+#define ToString(x) CCECTypeUtils::ToString(x)
CCECClient::CCECClient(CCECProcessor *processor, const libcec_configuration &configuration) :
m_processor(processor),
}
// don't continue if the connection isn't opened
- if (!m_processor->IsRunning() && !bForce)
+ if (!m_processor->CECInitialised() && !bForce)
return true;
// get the PA of the base device
void CCECClient::SetPhysicalAddress(const libcec_configuration &configuration)
{
- // try to autodetect the address
bool bPASet(false);
- if (m_processor->IsRunning() && configuration.bAutodetectAddress == 1)
- bPASet = AutodetectPhysicalAddress();
- // try to use physical address setting
+ // override the physical address from configuration.iPhysicalAddress if it's set
if (!bPASet && CLibCEC::IsValidPhysicalAddress(configuration.iPhysicalAddress))
bPASet = SetPhysicalAddress(configuration.iPhysicalAddress);
+ // try to autodetect the address
+ if (!bPASet && m_processor->CECInitialised())
+ {
+ bPASet = AutodetectPhysicalAddress();
+ m_configuration.bAutodetectAddress = bPASet ? 1 : 0;
+ }
+
// use the base device + hdmi port settings
if (!bPASet)
bPASet = SetHDMIPort(configuration.baseDevice, configuration.iHDMIPort);
}
// persist the new configuration
- if (m_processor->IsRunning())
- m_processor->PersistConfiguration(m_configuration);
+ m_processor->PersistConfiguration(m_configuration);
// set the physical address for each device
SetDevicePhysicalAddress(iPhysicalAddress);
CCECBusDevice *device = *devices.begin();
// and activate it
- if (!m_processor->IsRunning())
+ if (!m_processor->CECInitialised())
device->MarkAsActiveSource();
else if (device->HasValidPhysicalAddress())
return device->ActivateSource();
bool CCECClient::SendKeypress(const cec_logical_address iDestination, const cec_user_control_code key, bool bWait /* = true */)
{
- CCECBusDevice *device = GetPrimaryDevice();
CCECBusDevice *dest = m_processor->GetDevice(iDestination);
- return device && dest ?
- device->TransmitKeypress(GetPrimaryLogicalAdddress(), key, bWait) :
+ return dest ?
+ dest->TransmitKeypress(GetPrimaryLogicalAdddress(), key, bWait) :
false;
}
bool CCECClient::SendKeyRelease(const cec_logical_address iDestination, bool bWait /* = true */)
{
- CCECBusDevice *device = GetPrimaryDevice();
CCECBusDevice *dest = m_processor->GetDevice(iDestination);
- return device && dest ?
- device->TransmitKeyRelease(GetPrimaryLogicalAdddress(), bWait) :
+ return dest ?
+ dest->TransmitKeyRelease(GetPrimaryLogicalAdddress(), bWait) :
false;
}
memcpy(configuration.strDeviceLanguage, m_configuration.strDeviceLanguage, 3);
configuration.iFirmwareBuildDate = m_configuration.iFirmwareBuildDate;
}
+
+ // client version 1.6.3
+ if (configuration.clientVersion >= CEC_CLIENT_VERSION_1_6_3)
+ {
+ configuration.bMonitorOnly = m_configuration.bMonitorOnly;
+ }
+
return true;
}
bool CCECClient::SetConfiguration(const libcec_configuration &configuration)
{
- bool bIsRunning(m_processor && m_processor->IsRunning());
+ bool bIsRunning(m_processor && m_processor->CECInitialised());
CCECBusDevice *primary = bIsRunning ? GetPrimaryDevice() : NULL;
uint16_t iPA = primary ? primary->GetCurrentPhysicalAddress() : CEC_INVALID_PHYSICAL_ADDRESS;
memcpy(m_configuration.strDeviceLanguage, configuration.strDeviceLanguage, 3);
}
+ // client version 1.6.3
+ if (configuration.clientVersion >= CEC_CLIENT_VERSION_1_6_3)
+ {
+ m_configuration.bMonitorOnly = configuration.bMonitorOnly;
+ }
+
// ensure that there is at least 1 device type set
if (m_configuration.deviceTypes.IsEmpty())
m_configuration.deviceTypes.Add(CEC_DEVICE_TYPE_RECORDING_DEVICE);
SetPhysicalAddress(configuration);
}
- if (bIsRunning)
- m_processor->PersistConfiguration(m_configuration);
+ m_processor->PersistConfiguration(m_configuration);
if (!primary)
primary = GetPrimaryDevice();
if (primary && !primary->GetCurrentOSDName().Equals(strDeviceName))
{
primary->SetOSDName(strDeviceName);
- if (m_processor && m_processor->IsRunning())
+ if (m_processor && m_processor->CECInitialised())
primary->TransmitOSDName(CECDEVICE_TV);
}
}
{
CLockObject lock(m_mutex);
- bNeedReinit = m_processor && m_processor->IsRunning() &&
+ bNeedReinit = m_processor && m_processor->CECInitialised() &&
(m_configuration.deviceTypes != deviceTypes);
m_configuration.deviceTypes = deviceTypes;
}
// reactivate the previous active source
if (reactivateSource != CECDEVICE_UNKNOWN &&
- m_processor->IsRunning() &&
+ m_processor->CECInitialised() &&
IsInitialised())
{
CCECBusDevice *device = m_processor->GetDevice(reactivateSource);
bool CCECClient::SwitchMonitoring(bool bEnable)
{
- return m_processor ? m_processor->SwitchMonitoring(bEnable) : false;
+ LIB_CEC->AddLog(CEC_LOG_NOTICE, "== %s monitoring mode ==", bEnable ? "enabling" : "disabling");
+
+ if (m_processor)
+ {
+ if (bEnable)
+ return m_processor->UnregisterClient(this);
+ else
+ {
+ m_configuration.bMonitorOnly = false;
+ return m_processor->RegisterClient(this);
+ }
+ }
+
+ return false;
}
bool CCECClient::PollDevice(const cec_logical_address iAddress)