AJA NTV2 SDK  18.0.0.2122
NTV2 SDK 18.0.0.2122
ntv2windriverinterface.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
10 #include "ntv2publicinterface.h"
11 #include "ntv2nubtypes.h"
12 #include "ntv2debug.h"
13 #include "winioctl.h"
14 #include "ajabase/system/debug.h"
15 #include <sstream>
16 
17 using namespace std;
18 
19 #ifdef _AJA_COMPILE_WIN2K_SOFT_LINK
20 typedef WINSETUPAPI
21 HDEVINFO
22 (WINAPI *
23 pfcnSetupDiGetClassDevsA)(
24  IN CONST GUID *ClassGuid, OPTIONAL
25  IN PCSTR Enumerator, OPTIONAL
26  IN HWND hwndParent, OPTIONAL
27  IN DWORD Flags
28  );
29 
30 typedef WINSETUPAPI
31 HDEVINFO
32 (WINAPI *
33 pfcnSetupDiGetClassDevsW)(
34  IN CONST GUID *ClassGuid, OPTIONAL
35  IN PCWSTR Enumerator, OPTIONAL
36  IN HWND hwndParent, OPTIONAL
37  IN DWORD Flags
38  );
39 #ifdef UNICODE
40 #define pfcnSetupDiGetClassDevs pfcnSetupDiGetClassDevsW
41 #else
42 #define pfcnSetupDiGetClassDevs pfcnSetupDiGetClassDevsA
43 #endif
44 
45 typedef WINSETUPAPI
46 BOOL
47 (WINAPI *
48 pfcnSetupDiEnumDeviceInterfaces)(
49  IN HDEVINFO DeviceInfoSet,
50  IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL
51  IN CONST GUID *InterfaceClassGuid,
52  IN DWORD MemberIndex,
53  OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData
54  );
55 
56 
57 typedef WINSETUPAPI
58 BOOL
59 (WINAPI *
60 pfcnSetupDiGetDeviceInterfaceDetailA)(
61  IN HDEVINFO DeviceInfoSet,
62  IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
63  OUT PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData, OPTIONAL
64  IN DWORD DeviceInterfaceDetailDataSize,
65  OUT PDWORD RequiredSize, OPTIONAL
66  OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL
67  );
68 
69 typedef WINSETUPAPI
70 BOOL
71 (WINAPI *
72 pfcnSetupDiGetDeviceInterfaceDetailW)(
73  IN HDEVINFO DeviceInfoSet,
74  IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
75  OUT PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData, OPTIONAL
76  IN DWORD DeviceInterfaceDetailDataSize,
77  OUT PDWORD RequiredSize, OPTIONAL
78  OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL
79  );
80 #ifdef UNICODE
81 #define pfcnSetupDiGetDeviceInterfaceDetail pfcnSetupDiGetDeviceInterfaceDetailW
82 #else
83 #define pfcnSetupDiGetDeviceInterfaceDetail pfcnSetupDiGetDeviceInterfaceDetailA
84 #endif
85 
86 typedef WINSETUPAPI
87 BOOL
88 (WINAPI *
89  pfcnSetupDiDestroyDeviceInfoList)(
90  IN HDEVINFO DeviceInfoSet
91  );
92 
93 typedef WINSETUPAPI
94 BOOL
95 (WINAPI *
96  pfcnSetupDiDestroyDriverInfoList)(
97  IN HDEVINFO DeviceInfoSet,
98  IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL
99  IN DWORD DriverType
100  );
101 
102 static pfcnSetupDiGetClassDevs pSetupDiGetClassDevs = NULL;
103 static pfcnSetupDiEnumDeviceInterfaces pSetupDiEnumDeviceInterfaces = NULL;
104 static pfcnSetupDiGetDeviceInterfaceDetail pSetupDiGetDeviceInterfaceDetail = NULL;
105 static pfcnSetupDiDestroyDeviceInfoList pSetupDiDestroyDeviceInfoList = NULL;
106 static pfcnSetupDiDestroyDriverInfoList pSetupDiDestroyDriverInfoList = NULL;
107 
108 HINSTANCE hSetupAPI = NULL;
109 
110 #endif
111 
112 static std::string GetKernErrStr (const DWORD inError)
113 {
114  LPVOID lpMsgBuf(NULL);
115  FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
116  NULL,
117  inError,
118  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
119  (LPTSTR) &lpMsgBuf,
120  0,
121  NULL);
122  string result (lpMsgBuf ? reinterpret_cast<const char*>(lpMsgBuf) : "");
123  LocalFree (lpMsgBuf);
124 // Truncate at <CR><LF>...
125  const size_t crPos(result.find(".\r"));
126  if (crPos != string::npos)
127  result.resize(crPos);
128  return result;
129 }
130 
131 
132 // WinDriverInterface Logging Macros
133 #define HEX2(__x__) "0x" << hex << setw(2) << setfill('0') << (0xFF & uint8_t (__x__)) << dec
134 #define HEX4(__x__) "0x" << hex << setw(4) << setfill('0') << (0xFFFF & uint16_t(__x__)) << dec
135 #define HEX8(__x__) "0x" << hex << setw(8) << setfill('0') << (0xFFFFFFFF & uint32_t(__x__)) << dec
136 #define HEX16(__x__) "0x" << hex << setw(16) << setfill('0') << uint64_t(__x__) << dec
137 #define KR(_kr_) "kernResult=" << HEX8(_kr_) << "(" << GetKernErrStr(_kr_) << ")"
138 #define INSTP(_p_) HEX16(uint64_t(_p_))
139 
140 #define WDIFAIL(__x__) AJA_sERROR (AJA_DebugUnit_DriverInterface, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
141 #define WDIWARN(__x__) AJA_sWARNING(AJA_DebugUnit_DriverInterface, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
142 #define WDINOTE(__x__) AJA_sNOTICE (AJA_DebugUnit_DriverInterface, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
143 #define WDIINFO(__x__) AJA_sINFO (AJA_DebugUnit_DriverInterface, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
144 #define WDIDBG(__x__) AJA_sDEBUG (AJA_DebugUnit_DriverInterface, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
145 
146 
148  : _pspDevIFaceDetailData (AJA_NULL)
149  ,_hDevInfoSet (INVALID_HANDLE_VALUE)
150  ,_hDevice (INVALID_HANDLE_VALUE)
151  ,_previousAudioState (0)
152  ,_previousAudioSelection (0)
153 #if !defined(NTV2_DEPRECATE_16_0)
154  ,_vecDmaLocked ()
155 #endif // !defined(NTV2_DEPRECATE_16_0)
156 {
157  ::memset(&_spDevInfoData, 0, sizeof(_spDevInfoData));
158  ::memset(&_GUID_PROPSET, 0, sizeof(_GUID_PROPSET));
159 }
160 
162 {
163  if (IsOpen())
164  Close();
165 }
166 
167 
168 #if !defined(NTV2_NULL_DEVICE)
169 // Board Open / Close methods
172 
174 {
175  NTV2_ASSERT(!IsRemote());
176  NTV2_ASSERT(!IsOpen());
178  string boardStr;
179 
180  {
181  DEFINE_GUIDSTRUCT("844B39E5-C98E-45a1-84DE-3BAF3F4F9F14", AJAVIDEO_NTV2_PROPSET);
182 #define AJAVIDEO_NTV2_PROPSET DEFINE_GUIDNAMED(AJAVIDEO_NTV2_PROPSET)
184  }
185 
186  REFGUID refguid = _GUID_PROPSET;
187  setDeviceIndexNumber(inDeviceIndex);
188 
189  DWORD dwShareMode (GetShareMode() ? FILE_SHARE_READ | FILE_SHARE_WRITE : 0);
190  DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED;
191  DWORD dwReqSize=0;
192  SP_DEVICE_INTERFACE_DATA spDevIFaceData;
193  memset(&spDevIFaceData, 0, sizeof(SP_DEVICE_INTERFACE_DATA));
194  GUID myguid = refguid; // an un-const guid for compiling with new Platform SDK!
195  _hDevInfoSet = SetupDiGetClassDevs(&myguid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
197  return false;
198  spDevIFaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
199  myguid = refguid;
200  if (!SetupDiEnumDeviceInterfaces(_hDevInfoSet, NULL, &myguid, GetIndexNumber(), &spDevIFaceData))
201  {
202  SetupDiDestroyDeviceInfoList(_hDevInfoSet);
203  return false;
204  }
205 
206  if (SetupDiGetDeviceInterfaceDetail(_hDevInfoSet, &spDevIFaceData, NULL, 0, &dwReqSize, NULL))
207  {
208  SetupDiDestroyDeviceInfoList(_hDevInfoSet);
209  return false; //should have failed!
210  }
211  if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
212  {
213  SetupDiDestroyDeviceInfoList(_hDevInfoSet);
214  return false;
215  }
216  _pspDevIFaceDetailData = PSP_DEVICE_INTERFACE_DETAIL_DATA(new BYTE[dwReqSize]);
218  {
219  SetupDiDestroyDeviceInfoList(_hDevInfoSet);
220  return false; // out of memory
221  }
222 
223  memset(&_spDevInfoData, 0, sizeof(SP_DEVINFO_DATA));
224  _spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
225  _pspDevIFaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
226  //now we are setup to get the info we want!
227  if (!SetupDiGetDeviceInterfaceDetail(_hDevInfoSet, &spDevIFaceData, _pspDevIFaceDetailData, dwReqSize, NULL, &_spDevInfoData))
228  {
229  delete [] _pspDevIFaceDetailData;
231  SetupDiDestroyDeviceInfoList(_hDevInfoSet);
232  return false; // out of memory
233  }
234 
235  ULONG deviceInstanceSize = 0;
236  CM_Get_Device_ID_Size(&deviceInstanceSize, _spDevInfoData.DevInst, 0);
237  char* deviceInstance = (char*)new BYTE[deviceInstanceSize*2];
238  CM_Get_Device_IDA(_spDevInfoData.DevInst, deviceInstance, deviceInstanceSize*2, 0);
239  boardStr = deviceInstance;
240  delete [] deviceInstance;
241 
242  _hDevice = CreateFile(_pspDevIFaceDetailData->DevicePath, GENERIC_READ | GENERIC_WRITE, dwShareMode, NULL, OPEN_EXISTING, dwFlagsAndAttributes, NULL);
244  {
245  WDIFAIL("CreateFile failed for '" << boardStr << "'");
246  delete [] _pspDevIFaceDetailData;
248  SetupDiDestroyDeviceInfoList(_hDevInfoSet);
249  _hDevInfoSet = NULL;
250  return false;
251  }
252 
253  _boardOpened = true;
255 
256  WDIINFO ("Opened '" << boardStr << "' deviceID=" << HEX8(_boardID) << " deviceIndex=" << DEC(GetIndexNumber()));
257  return true;
258 } // OpenLocalPhysical
259 
260 
261 
263 {
264  NTV2_ASSERT(!IsRemote());
265  NTV2_ASSERT(IsOpen());
268  {
269  delete [] _pspDevIFaceDetailData;
271  }
272  if (_hDevInfoSet)
273  {
274 #ifndef _AJA_COMPILE_WIN2K_SOFT_LINK
275  SetupDiDestroyDeviceInfoList(_hDevInfoSet);
276 #else
277  if (pSetupDiDestroyDeviceInfoList)
278  pSetupDiDestroyDeviceInfoList(_hDevInfoSet);
279 #endif
281  }
282 
284  CloseHandle(_hDevice);
285  WDIINFO ("Closed deviceID=" << HEX8(_boardID) << " deviceIndex=" << DEC(GetIndexNumber()));
286 
288  _boardOpened = false;
289  return true;
290 }
291 #endif // !defined(NTV2_NULL_DEVICE)
292 
293 
294 
296 // Read and Write Register methods
298 
299 bool CNTV2WinDriverInterface::ReadRegister (const ULWord inRegNum, ULWord & outValue, const ULWord inMask, const ULWord inShift)
300 {
301  if (inShift >= 32)
302  {
303  WDIFAIL("Shift " << DEC(inShift) << " > 31, reg=" << DEC(inRegNum) << " msk=" << xHEX0N(inMask,8));
304  return false;
305  }
306 #if defined(NTV2_NUB_CLIENT_SUPPORT)
307  if (IsRemote())
308  return CNTV2DriverInterface::ReadRegister (inRegNum, outValue, inMask, inShift);
309 #endif // defined(NTV2_NUB_CLIENT_SUPPORT)
310  if (!IsOpen())
311  return false;
312 
314 
316  DWORD dwBytesReturned = 0;
317  ZeroMemory(&propStruct, sizeof(KSPROPERTY_AJAPROPS_GETSETREGISTER_S));
318  propStruct.Property.Set = _GUID_PROPSET;
320  propStruct.Property.Flags = KSPROPERTY_TYPE_GET;
321  propStruct.RegisterID = inRegNum;
322  propStruct.ulRegisterMask = inMask;
323  propStruct.ulRegisterShift = inShift;
325  const bool ok = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_GETSETREGISTER, &propStruct, sizeof(KSPROPERTY_AJAPROPS_GETSETREGISTER_S),
326  &propStruct, sizeof(KSPROPERTY_AJAPROPS_GETSETREGISTER_S), &dwBytesReturned, NULL);
328  if (ok)
329  {
330  outValue = propStruct.ulRegisterValue;
331 #if defined(NTV2_PRETEND_DEVICE)
332  if (inRegNum == kRegBoardID && outValue == NTV2_PRETEND_DEVICE_FROM)
333  outValue = NTV2_PRETEND_DEVICE_TO;
334 // else if (inRegNum == kRegReserved83 || inRegNum == kRegLPRJ45IP)
335 // outValue = 0x0A03FAD9; // Local IPv4 10.3.250.217
336 #endif // NTV2_PRETEND_DEVICE
337  return true;
338  }
339  WDIFAIL("reg=" << DEC(inRegNum) << " val=" << xHEX0N(outValue,8) << " msk=" << xHEX0N(inMask,8) << " shf=" << DEC(inShift) << " failed: " << ::GetKernErrStr(GetLastError()));
340  return false;
341 }
342 
343 
344 bool CNTV2WinDriverInterface::WriteRegister (const ULWord inRegNum, const ULWord inValue, const ULWord inMask, const ULWord inShift)
345 {
346  if (inShift >= 32)
347  {
348  WDIFAIL("Shift " << DEC(inShift) << " > 31, reg=" << DEC(inRegNum) << " msk=" << xHEX0N(inMask,8));
349  return false;
350  }
351 #if defined(NTV2_WRITEREG_PROFILING) // Register Write Profiling
352  if (mRecordRegWrites)
353  {
354  AJAAutoLock autoLock(&mRegWritesLock);
355  mRegWrites.push_back(NTV2RegInfo(inRegNum, inValue, inMask, inShift));
356  if (mSkipRegWrites)
357  return true;
358  }
359 #endif // defined(NTV2_WRITEREG_PROFILING) // Register Write Profiling
360 #if defined(NTV2_NUB_CLIENT_SUPPORT)
361  if (IsRemote())
362  return CNTV2DriverInterface::WriteRegister(inRegNum, inValue, inMask, inShift);
363 #endif // defined(NTV2_NUB_CLIENT_SUPPORT)
364  if (!IsOpen())
365  return false;
367  DWORD dwBytesReturned = 0;
368  NTV2_ASSERT(inShift < 32);
369 
370  ZeroMemory(&propStruct,sizeof(KSPROPERTY_AJAPROPS_GETSETREGISTER_S));
371  propStruct.Property.Set = _GUID_PROPSET;
373  propStruct.Property.Flags = KSPROPERTY_TYPE_SET;
374  propStruct.RegisterID = inRegNum;
375  propStruct.ulRegisterValue = inValue;
376  propStruct.ulRegisterMask = inMask;
377  propStruct.ulRegisterShift = inShift;
379  const bool ok = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_GETSETREGISTER, &propStruct, sizeof(KSPROPERTY_AJAPROPS_GETSETREGISTER_S),
380  &propStruct, sizeof(KSPROPERTY_AJAPROPS_GETSETREGISTER_S), &dwBytesReturned, NULL);
382  if (!ok)
383  {
384  WDIFAIL("reg=" << DEC(inRegNum) << " val=" << xHEX0N(inValue,8) << " msk=" << xHEX0N(inMask,8) << " shf=" << DEC(inShift) << " failed: " << ::GetKernErrStr(GetLastError()));
385  return false;
386  }
387  return true;
388 }
389 
391 // Interrupt enabling / disabling method
393 
394 // Method: ConfigureInterrupt
395 // Input: bool bEnable (turn on/off interrupt), INTERRUPT_ENUMS eInterruptType
396 // Output: bool status
397 // Purpose: Provides a 1 point connection to driver for interrupt calls
398 bool CNTV2WinDriverInterface::ConfigureInterrupt (const bool bEnable, const INTERRUPT_ENUMS eInterruptType)
399 {
400  if (IsRemote())
401  return false;
402  if (!IsOpen())
403  return false;
404  KSPROPERTY_AJAPROPS_INTERRUPTS_S propStruct; // boilerplate AVStream Property structure
405  DWORD dwBytesReturned = 0;
406  ZeroMemory (&propStruct,sizeof(KSPROPERTY_AJAPROPS_INTERRUPTS_S));
407  propStruct.Property.Set = _GUID_PROPSET;
409  propStruct.Property.Flags = bEnable ? KSPROPERTY_TYPE_GET : KSPROPERTY_TYPE_SET;
410  propStruct.eInterrupt = eInterruptType;
411 
412  if (!DeviceIoControl (_hDevice, IOCTL_AJAPROPS_INTERRUPTS, &propStruct, sizeof(KSPROPERTY_AJAPROPS_INTERRUPTS_S),
413  &propStruct, sizeof(KSPROPERTY_AJAPROPS_INTERRUPTS_S), &dwBytesReturned, NULL))
414  {
415  WDIFAIL("interruptType=" << DEC(eInterruptType) << " enable=" << (bEnable?"Y":"N") << " failed: " << ::GetKernErrStr(GetLastError()));
416  return false;
417  }
418  return true;
419 }
420 
421 // Method: ConfigureSubscriptions
422 // Input: bool bSubscribe (true if subscribing), INTERRUPT_ENUMS eInterruptType,
423 // HANDLE & hSubcription
424 // Output: HANDLE & hSubcription (if subscribing)
425 // Notes: collects all driver calls for subscriptions in one place
426 bool CNTV2WinDriverInterface::ConfigureSubscription (const bool bSubscribe, const INTERRUPT_ENUMS eInterruptType, PULWord & outSubscriptionHdl)
427 {
428  if (!IsOpen() && !IsRemote())
429  return false;
430  bool res(CNTV2DriverInterface::ConfigureSubscription (bSubscribe, eInterruptType, outSubscriptionHdl));
431  if (IsRemote())
432  return res;
433  // Check for previouse call to subscribe
434  if (bSubscribe && outSubscriptionHdl)
435  return true; // Already subscribed
436 
437  // Check for valid handle to unsubscribe
438  if (!bSubscribe && !outSubscriptionHdl)
439  return true; // Already unsubscribed
440 
441  // Assure that the avCard has been properly opened
442  HANDLE hSubscription = bSubscribe ? CreateEvent (NULL, FALSE, FALSE, NULL) : HANDLE(outSubscriptionHdl);
444  DWORD dwBytesReturned = 0;
445 
446  ZeroMemory (&propStruct,sizeof(KSPROPERTY_AJAPROPS_NEWSUBSCRIPTIONS_S));
447  propStruct.Property.Set = _GUID_PROPSET;
449  propStruct.Property.Flags = bSubscribe ? KSPROPERTY_TYPE_GET : KSPROPERTY_TYPE_SET;
450  propStruct.Handle = hSubscription;
451  propStruct.eInterrupt = eInterruptType;
452 
453  BOOL bRet = DeviceIoControl (_hDevice, IOCTL_AJAPROPS_NEWSUBSCRIPTIONS, &propStruct, sizeof(KSPROPERTY_AJAPROPS_NEWSUBSCRIPTIONS_S),
454  &propStruct, sizeof(KSPROPERTY_AJAPROPS_NEWSUBSCRIPTIONS_S), &dwBytesReturned, NULL);
455  if ((!bSubscribe && bRet) || (bSubscribe && !bRet))
456  {
457  CloseHandle(hSubscription);
458  outSubscriptionHdl = 0;
459  }
460 
461  if (!bRet)
462  {
463  WDIFAIL("interruptType=" << DEC(eInterruptType) << " subscribe=" << (bSubscribe?"Y":"N") << " failed: " << ::GetKernErrStr(GetLastError()));
464  return false;
465  }
466  if (bSubscribe)
467  outSubscriptionHdl = PULWord(hSubscription);
468  return true;
469 }
470 
471 // Method: getInterruptCount
472 // Input: NONE
473 // Output: ULONG or equivalent(i.e. ULWord).
475 {
476 #if defined(NTV2_NUB_CLIENT_SUPPORT)
477  if (IsRemote())
478  return false;
479 #endif // defined(NTV2_NUB_CLIENT_SUPPORT)
480  if (!IsOpen())
481  return false;
483  DWORD dwBytesReturned = 0;
484  ZeroMemory (&propStruct,sizeof(KSPROPERTY_AJAPROPS_NEWSUBSCRIPTIONS_S));
485  propStruct.Property.Set = _GUID_PROPSET;
487  propStruct.Property.Flags = KSPROPERTY_TYPE_GET;
488  propStruct.eInterrupt = eGetIntCount;
489  propStruct.ulIntCount = ULONG(eInterruptType);
491  const bool ok = DeviceIoControl (_hDevice, IOCTL_AJAPROPS_NEWSUBSCRIPTIONS, &propStruct, sizeof(KSPROPERTY_AJAPROPS_NEWSUBSCRIPTIONS_S),
492  &propStruct, sizeof(KSPROPERTY_AJAPROPS_NEWSUBSCRIPTIONS_S), &dwBytesReturned, NULL);
494  if (!ok)
495  {
496  WDIFAIL("interruptType=" << DEC(eInterruptType) << " failed: " << ::GetKernErrStr(GetLastError()));
497  return false;
498  }
499  outCount = propStruct.ulIntCount;
500  return true;
501 }
502 
503 static const uint32_t sIntEnumToStatKeys[] = { AJA_DebugStat_WaitForInterruptOut1, // eOutput1 // 0
505  AJA_DebugStat_WaitForInterruptIn1, // eInput1 // 2
506  AJA_DebugStat_WaitForInterruptIn2, // eInput2 // 3
508  AJA_DebugStat_WaitForInterruptUartTx1, // eUart1Tx // 14
509  AJA_DebugStat_WaitForInterruptUartRx1, // eUart1Rx // 15
511  AJA_DebugStat_WaitForInterruptIn3, // eInput3 // 24
512  AJA_DebugStat_WaitForInterruptIn4, // eInput4 // 25
513  AJA_DebugStat_WaitForInterruptUartTx2, // eUartTx2 // 26
514  AJA_DebugStat_WaitForInterruptUartRx2, // eUartRx2 // 27
516  AJA_DebugStat_WaitForInterruptIn5, // eInput5 // 29
517  AJA_DebugStat_WaitForInterruptIn6, // eInput6 // 30
518  AJA_DebugStat_WaitForInterruptIn7, // eInput7 // 31
519  AJA_DebugStat_WaitForInterruptIn8, // eInput8 // 32
521 
522 bool CNTV2WinDriverInterface::WaitForInterrupt (const INTERRUPT_ENUMS eInterruptType, const ULWord timeOutMs)
523 {
524 #if defined(NTV2_NUB_CLIENT_SUPPORT)
525  if (IsRemote())
526  return CNTV2DriverInterface::WaitForInterrupt(eInterruptType,timeOutMs);
527 #endif // defined(NTV2_NUB_CLIENT_SUPPORT)
528  if (!IsOpen())
529  return false;
530  if (!NTV2_IS_VALID_INTERRUPT_ENUM(eInterruptType))
531  return false;
532  bool bInterruptHappened = false; // return value
533 
534  HANDLE hEvent (GetInterruptEvent(eInterruptType));
535  if (NULL == hEvent)
536  {
537  // no interrupt hooked up so just use Sleep function
538  Sleep (timeOutMs);
539  }
540  else
541  {
542  // interrupt hooked up. Wait
544  DWORD status = WaitForSingleObject(hEvent, timeOutMs);
546  if ( status == WAIT_OBJECT_0 )
547  {
548  bInterruptHappened = true;
549  BumpEventCount (eInterruptType);
550  }
551  else
552  {
553  ;//MessageBox (0, "WaitForInterrupt timed out", "CNTV2WinDriverInterface", MB_ICONERROR | MB_OK);
554  }
555  }
556  return bInterruptHappened;
557 }
558 
560 // OEM Mapping to Userspace Methods
562 
563 #if !defined(NTV2_DEPRECATE_16_0)
564  // Method: MapFrameBuffers
566  {
567  if (IsRemote())
568  return false;
569  if (!IsOpen())
570  return false;
572  DWORD dwBytesReturned = 0;
573  _pFrameBaseAddress = 0;
575  ZeroMemory (&propStruct,sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S));
576  propStruct.Property.Set = _GUID_PROPSET;
577  propStruct.Property.Id = KSPROPERTY_AJAPROPS_MAPMEMORY;
578  propStruct.Property.Flags = KSPROPERTY_TYPE_GET;
580 
581  if (!DeviceIoControl(_hDevice, IOCTL_AJAPROPS_MAPMEMORY, &propStruct, sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S),
582  &propStruct, sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S), &dwBytesReturned, NULL))
583  {
584  WDIFAIL("failed: " << ::GetKernErrStr(GetLastError()));
585  return false;
586  }
587  ULWord boardIDRegister;
588  ReadRegister(kRegBoardID, boardIDRegister); //unfortunately GetBoardID is in ntv2card...ooops.
589  _pFrameBaseAddress = (ULWord *) propStruct.mapMemory.Address;
592  return true;
593  }
594 
595  // Method: UnmapFrameBuffers
597  {
598  if (IsRemote())
599  return false;
600  if (!IsOpen())
601  return false;
602  ULWord boardIDRegister;
603  ReadRegister(kRegBoardID, boardIDRegister); //unfortunately GetBoardID is in ntv2card...ooops.
604  ULWord * pFrameBaseAddress;
605  pFrameBaseAddress = _pFrameBaseAddress;
606  if (!pFrameBaseAddress)
607  return true;
608 
610  DWORD dwBytesReturned = 0;
611  ZeroMemory (&propStruct,sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S));
612  propStruct.Property.Set = _GUID_PROPSET;
613  propStruct.Property.Id = KSPROPERTY_AJAPROPS_MAPMEMORY;
614  propStruct.Property.Flags = KSPROPERTY_TYPE_SET;
616  propStruct.mapMemory.Address = pFrameBaseAddress;
617  BOOL fRet = DeviceIoControl (_hDevice, IOCTL_AJAPROPS_MAPMEMORY, &propStruct, sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S),
618  &propStruct, sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S), &dwBytesReturned, NULL);
619  _pFrameBaseAddress = 0;
622  if (fRet)
623  return true;
624 
625  WDIFAIL("failed: " << ::GetKernErrStr(GetLastError()));
626  return false;
627  }
628 
629  // Method: MapRegisters
631  {
632  if (IsRemote())
633  return false;
634  if (!IsOpen())
635  return false;
637  DWORD dwBytesReturned = 0;
640  ZeroMemory (&propStruct,sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S));
641  propStruct.Property.Set=_GUID_PROPSET;
643  propStruct.Property.Flags = KSPROPERTY_TYPE_GET;
644  propStruct.bMapType = NTV2_MAPMEMORY_REGISTER;
645  if (!DeviceIoControl (_hDevice, IOCTL_AJAPROPS_MAPMEMORY, &propStruct, sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S),
646  &propStruct, sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S), &dwBytesReturned, NULL))
647  {
648  WDIFAIL("failed: " << ::GetKernErrStr(GetLastError()));
649  return false;
650  }
651 
654  return true;
655  }
656 
657  // Method: UnmapRegisters
659  {
660  if (IsRemote())
661  return false;
662  if (!IsOpen())
663  return false;
664  if (_pRegisterBaseAddress == 0)
665  return true;
666 
668  DWORD dwBytesReturned = 0;
669  ZeroMemory (&propStruct,sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S));
670  propStruct.Property.Set = _GUID_PROPSET;
671  propStruct.Property.Id = KSPROPERTY_AJAPROPS_MAPMEMORY;
672  propStruct.Property.Flags = KSPROPERTY_TYPE_SET;
673  propStruct.bMapType = NTV2_MAPMEMORY_REGISTER;
675  BOOL fRet = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_MAPMEMORY, &propStruct, sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S),
676  &propStruct, sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S), &dwBytesReturned, NULL);
679  if (fRet)
680  return true;
681  WDIFAIL("failed: " << ::GetKernErrStr(GetLastError()));
682  return false;
683  }
684 
685  // Method: MapXena2Flash
687  {
688  if (IsRemote())
689  return false;
690  if (!IsOpen())
691  return false;
693  DWORD dwBytesReturned = 0;
696  ZeroMemory (&propStruct,sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S));
697  propStruct.Property.Set = _GUID_PROPSET;
698  propStruct.Property.Id = KSPROPERTY_AJAPROPS_MAPMEMORY;
699  propStruct.Property.Flags = KSPROPERTY_TYPE_GET;
701  if (!DeviceIoControl (_hDevice, IOCTL_AJAPROPS_MAPMEMORY, &propStruct, sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S),
702  &propStruct, sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S), &dwBytesReturned, NULL))
703  {
704  WDIFAIL("failed: " << ::GetKernErrStr(GetLastError()));
705  return false;
706  }
709  return true;
710  }
711 
712  // Method: UnmapXena2Flash
714  {
715  if (IsRemote())
716  return false;
717  if (!IsOpen())
718  return false;
719  if (_pRegisterBaseAddress == 0)
720  return true;
721 
723  DWORD dwBytesReturned = 0;
724  ZeroMemory (&propStruct,sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S));
725  propStruct.Property.Set = _GUID_PROPSET;
726  propStruct.Property.Id = KSPROPERTY_AJAPROPS_MAPMEMORY;
727  propStruct.Property.Flags = KSPROPERTY_TYPE_SET;
730  BOOL fRet = DeviceIoControl (_hDevice, IOCTL_AJAPROPS_MAPMEMORY, &propStruct, sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S),
731  &propStruct, sizeof(KSPROPERTY_AJAPROPS_MAPMEMORY_S), &dwBytesReturned, NULL);
734  if (fRet)
735  return true;
736  WDIFAIL("failed: " << ::GetKernErrStr(GetLastError()));
737  return false;
738  }
739 
740  bool CNTV2WinDriverInterface::MapMemory (PVOID pvUserVa, ULWord ulNumBytes, bool bMap, ULWord* ulUser)
741  {
742  if (IsRemote())
743  return false;
744  if (!IsOpen())
745  return false;
746 
747  KSPROPERTY_AJAPROPS_DMA_S propStruct;
748  DWORD dwBytesReturned = 0;
749  ZeroMemory (&propStruct,sizeof(KSPROPERTY_AJAPROPS_DMA_S));
750  propStruct.Property.Set = _GUID_PROPSET;
751  propStruct.Property.Id = KSPROPERTY_AJAPROPS_DMA;
752  propStruct.Property.Flags = bMap ? KSPROPERTY_TYPE_GET : KSPROPERTY_TYPE_SET;
753  propStruct.dmaEngine = NTV2_PIO;
754  propStruct.pvVidUserVa = pvUserVa;
755  propStruct.ulVidNumBytes = ulNumBytes;
756  if (!DeviceIoControl (_hDevice, IOCTL_AJAPROPS_DMA, &propStruct, sizeof(KSPROPERTY_AJAPROPS_DMA_S),
757  &propStruct, sizeof(KSPROPERTY_AJAPROPS_DMA_S), &dwBytesReturned, NULL))
758  {
759  WDIFAIL (KR(GetLastError()) << " -- numBytes=" << ulNumBytes << " map=" << (bMap?"Y":"N"));
760  return false;
761  }
762  if (ulUser)
763  *ulUser = propStruct.ulFrameOffset;
764  return true;
765  }
766 
767  // DmaUnlock
768  // Called from avclasses destructor to insure the process isn't terminating
769  // with memory still locked - a guaranteed cause of a blue screen
771  {
772  if (!IsOpen())
773  return false;
774  if (IsRemote())
775  return false;
776  // For every locked entry, try to free it
777  for (size_t ndx(0); ndx < _vecDmaLocked.size(); ndx++)
779 
780  NTV2_ASSERT(_vecDmaLocked.empty() && "_vecDmaLocked should be empty");
781  return true;
782  }
783 
785  // PrepareMemoryForDMA
786  // Passes the address of a user space allocated frame buffer and the buffer's size to the
787  // kernel, where the kernel
788  // creates a MDL and probes & locks the memory. The framebuffer's userspace address is saved
789  // in the kernel, and all subsequent DMA calls to this address will avoid the time penalties
790  // of the MDL creation and the probe & lock.
791  // NOTE: When this method is used to lock new()ed memory, this memory *should*
792  // be unlocked with the CompleteMemoryForDMA() method before calling delete(). The avclasses
793  // destructor does call DmaUnlock() which attempts to unlock all locked pages with calls
794  // to CompleteMemoryForDMA().
795  // NOTE: Any memory that is new()ed *should* be delete()ed before the process goes out of
796  // scope.
798  {
799  if (!IsOpen())
800  return false;
801  if (IsRemote())
802  return false;
803  // Use NTV2_PIO as an overloaded flag to indicate this is not a DMA transfer
804  if (!DmaTransfer (NTV2_PIO, true, 0, pFrameBuffer, 0, ulNumBytes, false))
805  return false;
806  // Succeeded -- add pFrameBuffer to the avclasses' vector of locked memory
807  _vecDmaLocked.push_back(pFrameBuffer);
808  return true;
809  }
810 
812  // CompleteMemoryForDMA: unlock and free resources
813  // The inverse of PrepareMemoryForDMA. It passes the framebuffer address to the kernel, where
814  // the kernel looks up this address and unlocks the memory, unmaps the memory, and deletes the
815  // MDL.
816  // NOTE: this method does not cleanup the call to new() which created the memory. It is the new()
817  // caller's responsibility to call delete() after calling this method to finish the cleanup.
819  {
820  if (!IsOpen())
821  return false;
822  if (IsRemote())
823  return false;
824  // Use NTV2_PIO as an overloaded flag to indicate this is not a DMA transfer
825  if (!DmaTransfer (NTV2_PIO, false, 0, pFrameBuffer, 0, 0))
826  return false;
827  // Succeeded -- remove pFrameBuffer from the avclasses' vector of locked memory
828  // Find the entry in the avclasses vector that holds this framebuffer's address
829  for (DMA_LOCKED_VEC::iterator vecIter(_vecDmaLocked.begin()); vecIter != _vecDmaLocked.end(); ++vecIter)
830  // If we've found one, erase (delete) it
831  if (*vecIter == pFrameBuffer)
832  {
833  _vecDmaLocked.erase(vecIter);
834  break;
835  }
836  return true;
837  }
838 #endif // !defined(NTV2_DEPRECATE_16_0)
839 
840 
842 // DMA
843 
845  const bool inIsRead,
846  const ULWord inFrameNumber,
847  ULWord * pFrameBuffer,
848  const ULWord inOffsetBytes,
849  const ULWord inByteCount,
850  const bool inSynchronous)
851 {
852  if (IsRemote())
853  return CNTV2DriverInterface::DmaTransfer(inDMAEngine, inIsRead, inFrameNumber, pFrameBuffer,
854  inOffsetBytes, inByteCount, inSynchronous);
855  if (!IsOpen())
856  return false;
857 
858  KSPROPERTY_AJAPROPS_DMA_S propStruct;
859  DWORD dwBytesReturned = 0;
860  ZeroMemory (&propStruct,sizeof(KSPROPERTY_AJAPROPS_DMA_S));
861  propStruct.Property.Set = _GUID_PROPSET;
862  propStruct.Property.Id = KSPROPERTY_AJAPROPS_DMA;
863  propStruct.Property.Flags = inIsRead ? KSPROPERTY_TYPE_GET : KSPROPERTY_TYPE_SET;
864  propStruct.dmaEngine = inDMAEngine;
865  propStruct.pvVidUserVa = PVOID(pFrameBuffer);
866  propStruct.ulFrameNumber = inFrameNumber;
867  propStruct.ulFrameOffset = inOffsetBytes;
868  propStruct.ulVidNumBytes = inByteCount;
869  propStruct.ulAudNumBytes = 0;
870  propStruct.bSync = inSynchronous;
872  const bool ok = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_DMA, &propStruct, sizeof(KSPROPERTY_AJAPROPS_DMA_S),
873  &propStruct, sizeof(KSPROPERTY_AJAPROPS_DMA_S), &dwBytesReturned, NULL);
875  if (!ok)
876  {
877  WDIFAIL ("failed: " << ::GetKernErrStr(GetLastError()) << ": eng=" << inDMAEngine << " frm=" << inFrameNumber
878  << " off=" << HEX8(inOffsetBytes) << " len=" << HEX8(inByteCount) << " " << (inIsRead ? "Rd" : "Wr"));
879  return false;
880  }
881  return true;
882 }
883 
884 
886  const bool inIsRead,
887  const ULWord inFrameNumber,
888  ULWord * pFrameBuffer,
889  const ULWord inOffsetBytes,
890  const ULWord inByteCount,
891  const ULWord inNumSegments,
892  const ULWord inHostPitch,
893  const ULWord inCardPitch,
894  const bool inSynchronous)
895 {
896  if (IsRemote())
897  return CNTV2DriverInterface::DmaTransfer(inDMAEngine, inIsRead, inFrameNumber, pFrameBuffer,
898  inOffsetBytes, inByteCount, inNumSegments, inHostPitch, inCardPitch, inSynchronous);
899  if (!IsOpen())
900  return false;
901 
902  KSPROPERTY_AJAPROPS_DMA_EX_S propStruct;
903  DWORD dwBytesReturned = 0;
904  ZeroMemory (&propStruct,sizeof(KSPROPERTY_AJAPROPS_DMA_EX_S));
905  propStruct.Property.Set = _GUID_PROPSET;
906  propStruct.Property.Id = KSPROPERTY_AJAPROPS_DMA_EX;
907  propStruct.Property.Flags = inIsRead ? KSPROPERTY_TYPE_GET : KSPROPERTY_TYPE_SET;
908  propStruct.dmaEngine = inDMAEngine;
909  propStruct.pvVidUserVa = PVOID(pFrameBuffer);
910  propStruct.ulFrameNumber = inFrameNumber;
911  propStruct.ulFrameOffset = inOffsetBytes;
912  propStruct.ulVidNumBytes = inByteCount;
913  propStruct.ulAudNumBytes = 0;
914  propStruct.ulVidNumSegments = inNumSegments;
915  propStruct.ulVidSegmentHostPitch = inHostPitch;
916  propStruct.ulVidSegmentCardPitch = inCardPitch;
917  propStruct.bSync = inSynchronous;
919  const bool ok = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_DMA_EX, &propStruct, sizeof(KSPROPERTY_AJAPROPS_DMA_EX_S),
920  &propStruct, sizeof(KSPROPERTY_AJAPROPS_DMA_EX_S), &dwBytesReturned, NULL);
922  if (!ok)
923  {
924  WDIFAIL ("failed: " << ::GetKernErrStr(GetLastError()) << ": eng=" << inDMAEngine << " frm=" << inFrameNumber
925  << " off=" << HEX8(inOffsetBytes) << " len=" << HEX8(inByteCount) << " " << (inIsRead ? "Rd" : "Wr"));
926  return false;
927  }
928  return true;
929 }
930 
932  const NTV2Channel inDMAChannel,
933  const bool inIsTarget,
934  const ULWord inFrameNumber,
935  const ULWord inCardOffsetBytes,
936  const ULWord inByteCount,
937  const ULWord inNumSegments,
938  const ULWord inHostPitch,
939  const ULWord inCardPitch,
940  const PCHANNEL_P2P_STRUCT & inP2PData)
941 {
942  if (IsRemote())
943  return CNTV2DriverInterface::DmaTransfer(inDMAEngine, inDMAChannel, inIsTarget, inFrameNumber, inCardOffsetBytes,
944  inByteCount, inNumSegments, inHostPitch, inCardPitch, inP2PData);
945  if (!IsOpen())
946  return false;
947  if (!inP2PData)
948  {
949  WDIFAIL ("pP2PData == NULL");
950  return false;
951  }
952 
953  DWORD dwBytesReturned(0);
955  ZeroMemory (&propStruct,sizeof(KSPROPERTY_AJAPROPS_DMA_P2P_S));
956 
957  propStruct.Property.Set = _GUID_PROPSET;
958  propStruct.Property.Id = KSPROPERTY_AJAPROPS_DMA_P2P;
959  if (inIsTarget)
960  { // reset p2p struct
961  memset(inP2PData, 0, sizeof(CHANNEL_P2P_STRUCT));
962  inP2PData->p2pSize = sizeof(CHANNEL_P2P_STRUCT);
963  propStruct.Property.Flags = KSPROPERTY_TYPE_GET; // get does target
964  }
965  else
966  { // check for valid p2p struct
967  if (inP2PData->p2pSize != sizeof(CHANNEL_P2P_STRUCT))
968  {
969  WDIFAIL ("p2pSize=" << inP2PData->p2pSize << " != sizeof(CHANNEL_P2P_STRUCT) " << sizeof(CHANNEL_P2P_STRUCT));
970  return false;
971  }
972  propStruct.Property.Flags = KSPROPERTY_TYPE_SET; // set does transfer
973  }
974 
975  propStruct.dmaEngine = inDMAEngine;
976  propStruct.dmaChannel = inDMAChannel;
977  propStruct.ulFrameNumber = inFrameNumber;
978  propStruct.ulFrameOffset = inCardOffsetBytes;
979  propStruct.ulVidNumBytes = inByteCount;
980  propStruct.ulVidNumSegments = inNumSegments;
981  propStruct.ulVidSegmentHostPitch = inHostPitch;
982  propStruct.ulVidSegmentCardPitch = inCardPitch;
983  propStruct.ullVideoBusAddress = inP2PData->videoBusAddress;
984  propStruct.ullMessageBusAddress = inP2PData->messageBusAddress;
985  propStruct.ulVideoBusSize = inP2PData->videoBusSize;
986  propStruct.ulMessageData = inP2PData->messageData;
988  const bool ok = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_DMA_P2P, &propStruct, sizeof(KSPROPERTY_AJAPROPS_DMA_P2P_S),
989  &propStruct, sizeof(KSPROPERTY_AJAPROPS_DMA_P2P_S), &dwBytesReturned, NULL);
991  if (!ok)
992  {
993  WDIFAIL ("Failed: " << ::GetKernErrStr(GetLastError()) << ": eng=" << inDMAEngine << " ch=" << inDMAChannel
994  << " frm=" << inFrameNumber << " off=" << HEX8(inCardOffsetBytes) << " siz=" << HEX8(inByteCount)
995  << " #segs=" << inNumSegments << " hostPitch=" << inHostPitch << " cardPitch=" << inCardPitch
996  << " target=" << (inIsTarget?"Y":"N"));
997  return false;
998  }
999  if (inIsTarget)
1000  {
1001  // check for data returned
1002  if (dwBytesReturned != sizeof(KSPROPERTY_AJAPROPS_DMA_P2P_S))
1003  {
1004  WDIFAIL ("Target failed: " << ::GetKernErrStr(GetLastError()) << " eng=" << inDMAEngine << " ch=" << inDMAChannel
1005  << " frm=" << inFrameNumber << " off=" << HEX8(inCardOffsetBytes) << " vSiz=" << HEX8(inByteCount)
1006  << " segs=" << inNumSegments << " hostPitch=" << inHostPitch << " cardPitch=" << inCardPitch
1007  << " target=" << (inIsTarget?"Y":"N") << " p2pBytesRet=" << HEX8(dwBytesReturned)
1008  << " p2pSize=" << HEX8(sizeof(KSPROPERTY_AJAPROPS_DMA_P2P_S)));
1009  return false;
1010  }
1011 
1012  // fill in p2p data
1013  inP2PData->videoBusAddress = propStruct.ullVideoBusAddress;
1014  inP2PData->messageBusAddress = propStruct.ullMessageBusAddress;
1015  inP2PData->videoBusSize = propStruct.ulVideoBusSize;
1016  inP2PData->messageData = propStruct.ulMessageData;
1017  }
1018  return true;
1019 }
1020 
1021 
1023 // AutoCirculate
1025 {
1026  if (IsRemote())
1027  return CNTV2DriverInterface::AutoCirculate(autoCircData);
1028  bool bRes(true);
1029  DWORD dwBytesReturned(0);
1030 
1031  switch (autoCircData.eCommand)
1032  {
1033  case eInitAutoCirc:
1034  {
1035  if (autoCircData.lVal4 <= 1 && autoCircData.lVal5 == 0 && autoCircData.lVal6 == 0)
1036  {
1038  memset(&autoCircControl, 0, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_CONTROL_S));
1039  autoCircControl.Property.Set = _GUID_PROPSET;
1040  autoCircControl.Property.Id = KSPROPERTY_AJAPROPS_AUTOCIRC_CONTROL;
1041  autoCircControl.Property.Flags = KSPROPERTY_TYPE_SET;
1042  autoCircControl.channelSpec = autoCircData.channelSpec;
1043  autoCircControl.eCommand = autoCircData.eCommand;
1044 
1045  autoCircControl.lVal1 = autoCircData.lVal1;
1046  autoCircControl.lVal2 = autoCircData.lVal2;
1047  autoCircControl.lVal3 = autoCircData.lVal3;
1048  autoCircControl.bVal1 = autoCircData.bVal1;
1049  autoCircControl.bVal2 = autoCircData.bVal2;
1050  autoCircControl.bVal3 = autoCircData.bVal3;
1051  autoCircControl.bVal4 = autoCircData.bVal4;
1052  autoCircControl.bVal5 = autoCircData.bVal5;
1053  autoCircControl.bVal6 = autoCircData.bVal6;
1054  autoCircControl.bVal7 = autoCircData.bVal7;
1055  autoCircControl.bVal8 = autoCircData.bVal8;
1057  bRes = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_AUTOCIRC_CONTROL, &autoCircControl, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_CONTROL_S),
1058  &autoCircControl, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_CONTROL_S), &dwBytesReturned, NULL);
1060  if (!bRes)
1061  WDIFAIL("ACInit failed: " << ::GetKernErrStr(GetLastError()));
1062  }
1063  else
1064  {
1066  memset(&autoCircControl, 0, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_CONTROL_EX_S));
1067  autoCircControl.Property.Set = _GUID_PROPSET;
1069  autoCircControl.Property.Flags = KSPROPERTY_TYPE_SET;
1070  autoCircControl.channelSpec = autoCircData.channelSpec;
1071  autoCircControl.eCommand = autoCircData.eCommand;
1072 
1073  autoCircControl.lVal1 = autoCircData.lVal1;
1074  autoCircControl.lVal2 = autoCircData.lVal2;
1075  autoCircControl.lVal3 = autoCircData.lVal3;
1076  autoCircControl.lVal4 = autoCircData.lVal4;
1077  autoCircControl.lVal5 = autoCircData.lVal5;
1078  autoCircControl.lVal6 = autoCircData.lVal6;
1079  autoCircControl.bVal1 = autoCircData.bVal1;
1080  autoCircControl.bVal2 = autoCircData.bVal2;
1081  autoCircControl.bVal3 = autoCircData.bVal3;
1082  autoCircControl.bVal4 = autoCircData.bVal4;
1083  autoCircControl.bVal5 = autoCircData.bVal5;
1084  autoCircControl.bVal6 = autoCircData.bVal6;
1085  autoCircControl.bVal7 = autoCircData.bVal7;
1086  autoCircControl.bVal8 = autoCircData.bVal8;
1088  bRes = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_AUTOCIRC_CONTROL_EX, &autoCircControl, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_CONTROL_EX_S),
1089  &autoCircControl, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_CONTROL_EX_S), &dwBytesReturned, NULL);
1091  if (!bRes)
1092  WDIFAIL("ACInitEx failed: " << ::GetKernErrStr(GetLastError()));
1093  }
1094  break;
1095  } // eInitAutoCirc
1096 
1097  case eStartAutoCirc:
1098  case eStopAutoCirc:
1099  case eAbortAutoCirc:
1100  case ePauseAutoCirc:
1101  case eFlushAutoCirculate:
1102  case ePrerollAutoCirculate:
1103  case eStartAutoCircAtTime:
1104  {
1106  memset(&autoCircControl, 0, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_CONTROL_S));
1107  autoCircControl.Property.Set = _GUID_PROPSET;
1108  autoCircControl.Property.Id = KSPROPERTY_AJAPROPS_AUTOCIRC_CONTROL;
1109  autoCircControl.Property.Flags = KSPROPERTY_TYPE_SET;
1110  autoCircControl.channelSpec = autoCircData.channelSpec;
1111  autoCircControl.eCommand = autoCircData.eCommand;
1112 
1113  switch (autoCircData.eCommand)
1114  {
1115  case ePauseAutoCirc:
1116  autoCircControl.bVal1 = autoCircData.bVal1;
1117  break;
1118 
1119  case ePrerollAutoCirculate:
1120  autoCircControl.lVal1 = autoCircData.lVal1;
1121  break;
1122 
1123  case eStartAutoCircAtTime:
1124  autoCircControl.lVal1 = autoCircData.lVal1;
1125  autoCircControl.lVal2 = autoCircData.lVal2;
1126  break;
1127 
1128  default: break; //NTV2_ASSERT(false && "Bad eCommand");
1129  }
1131  bRes = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_AUTOCIRC_CONTROL, &autoCircControl, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_CONTROL_S),
1132  &autoCircControl, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_CONTROL_S), &dwBytesReturned, NULL);
1134  if (!bRes)
1135  WDIFAIL("ACInitEx failed: " << ::GetKernErrStr(GetLastError()));
1136  break;
1137  } // eStartAutoCirc, eStopAutoCirc, etc.
1138 
1139  case eGetAutoCirc:
1140  {
1142  memset(&autoCircStatus, 0, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_STATUS_S));
1143  autoCircStatus.Property.Set = _GUID_PROPSET;
1144  autoCircStatus.Property.Id = KSPROPERTY_AJAPROPS_AUTOCIRC_STATUS;
1145  autoCircStatus.Property.Flags = KSPROPERTY_TYPE_GET;
1146  autoCircStatus.channelSpec = autoCircData.channelSpec;
1147  autoCircStatus.eCommand = autoCircData.eCommand;
1148  if (autoCircData.pvVal1)
1149  {
1151  bRes = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_AUTOCIRC_STATUS, &autoCircStatus, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_STATUS_S),
1152  &autoCircStatus, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_STATUS_S), &dwBytesReturned, NULL);
1154  if (bRes)
1155  *(AUTOCIRCULATE_STATUS_STRUCT *)autoCircData.pvVal1 = autoCircStatus.autoCircStatus;
1156  else
1157  WDIFAIL("GetAC failed: " << ::GetKernErrStr(GetLastError()));
1158  }
1159  else
1160  {bRes = false; WDIFAIL("GetAC failed: NULL pvVal1");}
1161  break;
1162  } // eGetAutoCirc
1163 
1164  case eGetFrameStamp:
1165  {
1167  memset(&autoCircFrame, 0, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_FRAME_S));
1168  autoCircFrame.Property.Set = _GUID_PROPSET;
1169  autoCircFrame.Property.Id = KSPROPERTY_AJAPROPS_AUTOCIRC_FRAME;
1170  autoCircFrame.Property.Flags = KSPROPERTY_TYPE_GET;
1171  autoCircFrame.channelSpec = autoCircData.channelSpec;
1172  autoCircFrame.eCommand = autoCircData.eCommand;
1173  autoCircFrame.lFrameNum = autoCircData.lVal1;
1174 
1175  if (autoCircData.pvVal1)
1176  {
1177  autoCircFrame.frameStamp = *(FRAME_STAMP_STRUCT *) autoCircData.pvVal1;
1179  bRes = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_AUTOCIRC_FRAME, &autoCircFrame, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_FRAME_S),
1180  &autoCircFrame, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_FRAME_S), &dwBytesReturned, NULL);
1182  if (bRes)
1183  *(FRAME_STAMP_STRUCT *)autoCircData.pvVal1 = autoCircFrame.frameStamp;
1184  else
1185  WDIFAIL("GetFrameStamp failed: " << ::GetKernErrStr(GetLastError()));
1186  }
1187  else
1188  {bRes = false; WDIFAIL("GetFrameStamp failed: NULL pvVal1");}
1189  break;
1190  } // eGetFrameStamp
1191 
1192  case eGetFrameStampEx2:
1193  {
1195  memset(&autoCircFrame, 0, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_FRAME_EX2_S));
1196  autoCircFrame.Property.Set = _GUID_PROPSET;
1198  autoCircFrame.Property.Flags = KSPROPERTY_TYPE_GET;
1199  autoCircFrame.channelSpec = autoCircData.channelSpec;
1200  autoCircFrame.eCommand = autoCircData.eCommand;
1201  autoCircFrame.lFrameNum = autoCircData.lVal1;
1202 
1203  if (autoCircData.pvVal1)
1204  {
1205  autoCircFrame.frameStamp = *(FRAME_STAMP_STRUCT *) autoCircData.pvVal1;
1206  if (autoCircData.pvVal2)
1207  autoCircFrame.acTask = *(AUTOCIRCULATE_TASK_STRUCT *) autoCircData.pvVal2;
1208 
1210  bRes = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_AUTOCIRC_FRAME_EX2, &autoCircFrame, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_FRAME_EX2_S),
1211  &autoCircFrame, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_FRAME_EX2_S), &dwBytesReturned, NULL);
1213  if (bRes)
1214  {
1215  *(FRAME_STAMP_STRUCT *)autoCircData.pvVal1 = autoCircFrame.frameStamp;
1216  if (autoCircData.pvVal2)
1217  *(AUTOCIRCULATE_TASK_STRUCT *) autoCircData.pvVal2 = autoCircFrame.acTask;
1218  }
1219  else
1220  WDIFAIL("GetFrameStampEx2 failed: " << ::GetKernErrStr(GetLastError()));
1221  }
1222  else
1223  {bRes = false; WDIFAIL("GetFrameStampEx2 failed: NULL pvVal1");}
1224  break;
1225  }
1226 
1228  {
1230  memset(&acXfer, 0, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_TRANSFER_S));
1231  acXfer.Property.Set = _GUID_PROPSET;
1233  acXfer.Property.Flags = KSPROPERTY_TYPE_GET;
1234  acXfer.eCommand = autoCircData.eCommand;
1235 
1236  if (!autoCircData.pvVal1 || !autoCircData.pvVal2)
1237  {bRes = false; WDIFAIL("ACXfer failed: pvVal1 or pvVal2 NULL"); break;}
1238  acXfer.acTransfer = *(PAUTOCIRCULATE_TRANSFER_STRUCT) autoCircData.pvVal1; // Reqd XferStruct
1239  AUTOCIRCULATE_TRANSFER_STATUS_STRUCT acStatus = *(PAUTOCIRCULATE_TRANSFER_STATUS_STRUCT) autoCircData.pvVal2; // Reqd XferStatusStruct
1240 
1241  // Ensure audio buffer alignment OK
1242  if (acXfer.acTransfer.audioBufferSize && (acXfer.acTransfer.audioBufferSize % 4))
1243  {bRes = false; WDIFAIL("ACXfer failed: audio buffer size " << DEC(acXfer.acTransfer.audioBufferSize) << " not mod 4"); break;}
1244  if (acXfer.acTransfer.audioBuffer && (ULWord64(acXfer.acTransfer.audioBuffer) % 4))
1245  {bRes = false; WDIFAIL("ACXfer failed: audio buffer addr " << xHEX0N(acXfer.acTransfer.audioBuffer,16) << " not DWORD-aligned"); break;}
1246 
1248  bRes = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_AUTOCIRC_TRANSFER, &acXfer, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_TRANSFER_S),
1249  &acStatus, sizeof (AUTOCIRCULATE_TRANSFER_STATUS_STRUCT), &dwBytesReturned, NULL);
1251  if (bRes)
1252  *(PAUTOCIRCULATE_TRANSFER_STATUS_STRUCT)autoCircData.pvVal2 = acStatus;
1253  else
1254  WDIFAIL("ACXfer failed: " << ::GetKernErrStr(GetLastError()));
1255  break;
1256  } // eTransferAutoCirculate
1257 
1259  {
1261  memset(&acXfer, 0, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_TRANSFER_EX_S));
1262  acXfer.Property.Set = _GUID_PROPSET;
1264  acXfer.Property.Flags = KSPROPERTY_TYPE_GET;
1265  acXfer.eCommand = autoCircData.eCommand;
1266 
1267  if (!autoCircData.pvVal1 || !autoCircData.pvVal2)
1268  {bRes = false; WDIFAIL("ACXferEx failed: NULL XferStruct or XferStatusStruct"); break;}
1269  acXfer.acTransfer = *(PAUTOCIRCULATE_TRANSFER_STRUCT) autoCircData.pvVal1; // Reqd XferStruct
1270  AUTOCIRCULATE_TRANSFER_STATUS_STRUCT acStatus = *(PAUTOCIRCULATE_TRANSFER_STATUS_STRUCT) autoCircData.pvVal2; // Reqd XferStatusStruct
1271  if (autoCircData.pvVal3)
1272  acXfer.acTransferRoute = *(NTV2RoutingTable*) autoCircData.pvVal3; // Optional RoutingTable
1273 
1274  // Ensure audio buffer alignment OK
1275  if (acXfer.acTransfer.audioBufferSize && (acXfer.acTransfer.audioBufferSize % 4))
1276  {bRes = false; WDIFAIL("ACXferEx failed: audio buffer size " << DEC(acXfer.acTransfer.audioBufferSize) << " not mod 4"); break;}
1277  if (acXfer.acTransfer.audioBuffer && (ULWord64(acXfer.acTransfer.audioBuffer) % 4))
1278  {bRes = false; WDIFAIL("ACXferEx failed: audio buffer addr " << xHEX0N(acXfer.acTransfer.audioBuffer,16) << " not DWORD-aligned"); break;}
1279 
1282  &acStatus, sizeof (AUTOCIRCULATE_TRANSFER_STATUS_STRUCT), &dwBytesReturned, NULL);
1284  if (bRes)
1285  *(PAUTOCIRCULATE_TRANSFER_STATUS_STRUCT)autoCircData.pvVal2 = acStatus;
1286  else
1287  WDIFAIL("ACXferEx failed: " << ::GetKernErrStr(GetLastError()));
1288  break;
1289  } // eTransferAutoCirculateEx
1290 
1292  {
1294  memset(&acXfer, 0, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_TRANSFER_EX2_S));
1295  acXfer.Property.Set = _GUID_PROPSET;
1297  acXfer.Property.Flags = KSPROPERTY_TYPE_GET;
1298  acXfer.eCommand = autoCircData.eCommand;
1299 
1300  if (!autoCircData.pvVal1 || !autoCircData.pvVal2)
1301  {bRes = false; WDIFAIL("ACXferEx2 failed: NULL XferStruct or RoutingTable"); break;}
1302 
1303  acXfer.acTransfer = *(PAUTOCIRCULATE_TRANSFER_STRUCT) autoCircData.pvVal1; // Reqd XferStruct
1304  AUTOCIRCULATE_TRANSFER_STATUS_STRUCT acStatus = *(PAUTOCIRCULATE_TRANSFER_STATUS_STRUCT) autoCircData.pvVal2; // Reqd XferStatusStruct
1305  if (autoCircData.pvVal3)
1306  acXfer.acTransferRoute = *(NTV2RoutingTable*) autoCircData.pvVal3; // Optional RoutingTable
1307  if (autoCircData.pvVal4)
1308  acXfer.acTask = *(PAUTOCIRCULATE_TASK_STRUCT) autoCircData.pvVal4; // Optional TaskStruct
1309 
1310  // Ensure audio buffer alignment OK
1311  if (acXfer.acTransfer.audioBufferSize && (acXfer.acTransfer.audioBufferSize % 4))
1312  {bRes = false; WDIFAIL("ACXferEx2 failed: audio buffer size " << DEC(acXfer.acTransfer.audioBufferSize) << " not mod 4"); break;}
1313  if (acXfer.acTransfer.audioBuffer && (ULWord64(acXfer.acTransfer.audioBuffer) % 4))
1314  {bRes = false; WDIFAIL("ACXferEx2 failed: audio buffer addr " << xHEX0N(acXfer.acTransfer.audioBuffer,16) << " not DWORD-aligned"); break;}
1315 
1318  &acStatus, sizeof (AUTOCIRCULATE_TRANSFER_STATUS_STRUCT), &dwBytesReturned, NULL);
1320  if (bRes)
1321  *(PAUTOCIRCULATE_TRANSFER_STATUS_STRUCT)autoCircData.pvVal2 = acStatus;
1322  else
1323  WDIFAIL("ACXferEx2 failed: " << ::GetKernErrStr(GetLastError()));
1324  break;
1325  } // eTransferAutoCirculateEx2
1326 
1327  case eSetCaptureTask:
1328  {
1330  memset(&autoCircFrame, 0, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_FRAME_EX2_S));
1331  autoCircFrame.Property.Set = _GUID_PROPSET;
1333  autoCircFrame.Property.Flags = KSPROPERTY_TYPE_SET;
1334  autoCircFrame.channelSpec = autoCircData.channelSpec;
1335  autoCircFrame.eCommand = autoCircData.eCommand;
1336  autoCircFrame.lFrameNum = 0;
1337 
1338  if (!autoCircData.pvVal1)
1339  {bRes = false; WDIFAIL("ACSetCaptureTask failed: NULL TaskStruct"); break;}
1340  autoCircFrame.acTask = *(AUTOCIRCULATE_TASK_STRUCT *) autoCircData.pvVal1; // Reqd TaskStruct
1341 
1343  bRes = DeviceIoControl(_hDevice, IOCTL_AJAPROPS_AUTOCIRC_CAPTURE_TASK, &autoCircFrame, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_FRAME_EX2_S),
1344  &autoCircFrame, sizeof(KSPROPERTY_AJAPROPS_AUTOCIRC_FRAME_EX2_S), &dwBytesReturned, NULL);
1346  if (!bRes)
1347  WDIFAIL("ACSetCaptureTask failed: " << ::GetKernErrStr(GetLastError()));
1348  break;
1349  } // eSetCaptureTask
1350 
1351  case eSetActiveFrame:
1353  { bRes = false;
1354  WDIFAIL("Bad AC command %d" << autoCircData.eCommand);
1355  break;
1356  }
1357  } // switch on autoCircData.eCommand
1358  return bRes;
1359 } // AutoCirculate
1360 
1361 
1363 {
1364  if (!pInMessage)
1365  {WDIFAIL("Failed: NULL pointer"); return false;}
1366  if (IsRemote())
1367  return CNTV2DriverInterface::NTV2Message(pInMessage); // Implement NTV2Message on nub
1368  DWORD dwBytesReturned(0);
1370  const bool ok = DeviceIoControl(_hDevice, IOCTL_AJANTV2_MESSAGE, pInMessage, pInMessage->GetSizeInBytes (), pInMessage, pInMessage->GetSizeInBytes(), &dwBytesReturned, NULL);
1372  if (!ok)
1373  {WDIFAIL("Failed: " << ::GetKernErrStr(GetLastError())); return false;}
1374  return true;
1375 }
1376 
1377 
1379 {
1381 }
1382 
1384 {
1386 }
1387 
1388 
1389 //
1390 // Management of downloaded Xilinx bitfile
1391 //
1392 //
1394 {
1395  if (IsRemote())
1396  return CNTV2DriverInterface::DriverGetBitFileInformation (outBitfileInfo, bitFileType);
1397  if (::NTV2DeviceHasSPIFlash(_boardID)) // No need to query the driver for boards with SPIFlash
1398  return CNTV2DriverInterface::DriverGetBitFileInformation (outBitfileInfo, bitFileType);
1399 
1400  // Ask the driver...
1401  DWORD dwBytesReturned(0);
1403  ZeroMemory(&propStruct,sizeof(KSPROPERTY_AJAPROPS_GETSETBITFILEINFO_S));
1404  propStruct.Property.Set = _GUID_PROPSET;
1406  propStruct.Property.Flags = KSPROPERTY_TYPE_GET;
1407  if (!DeviceIoControl(_hDevice, IOCTL_AJAPROPS_GETSETBITFILEINFO, &propStruct, sizeof(KSPROPERTY_AJAPROPS_GETSETBITFILEINFO_S),
1408  &propStruct, sizeof(KSPROPERTY_AJAPROPS_GETSETBITFILEINFO_S), &dwBytesReturned, NULL))
1409  {
1410  WDIFAIL("Failed");
1411  return false;
1412  }
1413  outBitfileInfo = propStruct.bitFileInfoStruct;
1414  return true;
1415 }
1416 
1418 {
1419  DWORD dwBytesReturned(0);
1421  ZeroMemory(&propStruct, sizeof(KSPROPERTY_AJAPROPS_GETSETBITFILEINFO_S));
1422  propStruct.Property.Set = _GUID_PROPSET;
1424  propStruct.Property.Flags = KSPROPERTY_TYPE_SET;
1425  propStruct.bitFileInfoStruct = inBitfileInfo;
1426  if (DeviceIoControl(_hDevice, IOCTL_AJAPROPS_GETSETBITFILEINFO, &propStruct, sizeof(KSPROPERTY_AJAPROPS_GETSETBITFILEINFO_S),
1427  &propStruct, sizeof(KSPROPERTY_AJAPROPS_GETSETBITFILEINFO_S), &dwBytesReturned, NULL))
1428  return true;
1429 
1430  WDIFAIL("Failed");
1431  return false;
1432 }
1433 
1434 
1435 #include <ntv2devicefeatures.h>
1436 
1438 {
1439  if (IsRemote())
1440  return false;
1442 }
Everything needed to call CNTV2Card::ReadRegister or CNTV2Card::WriteRegister functions.
Defines & structs shared between user-space and Windows kernel driver.
virtual bool RestoreHardwareProcampRegisters(void)
#define IOCTL_AJAPROPS_AUTOCIRC_FRAME
#define IOCTL_AJAPROPS_AUTOCIRC_CONTROL_EX
#define IOCTL_AJAPROPS_DMA_P2P
#define NULL
virtual bool UnmapFrameBuffers(void)
uint32_t * PULWord
Definition: ajatypes.h:224
#define IOCTL_AJAPROPS_AUTOCIRC_FRAME_EX2
Declares the AJADebug class.
virtual UWord GetIndexNumber(void) const
void setDeviceIndexNumber(const UWord num)
#define NTV2_IS_VALID_INTERRUPT_ENUM(__e__)
#define IOCTL_AJAPROPS_MAPMEMORY
bool NTV2DeviceHasSPIFlash(const NTV2DeviceID inDeviceID)
virtual bool Close(void)
Closes me, releasing host resources that may have been allocated in a previous Open call...
virtual bool AutoCirculate(AUTOCIRCULATE_DATA &autoCircData)
Sends an AutoCirculate command to the NTV2 driver.
#define IOCTL_AJAPROPS_NEWSUBSCRIPTIONS
if(!(riid==IID_IUnknown) &&!(riid==IID_IClassFactory))
Definition: dllentry.cpp:196
ULONG(__stdcall *_RegisterTraceGuids)(__in IN WMIDPREQUEST RequestAddress
static bool GetShareMode(void)
#define IOCTL_AJAPROPS_AUTOCIRC_TRANSFER_EX2
virtual ~CNTV2WinDriverInterface()
My default destructor.
struct AUTOCIRCULATE_TASK_STRUCT * PAUTOCIRCULATE_TASK_STRUCT
virtual bool WaitForInterrupt(const INTERRUPT_ENUMS eInterruptType, const ULWord timeOutMs=50)
Definition: json.hpp:5362
#define AJAVIDEO_NTV2_PROPSET
virtual bool PrepareMemoryForDMA(ULWord *pFrameBuffer, const ULWord ulNumBytes)
uint32_t ULWord
Definition: ajatypes.h:223
virtual bool DmaTransfer(const NTV2DMAEngine inDMAEngine, const bool inIsRead, const ULWord inFrameNumber, ULWord *pFrameBuffer, const ULWord inCardOffsetBytes, const ULWord inTotalByteCount, const bool inSynchronous=(!(0)))
Transfers data between the AJA device and the host. This function will block and not return to the ca...
NTV2Channel
These enum values are mostly used to identify a specific widget_framestore. They&#39;re also commonly use...
Definition: ntv2enums.h:1357
short HANDLE
Definition: ajatypes.h:285
PSP_DEVICE_INTERFACE_DETAIL_DATA _pspDevIFaceDetailData
#define NTV2_ASSERT(_expr_)
Definition: ajatypes.h:476
virtual bool ReadRegister(const ULWord inRegNum, ULWord &outValue, const ULWord inMask=0xFFFFFFFF, const ULWord inShift=0)
Physical device implementation of CNTV2DriverInterface::ReadRegister.
void * PVOID
Definition: ajatypes.h:286
static AJAStatus StatTimerStop(const uint32_t inKey)
Definition: debug.cpp:1155
virtual bool DmaTransfer(const NTV2DMAEngine inDMAEngine, const bool inIsRead, const ULWord inFrameNumber, ULWord *pFrameBuffer, const ULWord inCardOffsetBytes, const ULWord inByteCount, const bool inSynchronous=(!(0)))
Transfers data between the AJA device and the host. This function will block and not return to the ca...
#define IOCTL_AJAPROPS_GETSETBITFILEINFO
virtual bool IsRemote(void) const
struct AUTOCIRCULATE_TRANSFER_STATUS_STRUCT * PAUTOCIRCULATE_TRANSFER_STATUS_STRUCT
#define IOCTL_AJAPROPS_AUTOCIRC_TRANSFER_EX
ULWord GetSizeInBytes(void) const
My total size, in bytes, including header, body and trailer (but excluding embedded NTV2Buffer data) ...
NTV2DeviceID _boardID
My cached device ID.
virtual bool MapMemory(PVOID pvUserVa, ULWord ulNumBytes, bool bMap, ULWord *ulUser=NULL)
virtual bool DriverSetBitFileInformation(const BITFILE_INFO_STRUCT &inBitfileInfo)
virtual bool IsOpen(void) const
bool _boardOpened
True if I&#39;m open and connected to the device.
AUTOCIRCULATE_STATUS_STRUCT autoCircStatus
virtual void BumpEventCount(const INTERRUPT_ENUMS eInterruptType)
Atomically increments the event count tally for the given interrupt type.
NTV2DMAEngine
Definition: ntv2enums.h:1856
#define AJA_NULL
Definition: ajatypes.h:167
virtual bool ReadRegister(const ULWord inRegNum, ULWord &outValue, const ULWord inMask=0xFFFFFFFF, const ULWord inShift=0)
Reads all or part of the 32-bit contents of a specific register (real or virtual) on the AJA device...
virtual bool WriteRegister(const ULWord inRegNum, const ULWord inValue, const ULWord inMask=0xFFFFFFFF, const ULWord inShift=0)
Physical device implementation of CNTV2DriverInterface::WriteRegister.
virtual bool DriverGetBitFileInformation(BITFILE_INFO_STRUCT &outBitfileInfo, const NTV2BitFileType inBitfileType=NTV2_VideoProcBitFile)
defined(NTV2_DEPRECATE_17_2)
enum _INTERRUPT_ENUMS_ INTERRUPT_ENUMS
bool mRecordRegWrites
True if recording; otherwise false when not recording.
All new NTV2 structs start with this common header.
virtual bool NTV2Message(NTV2_HEADER *pInMessage)
Sends a message to the NTV2 driver (the new, improved, preferred way).
AJALock mRegWritesLock
Guard mutex for mRegWrites.
#define KR(_kr_)
NTV2_GlobalAudioPlaybackMode
Definition: ntv2enums.h:2106
Declares data types and structures used in NTV2 "nub" packets.
uint64_t ULWord64
Definition: ajatypes.h:226
NTV2Crosspoint channelSpec
virtual bool WriteRegister(const ULWord inRegNum, const ULWord inValue, const ULWord inMask=0xFFFFFFFF, const ULWord inShift=0)
Updates or replaces all or part of the 32-bit contents of a specific register (real or virtual) on th...
NTV2BitFileType
Definition: ntv2enums.h:3349
static const uint32_t sIntEnumToStatKeys[]
virtual bool NTV2Message(NTV2_HEADER *pInMessage)
Sends a message to the NTV2 driver (the new, improved, preferred way).
#define IOCTL_AJAPROPS_AUTOCIRC_STATUS
#define IOCTL_AJAPROPS_INTERRUPTS
virtual bool DriverGetBitFileInformation(BITFILE_INFO_STRUCT &outBitFileInfo, const NTV2BitFileType inBitFileType=NTV2_VideoProcBitFile)
defined(NTV2_DEPRECATE_17_2)
static AJAStatus StatTimerStart(const uint32_t inKey)
Definition: debug.cpp:1135
Declares the MSWindows-specific flavor of CNTV2DriverInterface.
struct AUTOCIRCULATE_P2P_STRUCT CHANNEL_P2P_STRUCT
#define IOCTL_AJAPROPS_DMA
Added to support 64 bit driver.
#define DEC(__x__)
#define IOCTL_AJAPROPS_GETSETREGISTER
#define IOCTL_AJANTV2_MESSAGE
virtual bool ConfigureInterrupt(const bool bEnable, const INTERRUPT_ENUMS eInterruptType)
#define IOCTL_AJAPROPS_DMA_EX
#define WDIINFO(__x__)
AUTO_CIRC_COMMAND eCommand
uint16_t UWord
Definition: ajatypes.h:221
virtual bool SetAudioOutputMode(NTV2_GlobalAudioPlaybackMode mode)
#define IOCTL_AJAPROPS_AUTOCIRC_TRANSFER
#define xHEX0N(__x__, __n__)
virtual bool WaitForInterrupt(const INTERRUPT_ENUMS eInterrupt, const ULWord timeOutMs=68)
#define INVALID_HANDLE_VALUE
Definition: ajatypes.h:299
virtual bool GetAudioOutputMode(NTV2_GlobalAudioPlaybackMode *mode)
#define IOCTL_AJAPROPS_AUTOCIRC_CAPTURE_TASK
virtual bool ConfigureSubscription(const bool bSubscribe, const INTERRUPT_ENUMS inInterruptType, PULWord &outSubcriptionHdl)
CNTV2WinDriverInterface()
My default constructor.
struct AUTOCIRCULATE_TRANSFER_STRUCT * PAUTOCIRCULATE_TRANSFER_STRUCT
#define HEX8(__x__)
NTV2RegisterWrites mRegWrites
Stores WriteRegister data.
virtual bool ConfigureSubscription(const bool bSubscribe, const INTERRUPT_ENUMS eInterruptType, PULWord &hSubcription)
static std::string GetKernErrStr(const DWORD inError)
virtual bool CompleteMemoryForDMA(ULWord *pFrameBuffer)
virtual bool OpenLocalPhysical(const UWord inDeviceIndex)
defined(NTV2_DEPRECATE_17_6)
bool mSkipRegWrites
True if actual register writes are skipped while recording.
Declares enums and structs used by all platform drivers and the SDK.
virtual bool AutoCirculate(AUTOCIRCULATE_DATA &pAutoCircData)
Sends an AutoCirculate command to the NTV2 driver.
#define IOCTL_AJAPROPS_AUTOCIRC_CONTROL
Declares device capability functions.
virtual bool GetInterruptCount(const INTERRUPT_ENUMS eInterrupt, ULWord &outCount)
Answers with the number of interrupts of the given type processed by the driver.
#define WDIFAIL(__x__)
virtual bool CloseLocalPhysical(void)
Releases host resources associated with the local/physical device connection.
virtual HANDLE GetInterruptEvent(const INTERRUPT_ENUMS eInterruptType)