X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2FLibCecSharp%2FLibCecSharp.cpp;h=76dd00624e7948d3fcbf9eedfcf7d73f156f1b86;hb=00a02d1d839c2155ee8abc3a37d10ab12b9881db;hp=1c073d9baedaae0e15989df8daf2821f54447c63;hpb=32403cc3b1abb8b186ca4bbe14cb7431a492f768;p=deb_libcec.git diff --git a/src/LibCecSharp/LibCecSharp.cpp b/src/LibCecSharp/LibCecSharp.cpp index 1c073d9..76dd006 100644 --- a/src/LibCecSharp/LibCecSharp.cpp +++ b/src/LibCecSharp/LibCecSharp.cpp @@ -45,13 +45,15 @@ namespace CecSharp public: LibCecSharp(LibCECConfiguration ^config) { - CecCallbackMethods::EnableCallbacks(config->Callbacks); + m_callbacks = config->Callbacks; + CecCallbackMethods::EnableCallbacks(m_callbacks); if (!InitialiseLibCec(config)) throw gcnew Exception("Could not initialise LibCecSharp"); } LibCecSharp(String ^ strDeviceName, CecDeviceTypeList ^ deviceTypes) { + m_callbacks = gcnew CecCallbackMethods(); LibCECConfiguration ^config = gcnew LibCECConfiguration(); config->SetCallbacks(this); config->DeviceName = strDeviceName; @@ -93,15 +95,29 @@ namespace CecSharp for (unsigned int iPtr = 0; iPtr < 5; iPtr++) config.deviceTypes.types[iPtr] = (cec_device_type)netConfig->DeviceTypes->Types[iPtr]; + config.bAutodetectAddress = netConfig->AutodetectAddress ? 1 : 0; config.iPhysicalAddress = netConfig->PhysicalAddress; config.baseDevice = (cec_logical_address)netConfig->BaseDevice; config.iHDMIPort = netConfig->HDMIPort; config.clientVersion = (cec_client_version)netConfig->ClientVersion; - config.bGetSettingsFromROM = netConfig->GetSettingsFromROM; - config.bPowerOnStartup = netConfig->PowerOnStartup; - config.bPowerOffShutdown = netConfig->PowerOffShutdown; - config.bPowerOffScreensaver = netConfig->PowerOffScreensaver; - config.bPowerOffOnStandby = netConfig->PowerOffOnStandby; + config.bGetSettingsFromROM = netConfig->GetSettingsFromROM ? 1 : 0; + config.bActivateSource = netConfig->ActivateSource ? 1 : 0; + config.tvVendor = (cec_vendor_id)netConfig->TvVendor; + config.wakeDevices.Clear(); + for (int iPtr = 0; iPtr < 16; iPtr++) + { + if (netConfig->WakeDevices->IsSet((CecLogicalAddress)iPtr)) + config.wakeDevices.Set((cec_logical_address)iPtr); + } + config.powerOffDevices.Clear(); + for (int iPtr = 0; iPtr < 16; iPtr++) + { + if (netConfig->PowerOffDevices->IsSet((CecLogicalAddress)iPtr)) + config.powerOffDevices.Set((cec_logical_address)iPtr); + } + config.bPowerOffScreensaver = netConfig->PowerOffScreensaver ? 1 : 0; + config.bPowerOffOnStandby = netConfig->PowerOffOnStandby ? 1 : 0; + config.bSendInactiveSource = netConfig->SendInactiveSource ? 1 : 0; config.callbacks = &g_cecCallbacks; } @@ -126,6 +142,8 @@ namespace CecSharp bool Open(String ^ strPort, int iTimeoutMs) { + CecCallbackMethods::EnableCallbacks(m_callbacks); + EnableCallbacks(m_callbacks); marshal_context ^ context = gcnew marshal_context(); const char* strPortC = context->marshal_as(strPort); bool bReturn = m_libCec->Open(strPortC, iTimeoutMs); @@ -135,11 +153,18 @@ namespace CecSharp void Close(void) { - // delete the callbacks, since these might already have been destroyed in .NET - m_libCec->EnableCallbacks(NULL, NULL); + DisableCallbacks(); m_libCec->Close(); } + virtual void DisableCallbacks(void) override + { + // delete the callbacks, since these might already have been destroyed in .NET + CecCallbackMethods::DisableCallbacks(); + if (m_libCec) + m_libCec->EnableCallbacks(NULL, NULL); + } + virtual bool EnableCallbacks(CecCallbackMethods ^ callbacks) override { if (m_libCec && CecCallbackMethods::EnableCallbacks(callbacks)) @@ -314,6 +339,11 @@ namespace CecSharp return (CecPowerStatus) m_libCec->GetDevicePowerStatus((cec_logical_address) logicalAddress); } + void RescanActiveDevices(void) + { + m_libCec->RescanActiveDevices(); + } + CecLogicalAddresses ^ GetActiveDevices(void) { CecLogicalAddresses ^ retVal = gcnew CecLogicalAddresses(); @@ -416,17 +446,7 @@ namespace CecSharp 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++) - configuration->DeviceTypes->Types[iPtr] = (CecDeviceType)config.deviceTypes.types[iPtr]; + configuration->Update(config); return true; } return false; @@ -521,7 +541,20 @@ namespace CecSharp return gcnew String(retVal); } + String ^ ToString(CecClientVersion version) + { + const char *retVal = m_libCec->ToString((cec_client_version)version); + return gcnew String(retVal); + } + + String ^ ToString(CecServerVersion version) + { + const char *retVal = m_libCec->ToString((cec_server_version)version); + return gcnew String(retVal); + } + private: ICECAdapter * m_libCec; + CecCallbackMethods ^ m_callbacks; }; }