// Get IDeckLink Interface private bool GetIDeckLinkInterface() { try { deckLinkOutput = (IDeckLinkOutput)DeckLink; deckLinkInput = (IDeckLinkInput)DeckLink; deckLinkConfig = (IDeckLinkConfiguration)DeckLink; IDeckLinkDisplayModeIterator displayIterator; deckLinkInput.GetDisplayModeIterator(out displayIterator); var supportedModes = new List <IDeckLinkDisplayMode>(); deckLinkKeyer = (IDeckLinkKeyer)DeckLink; } catch { return(false); } return(true); }
private Decklink(IDeckLink cDevice) { (new Logger()).WriteDebug3("in"); try { nAudioQueueLength = nAudioQueueLengthPrevious = 0; nBTLAudioQueueLengthPrevious = nBTLVideoQueueLengthPrevious = nVideoQueueLengthPrevious = 0; _iDLDevice = cDevice; if(Preferences.bDeviceInput) _iDLInput = (IDeckLinkInput)_iDLDevice; else _iDLOutput = (IDeckLinkOutput)_iDLDevice; IDeckLinkDisplayModeIterator cDisplayModeIterator; IDeckLinkDisplayMode cNextDLDisplayMode; string sDisplayModeName = ""; string sMessage = "decklink supported modes:<br>"; if (Preferences.bDeviceInput) { _iDLInputDisplayMode = null; _iDLInput.GetDisplayModeIterator(out cDisplayModeIterator); while (true) { cDisplayModeIterator.Next(out cNextDLDisplayMode); if (cNextDLDisplayMode == null) break; cNextDLDisplayMode.GetName(out sDisplayModeName); if (null == _iDLInputDisplayMode && sDisplayModeName.ToLower().Contains(Preferences.sVideoFormat)) { sMessage += "selected:"; _iDLInputDisplayMode = cNextDLDisplayMode; } else sMessage += "\t"; sMessage += sDisplayModeName + "<br>"; } (new Logger()).WriteNotice(sMessage); if (null == _iDLInputDisplayMode) throw new Exception("can't find " + Preferences.sVideoFormat + " mode within specified device for input"); } else { _nFramesAudioDropped = 0; _iDLOutputDisplayMode = null; _iDLOutput.GetDisplayModeIterator(out cDisplayModeIterator); while (true) { cDisplayModeIterator.Next(out cNextDLDisplayMode); if (cNextDLDisplayMode == null) break; cNextDLDisplayMode.GetName(out sDisplayModeName); if (null == _iDLOutputDisplayMode && sDisplayModeName.ToLower().Contains(Preferences.sVideoFormat)) { sMessage += "selected:"; _iDLOutputDisplayMode = cNextDLDisplayMode; } else sMessage += "\t"; sMessage += sDisplayModeName + "<br>"; } (new Logger()).WriteNotice(sMessage); if (null == _iDLOutputDisplayMode) throw new Exception("can't find " + Preferences.sVideoFormat + " mode within specified device for output"); stArea = new Area(0, 0, (ushort)_iDLOutputDisplayMode.GetWidth(), (ushort)_iDLOutputDisplayMode.GetHeight()); long nFrameDuration, nFrameTimescale; _iDLOutputDisplayMode.GetFrameRate(out nFrameDuration, out nFrameTimescale); _nFPS = (ushort)((nFrameTimescale + (nFrameDuration - 1)) / nFrameDuration); //до ближайшего целого - взято из примера деклинка _bDoWritingFrames = false; _aqWritingFrames = new Queue<byte[]>(); _cThreadWritingFramesWorker = new System.Threading.Thread(WritingFramesWorker); _cThreadWritingFramesWorker.IsBackground = true; _cThreadWritingFramesWorker.Priority = System.Threading.ThreadPriority.Normal; _cThreadWritingFramesWorker.Start(); if (Preferences.bAudio) { switch (Preferences.nAudioBitDepth) { case 32: _eAudioSampleDepth = _BMDAudioSampleType.bmdAudioSampleType32bitInteger; break; case 16: default: _eAudioSampleDepth = _BMDAudioSampleType.bmdAudioSampleType16bitInteger; break; } switch (Preferences.nAudioSamplesRate) { case 48000: _eAudioSampleRate = _BMDAudioSampleRate.bmdAudioSampleRate48kHz; break; default: throw new Exception("unsupported audio sample rate [" + Preferences.nAudioSamplesRate + "]"); } //_pAudioSamplesBuffer = Marshal.AllocCoTaskMem((int)_nAudioFrameSize_InBytes); _cAudioBuffer = new AudioBuffer(); _nAudioBufferCapacity_InSamples = Preferences.nAudioSamplesPerFrame * Preferences.nQueueDeviceLength; //for (int nIndx = 0; _nAudioFrameSize_InBytes > nIndx; nIndx++) // Marshal.WriteByte(_pAudioSamplesBuffer, nIndx, 0); _nTimescale = (ushort)_eAudioSampleRate; _nFrameDuration = (ushort)(_nTimescale / _nFPS); } if (null != Preferences.cDownStreamKeyer) _iDeckLinkKeyer = (IDeckLinkKeyer)_iDLDevice; } } catch (Exception ex) { (new Logger()).WriteError(ex); throw; } (new Logger()).WriteDebug4("return"); }