/// <summary> /// Opens the CI API /// </summary> public void OpenCI() { // HW Enable (always?) succeeds if (KNCBDA_HW_Enable(m_iDeviceIndex, m_tunerFilter) == 0) { Log.Log.Debug("KNC: card {0} HW Enable failed", m_iDeviceIndex); } m_callbacks = new KNCCiCallbacks(); m_callbacks.onCiMenu = OnCiMenu; m_callbacks.onCiMenuChoice = OnCiMenuChoice; m_callbacks.onCiState = OnCiState; m_callbacks.onCloseDisplay = OnCiCloseDisplay; m_callbacks.onOpenDisplay = OnCiOpenDisplay; m_callbacks.onRequest = OnCiRequest; m_callbacks.pParam = 0; unsafe { // prepare structure to be passed as pointer Marshal.StructureToPtr(m_callbacks, ptrCallback, false); if (KNCBDA_CI_Enable(m_iDeviceIndex, m_tunerFilter, ptrCallback) != 0) { ////CI_HW_Enable seems to always succeed ?! //if (KNCBDA_CI_HW_Enable(m_iDeviceIndex, true) == 0) // Log.Log.Debug("KNC: card {0} CI HW enable FAILED!", m_iDeviceIndex); // CI Enable succeeds always, only if CAM isReady there is a slot/CAM if (KNCBDA_CI_IsReady(m_iDeviceIndex) != 0) { Log.Log.Debug("KNC: card {0} CI slot enabled successfully", m_iDeviceIndex); // remember CAM is present m_bCAM_present = true; // init state to ready (callbacks are only done when changing, so expect it's ready first) m_ciState = KNCCiSlotStatus.Ready; StringBuilder nameBuffer = new StringBuilder(100); if (KNCBDA_CI_GetName(m_iDeviceIndex, nameBuffer, (uint)nameBuffer.MaxCapacity) != 0) { Log.Log.Debug("KNC: card {0} CAM Type: {1}", m_iDeviceIndex, nameBuffer); } else { Log.Log.Debug("KNC: CI_GetName failed."); } } else { Log.Log.Debug("KNC: card {0} detected without CAM", m_iDeviceIndex); } } } }
/// <summary> /// Callback from driver when CI status changes /// </summary> /// <param name="slot">Slot</param> /// <param name="State">Status</param> /// <param name="lpszMessage">Message</param> /// <param name="pParam">Context pointer</param> public void OnCiState(byte slot, KNCCiSlotStatus State, String lpszMessage, IntPtr pParam) { lock (this) { m_ciState = State; // remember in instance if (m_ciState == KNCCiSlotStatus.Ready) { m_waitTimeout = 0; // allow one new retry } Log.Log.Debug("KNC: card {0} CI State: {1} {2}", m_iDeviceIndex, lpszMessage, State); } }
/// <summary> /// Opens the CI API /// </summary> public void OpenCI() { // HW Enable (always?) succeeds if (KNCBDA_HW_Enable(m_iDeviceIndex, m_tunerFilter) == 0) { Log.Log.Debug("KNC: card {0} HW Enable failed", m_iDeviceIndex); } m_callbacks = new KNCCiCallbacks(); m_callbacks.onCiMenu = OnCiMenu; m_callbacks.onCiMenuChoice = OnCiMenuChoice; m_callbacks.onCiState = OnCiState; m_callbacks.onCloseDisplay = OnCiCloseDisplay; m_callbacks.onOpenDisplay = OnCiOpenDisplay; m_callbacks.onRequest = OnCiRequest; m_callbacks.pParam = 0; unsafe { // prepare structure to be passed as pointer Marshal.StructureToPtr(m_callbacks, ptrCallback, false); if (KNCBDA_CI_Enable(m_iDeviceIndex, m_tunerFilter, ptrCallback) != 0) { ////CI_HW_Enable seems to always succeed ?! //if (KNCBDA_CI_HW_Enable(m_iDeviceIndex, true) == 0) // Log.Log.Debug("KNC: card {0} CI HW enable FAILED!", m_iDeviceIndex); // CI Enable succeeds always, only if CAM isReady there is a slot/CAM if (KNCBDA_CI_IsReady(m_iDeviceIndex) != 0) { Log.Log.Debug("KNC: card {0} CI slot enabled successfully", m_iDeviceIndex); // remember CAM is present m_bCAM_present = true; // init state to ready (callbacks are only done when changing, so expect it's ready first) m_ciState = KNCCiSlotStatus.Ready; StringBuilder nameBuffer = new StringBuilder(100); if (KNCBDA_CI_GetName(m_iDeviceIndex, nameBuffer, (uint)nameBuffer.MaxCapacity) != 0) Log.Log.Debug("KNC: card {0} CAM Type: {1}", m_iDeviceIndex, nameBuffer); else Log.Log.Debug("KNC: CI_GetName failed."); } else { Log.Log.Debug("KNC: card {0} detected without CAM", m_iDeviceIndex); } } } }