X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2FLibCecSharp%2FLibCecSharp.cpp;h=c6f52a1a17b2bda673177728538602c81421b669;hb=5d5e105deb964d38568f046d1d1f0a4a656e1a99;hp=92a4eee84e18116a847b11bae513b238013941a1;hpb=4ef3b314fa1f81ba7190cc5c7c3ee273ef7eb1eb;p=deb_libcec.git diff --git a/src/LibCecSharp/LibCecSharp.cpp b/src/LibCecSharp/LibCecSharp.cpp index 92a4eee..c6f52a1 100644 --- a/src/LibCecSharp/LibCecSharp.cpp +++ b/src/LibCecSharp/LibCecSharp.cpp @@ -43,32 +43,68 @@ namespace CecSharp public ref class LibCecSharp : public CecCallbackMethods { public: + LibCecSharp(LibCECConfiguration ^config) + { + m_configuration = config; + CecCallbackMethods::EnableCallbacks(m_configuration->Callbacks); + if (!InitialiseLibCec()) + throw gcnew Exception("Could not initialise LibCecSharp"); + } + LibCecSharp(String ^ strDeviceName, CecDeviceTypeList ^ deviceTypes) + { + m_configuration = gcnew LibCECConfiguration(); + m_configuration->SetCallbacks(this); + m_configuration->DeviceName = strDeviceName; + m_configuration->DeviceTypes = deviceTypes; + if (!InitialiseLibCec()) + throw gcnew Exception("Could not initialise LibCecSharp"); + } + + ~LibCecSharp(void) + { + Close(); + m_libCec = NULL; + } + + private: + !LibCecSharp(void) + { + Close(); + m_libCec = NULL; + } + + bool InitialiseLibCec(void) { marshal_context ^ context = gcnew marshal_context(); - m_bHasCallbacks = false; - const char* strDeviceNameC = context->marshal_as(strDeviceName); + libcec_configuration config; + GetConfiguration(context, config); - cec_device_type_list types; - for (unsigned int iPtr = 0; iPtr < 5; iPtr++) - types.types[iPtr] = (cec_device_type)deviceTypes->Types[iPtr]; - m_libCec = (ICECAdapter *) CECInit(strDeviceNameC, types); + m_libCec = (ICECAdapter *) CECInitialise(&config); delete context; + return m_libCec != NULL; + } + + void GetConfiguration(marshal_context ^context, libcec_configuration &config) + { + config.Clear(); + + _snprintf_s(config.strDeviceName, 13, context->marshal_as(m_configuration->DeviceName)); + for (unsigned int iPtr = 0; iPtr < 5; iPtr++) + config.deviceTypes.types[iPtr] = (cec_device_type)m_configuration->DeviceTypes->Types[iPtr]; + + config.iPhysicalAddress = m_configuration->PhysicalAddress; + config.baseDevice = (cec_logical_address)m_configuration->BaseDevice; + config.iHDMIPort = m_configuration->HDMIPort; + config.clientVersion = (cec_client_version)m_configuration->ClientVersion; + config.bGetSettingsFromROM = m_configuration->GetSettingsFromROM; + config.bPowerOnStartup = m_configuration->PowerOnStartup; + config.bPowerOffShutdown = m_configuration->PowerOffShutdown; + config.bPowerOffScreensaver = m_configuration->PowerOffScreensaver; + config.bPowerOffOnStandby = m_configuration->PowerOffOnStandby; + config.callbacks = &g_cecCallbacks; } - - ~LibCecSharp(void) - { - Close(); - m_libCec = NULL; - } - - protected: - !LibCecSharp(void) - { - Close(); - m_libCec = NULL; - } public: array ^ FindAdapters(String ^ path) @@ -190,7 +226,7 @@ namespace CecSharp return m_libCec->SetLogicalAddress((cec_logical_address) logicalAddress); } - bool SetPhysicalAddress(int16_t physicalAddress) + bool SetPhysicalAddress(uint16_t physicalAddress) { return m_libCec->SetPhysicalAddress(physicalAddress); } @@ -352,6 +388,66 @@ namespace CecSharp return m_libCec->GetDevicePhysicalAddress((cec_logical_address)iAddress); } + bool SetStreamPath(CecLogicalAddress iAddress) + { + return m_libCec->SetStreamPath((cec_logical_address)iAddress); + } + + bool SetStreamPath(uint16_t iPhysicalAddress) + { + return m_libCec->SetStreamPath(iPhysicalAddress); + } + + CecLogicalAddresses ^GetLogicalAddresses(void) + { + CecLogicalAddresses ^addr = gcnew CecLogicalAddresses(); + cec_logical_addresses libAddr = m_libCec->GetLogicalAddresses(); + for (unsigned int iPtr = 0; iPtr < 16; iPtr++) + addr->Addresses[iPtr] = (CecLogicalAddress)libAddr.addresses[iPtr]; + addr->Primary = (CecLogicalAddress)libAddr.primary; + return addr; + } + + bool GetCurrentConfiguration(LibCECConfiguration ^configuration) + { + libcec_configuration config; + config.Clear(); + + if (m_libCec->GetCurrentConfiguration(&config)) + { + configuration->BaseDevice = (CecLogicalAddress)config.baseDevice; + configuration->DeviceName = gcnew String(config.strDeviceName); + configuration->HDMIPort = config.iHDMIPort; + configuration->PhysicalAddress = config.iPhysicalAddress; + configuration->PowerOffOnStandby = config.bPowerOffOnStandby == 1; + configuration->PowerOffScreensaver = config.bPowerOffScreensaver == 1; + configuration->PowerOffShutdown = config.bPowerOffShutdown == 1; + configuration->PowerOnStartup = config.bPowerOnStartup == 1; + configuration->UseTVMenuLanguage = config.bUseTVMenuLanguage == 1; + for (unsigned int iPtr = 0; iPtr < 5; iPtr++) + m_configuration->DeviceTypes->Types[iPtr] = (CecDeviceType)config.deviceTypes.types[iPtr]; + return true; + } + return false; + } + + bool CanPersistConfiguration(void) + { + return m_libCec->CanPersistConfiguration(); + } + + bool PersistConfiguration(LibCECConfiguration ^configuration) + { + marshal_context ^ context = gcnew marshal_context(); + libcec_configuration config; + GetConfiguration(context, config); + + bool bReturn = m_libCec->PersistConfiguration(&config); + + delete context; + return bReturn; + } + String ^ ToString(CecLogicalAddress iAddress) { const char *retVal = m_libCec->ToString((cec_logical_address)iAddress); @@ -414,5 +510,6 @@ namespace CecSharp private: ICECAdapter * m_libCec; + LibCECConfiguration ^m_configuration; }; }