X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FLibCecSharp%2FCecSharpTypes.h;h=5d617941b0f4316c422cd257c249d5aba62281b8;hb=3efda01ac7b070e09012a5725112eb44c17001b4;hp=55c756ef874e05cf88f3011b99f69c4e9d8cc3e8;hpb=4ef3b314fa1f81ba7190cc5c7c3ee273ef7eb1eb;p=deb_libcec.git diff --git a/src/LibCecSharp/CecSharpTypes.h b/src/LibCecSharp/CecSharpTypes.h index 55c756e..5d61794 100644 --- a/src/LibCecSharp/CecSharpTypes.h +++ b/src/LibCecSharp/CecSharpTypes.h @@ -236,6 +236,7 @@ namespace CecSharp Onkyo = 0x09B0, Yamaha = 0xA0DE, Philips = 0x903E, + Sony = 0x080046, Unknown = 0 }; @@ -325,7 +326,13 @@ namespace CecSharp public enum class CecClientVersion { VersionPre1_5 = 0, - Version1_5_0 = 1 + Version1_5_0 = 0x1500 + }; + + public enum class CecServerVersion + { + VersionPre1_5 = 0, + Version1_5_0 = 0x1500 }; public ref class CecAdapter @@ -360,15 +367,26 @@ namespace CecSharp CecLogicalAddresses(void) { Addresses = gcnew array(16); + Clear(); + } + + void Clear(void) + { for (unsigned int iPtr = 0; iPtr < 16; iPtr++) - Addresses[iPtr] = CecLogicalAddress::Unregistered; + Addresses[iPtr] = CecLogicalAddress::Unknown; } bool IsSet(CecLogicalAddress iAddress) { - return Addresses[(unsigned int)iAddress] != CecLogicalAddress::Unregistered; + return Addresses[(unsigned int)iAddress] != CecLogicalAddress::Unknown; } + void Set(CecLogicalAddress iAddress) + { + Addresses[(unsigned int)iAddress] = iAddress; + } + + property CecLogicalAddress Primary; property array ^ Addresses; }; @@ -499,16 +517,111 @@ namespace CecSharp property int64_t Time; }; + ref class CecCallbackMethods; //forward + public ref class LibCECConfiguration + { + public: + LibCECConfiguration(void) + { + DeviceName = ""; + DeviceTypes = gcnew CecDeviceTypeList(); + AutodetectAddress = true; + PhysicalAddress = CEC_DEFAULT_PHYSICAL_ADDRESS; + BaseDevice = (CecLogicalAddress)CEC_DEFAULT_BASE_DEVICE; + HDMIPort = CEC_DEFAULT_HDMI_PORT; + ClientVersion = CecClientVersion::VersionPre1_5; + ServerVersion = CecServerVersion::VersionPre1_5; + TvVendor = CecVendorId::Unknown; + + GetSettingsFromROM = false; + UseTVMenuLanguage = CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE == 1; + ActivateSource = CEC_DEFAULT_SETTING_ACTIVATE_SOURCE == 1; + + WakeDevices = gcnew CecLogicalAddresses(); + if (CEC_DEFAULT_SETTING_ACTIVATE_SOURCE == 1) + WakeDevices->Set(CecLogicalAddress::Tv); + + PowerOffDevices = gcnew CecLogicalAddresses(); + if (CEC_DEFAULT_SETTING_POWER_OFF_SHUTDOWN == 1) + PowerOffDevices->Set(CecLogicalAddress::Broadcast); + + PowerOffScreensaver = CEC_DEFAULT_SETTING_POWER_OFF_SCREENSAVER == 1; + PowerOffOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY == 1; + } + + void SetCallbacks(CecCallbackMethods ^callbacks) + { + Callbacks = callbacks; + } + + void Update(const CEC::libcec_configuration &config) + { + DeviceName = gcnew System::String(config.strDeviceName); + + for (unsigned int iPtr = 0; iPtr < 5; iPtr++) + DeviceTypes->Types[iPtr] = (CecDeviceType)config.deviceTypes.types[iPtr]; + + AutodetectAddress = config.bAutodetectAddress == 1; + PhysicalAddress = config.iPhysicalAddress; + BaseDevice = (CecLogicalAddress)config.baseDevice; + HDMIPort = config.iHDMIPort; + ClientVersion = (CecClientVersion)config.clientVersion; + ServerVersion = (CecServerVersion)config.serverVersion; + TvVendor = (CecVendorId)config.tvVendor; + + // player specific settings + GetSettingsFromROM = config.bGetSettingsFromROM == 1; + UseTVMenuLanguage = config.bUseTVMenuLanguage == 1; + ActivateSource = config.bActivateSource == 1; + + WakeDevices->Clear(); + for (uint8_t iPtr = 0; iPtr <= 16; iPtr++) + if (config.wakeDevices[iPtr]) + WakeDevices->Set((CecLogicalAddress)iPtr); + + PowerOffDevices->Clear(); + for (uint8_t iPtr = 0; iPtr <= 16; iPtr++) + if (config.powerOffDevices[iPtr]) + PowerOffDevices->Set((CecLogicalAddress)iPtr); + + PowerOffScreensaver = config.bPowerOffScreensaver == 1; + PowerOffOnStandby = config.bPowerOffOnStandby == 1; + } + + property System::String ^ DeviceName; + property CecDeviceTypeList ^ DeviceTypes; + property bool AutodetectAddress; + property uint16_t PhysicalAddress; + property CecLogicalAddress BaseDevice; + property uint8_t HDMIPort; + property CecClientVersion ClientVersion; + property CecServerVersion ServerVersion; + property CecVendorId TvVendor; + + // player specific settings + property bool GetSettingsFromROM; + property bool UseTVMenuLanguage; + property bool ActivateSource; + property CecLogicalAddresses ^WakeDevices; + property CecLogicalAddresses ^PowerOffDevices; + property bool PowerOffScreensaver; + property bool PowerOffOnStandby; + + property CecCallbackMethods ^ Callbacks; + }; + // the callback methods are called by unmanaged code, so we need some delegates for this #pragma unmanaged // unmanaged callback methods typedef int (__stdcall *LOGCB) (const CEC::cec_log_message &message); typedef int (__stdcall *KEYCB) (const CEC::cec_keypress &key); typedef int (__stdcall *COMMANDCB)(const CEC::cec_command &command); + typedef int (__stdcall *CONFIGCB) (const CEC::libcec_configuration &config); static LOGCB g_logCB; static KEYCB g_keyCB; static COMMANDCB g_commandCB; + static CONFIGCB g_configCB; static CEC::ICECCallbacks g_cecCallbacks; int CecLogMessageCB(void *cbParam, const CEC::cec_log_message &message) @@ -532,11 +645,19 @@ namespace CecSharp return 0; } + int CecConfigCB(void *cbParam, const CEC::libcec_configuration &config) + { + if (g_configCB) + return g_configCB(config); + return 0; + } + #pragma managed // delegates for the unmanaged callback methods public delegate int CecLogMessageManagedDelegate(const CEC::cec_log_message &); public delegate int CecKeyPressManagedDelegate(const CEC::cec_keypress &); public delegate int CecCommandManagedDelegate(const CEC::cec_command &); + public delegate int CecConfigManagedDelegate(const CEC::libcec_configuration &); // callback method interface public ref class CecCallbackMethods @@ -565,6 +686,12 @@ namespace CecSharp g_commandCB = static_cast(System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(m_commandDelegate).ToPointer()); g_cecCallbacks.CBCecCommand = CecCommandCB; + // create the delegate method for the configuration change callback + m_configDelegate = gcnew CecConfigManagedDelegate(this, &CecCallbackMethods::CecConfigManaged); + m_configGCHandle = System::Runtime::InteropServices::GCHandle::Alloc(m_configDelegate); + g_configCB = static_cast(System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(m_configDelegate).ToPointer()); + g_cecCallbacks.CBCecConfigurationChanged = CecConfigCB; + delete context; } @@ -580,8 +707,15 @@ namespace CecSharp } public: + virtual void DisableCallbacks(void) + { + if (m_bHasCallbacks) + delete m_callbacks; + m_bHasCallbacks = false; + } virtual bool EnableCallbacks(CecCallbackMethods ^ callbacks) { + DisableCallbacks(); if (!m_bHasCallbacks) { m_bHasCallbacks = true; @@ -607,6 +741,10 @@ namespace CecSharp return 0; } + virtual int ConfigurationChanged(LibCECConfiguration ^ config) + { + return 0; + } protected: // managed callback methods int CecLogMessageManaged(const CEC::cec_log_message &message) @@ -638,13 +776,28 @@ namespace CecSharp return iReturn; } + int CecConfigManaged(const CEC::libcec_configuration &config) + { + int iReturn(0); + if (m_bHasCallbacks) + { + LibCECConfiguration ^netConfig = gcnew LibCECConfiguration(); + netConfig->Update(config); + iReturn = m_callbacks->ConfigurationChanged(netConfig); + } + return iReturn; + } + void DestroyDelegates() { - m_bHasCallbacks = false; - delete m_callbacks; - m_logMessageGCHandle.Free(); - m_keypressGCHandle.Free(); - m_commandGCHandle.Free(); + if (m_bHasCallbacks) + { + m_bHasCallbacks = false; + delete m_callbacks; + m_logMessageGCHandle.Free(); + m_keypressGCHandle.Free(); + m_commandGCHandle.Free(); + } } CecLogMessageManagedDelegate ^ m_logMessageDelegate; @@ -659,46 +812,11 @@ namespace CecSharp static System::Runtime::InteropServices::GCHandle m_commandGCHandle; COMMANDCB m_commandCallback; + CecConfigManagedDelegate ^ m_configDelegate; + static System::Runtime::InteropServices::GCHandle m_configGCHandle; + CONFIGCB m_configCallback; + CecCallbackMethods ^ m_callbacks; bool m_bHasCallbacks; }; - - public ref class LibCECConfiguration - { - public: - LibCECConfiguration(CecCallbackMethods ^callbacks) - { - DeviceName = ""; - PhysicalAddress = CEC_DEFAULT_PHYSICAL_ADDRESS; - BaseDevice = (CecLogicalAddress)CEC_DEFAULT_BASE_DEVICE; - HDMIPort = CEC_DEFAULT_HDMI_PORT; - ClientVersion = CecClientVersion::VersionPre1_5; - - GetSettingsFromROM = false; - UseTVMenuLanguage = CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE ? true : false; - PowerOnStartup = CEC_DEFAULT_SETTING_POWER_ON_STARTUP ? true : false; - PowerOffShutdown = CEC_DEFAULT_SETTING_POWER_OFF_SHUTDOWN ? true : false; - PowerOffScreensaver = CEC_DEFAULT_SETTING_POWER_OFF_SCREENSAVER ? true : false; - PowerOffOnStandby = CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY ? true : false; - - Callbacks = callbacks; - } - - property System::String ^ DeviceName; - property CecDeviceTypeList ^ DeviceTypes; - property uint16_t PhysicalAddress; - property CecLogicalAddress BaseDevice; - property uint8_t HDMIPort; - property CecClientVersion ClientVersion; - - // player specific settings - property bool GetSettingsFromROM; - property bool UseTVMenuLanguage; - property bool PowerOnStartup; - property bool PowerOffShutdown; - property bool PowerOffScreensaver; - property bool PowerOffOnStandby; - - property CecCallbackMethods ^Callbacks; - }; }