AJA NTV2 SDK  18.0.0.2717
NTV2 SDK 18.0.0.2717
pnpimpl.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
10 #include "ajabase/system/debug.h"
11 
12 #define PNPFAIL(__x__) AJA_sREPORT(AJA_DebugUnit_PnP, AJA_DebugSeverity_Error, __func__ << ": " << __x__)
13 #define PNPWARN(__x__) AJA_sREPORT(AJA_DebugUnit_PnP, AJA_DebugSeverity_Warning, __func__ << ": " << __x__)
14 #define PNPNOTE(__x__) AJA_sREPORT(AJA_DebugUnit_PnP, AJA_DebugSeverity_Notice, __func__ << ": " << __x__)
15 #define PNPINFO(__x__) AJA_sREPORT(AJA_DebugUnit_PnP, AJA_DebugSeverity_Info, __func__ << ": " << __x__)
16 #define PNPDBG(__x__) AJA_sREPORT(AJA_DebugUnit_PnP, AJA_DebugSeverity_Debug, __func__ << ": " << __x__)
17 
18 
19 static void CALLBACK SignaledAddRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
20 {
21  AJAPnpImpl *context = (AJAPnpImpl*)lpParam;
22  context->AddSignaled();
23 
24 }
25 
26 static void CALLBACK SignaledRemoveRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
27 {
28  AJAPnpImpl *context = (AJAPnpImpl*)lpParam;
29  context->RemoveSignaled();
30 
31 }
32 
33 AJAPnpImpl::AJAPnpImpl() : mRefCon(NULL), mCallback(NULL), mDevices(0), mAddEventHandle(NULL), mAddWaitHandle(NULL), mRemoveEventHandle(NULL), mRemoveWaitHandle(NULL)
34 {
35 }
36 
37 
39 {
40  Uninstall();
41 }
42 
43 
44 AJAStatus AJAPnpImpl::Install(AJAPnpCallback callback, void* refCon, uint32_t devices)
45 {
46  mCallback = callback;
47  mRefCon = refCon;
48  mDevices = devices;
49 
50  if (!mCallback)
51  {PNPFAIL("NULL callback"); return AJA_STATUS_NULL;}
52 
53  // Windows only handles PCIe devices
54  if (mDevices & AJA_Pnp_PciVideoDevices)
55  {
56  mAddEventHandle = CreateEventW(NULL, FALSE, FALSE, L"Global\\AJAPNPAddEvent");
57  if (!mAddEventHandle)
58  {PNPFAIL("NULL handle from CreateEventW for 'Global\\AJAPNPAddEvent'"); return AJA_STATUS_FAIL;}
59  if (!RegisterWaitForSingleObject(&mAddWaitHandle, mAddEventHandle, (WAITORTIMERCALLBACK)&SignaledAddRoutine, this, INFINITE, NULL))
60  {PNPFAIL("RegisterWaitForSingleObject failed for 'Global\\AJAPNPAddEvent'"); return AJA_STATUS_FAIL;}
61 
62  mRemoveEventHandle = CreateEventW(NULL, FALSE, FALSE, L"Global\\AJAPNPRemoveEvent");
63  if (!mRemoveEventHandle)
64  {PNPFAIL("NULL handle from CreateEventW for 'Global\\AJAPNPRemoveEvent'"); return AJA_STATUS_FAIL;}
65  if (!RegisterWaitForSingleObject(&mRemoveWaitHandle, mRemoveEventHandle, (WAITORTIMERCALLBACK)&SignaledRemoveRoutine, this, INFINITE, NULL))
66  {PNPFAIL("RegisterWaitForSingleObject failed for 'Global\\AJAPNPRemoveEvent'"); return AJA_STATUS_FAIL;}
67 
68  PNPINFO("Callback installation succeeded");
69  return AJA_STATUS_SUCCESS;
70  }
71  PNPFAIL("'AJA_Pnp_PciVideoDevices' not set, AJAPnp callback not installed");
72  return AJA_STATUS_FAIL; // Nothing installed
73 }
74 
76 {
77  mCallback = NULL;
78  mRefCon = NULL;
79  mDevices = 0;
80 
81  if (mAddWaitHandle || mRemoveWaitHandle)
82  PNPINFO("Callback uninstalled");
83  if (mAddWaitHandle != NULL)
84  {
85  UnregisterWait(mAddWaitHandle);
86  mAddWaitHandle = NULL;
87  }
88  if (mRemoveWaitHandle != NULL)
89  {
90  UnregisterWait(mRemoveWaitHandle);
91  mRemoveWaitHandle = NULL;
92  }
93  return AJA_STATUS_SUCCESS;
94 }
95 
97 {
98  PNPNOTE("'Device added' signaled");
99  AJATime::Sleep(1000);
100  if (mCallback)
101  (*(mCallback))(AJA_Pnp_DeviceAdded, mRefCon);
102 
103  RegisterWaitForSingleObject(&mAddWaitHandle, mAddEventHandle, (WAITORTIMERCALLBACK)SignaledAddRoutine, this, INFINITE, NULL);
104 }
105 
107 {
108  PNPNOTE("'Device removed' signaled");
109  if (mCallback)
110  (*(mCallback))(AJA_Pnp_DeviceRemoved, mRefCon);
111 
112  RegisterWaitForSingleObject(&mRemoveWaitHandle, mRemoveEventHandle, (WAITORTIMERCALLBACK)SignaledRemoveRoutine, this, INFINITE, NULL);
113 }
AJAPnpImpl::Uninstall
AJAStatus Uninstall(void)
Definition: pnpimpl.cpp:62
NULL
#define NULL
Definition: ntv2caption608types.h:19
AJA_STATUS_SUCCESS
@ AJA_STATUS_SUCCESS
Definition: types.h:381
AJAPnpCallback
void(* AJAPnpCallback)(AJAPnpMessage inMessage, void *inRefCon)
If installed (see AJAPnp::Install) in an AJAPnp instance, this function is called when an AJA device ...
Definition: pnp.h:39
systemtime.h
Declares the AJATime class.
AJA_Pnp_PciVideoDevices
@ AJA_Pnp_PciVideoDevices
Definition: pnp.h:16
pnpimpl.h
Declares the AJAPnpImpl class.
AJAStatus
AJAStatus
Definition: types.h:378
AJATime::Sleep
static void Sleep(const int32_t inMilliseconds)
Suspends execution of the current thread for a given number of milliseconds.
Definition: systemtime.cpp:284
AJA_STATUS_FAIL
@ AJA_STATUS_FAIL
Definition: types.h:382
AJAPnpImpl::Install
AJAStatus Install(AJAPnpCallback callback, void *refCon, uint32_t devices)
Definition: pnpimpl.cpp:32
PNPNOTE
#define PNPNOTE(__x__)
Definition: pnpimpl.cpp:14
PNPFAIL
#define PNPFAIL(__x__)
Definition: pnpimpl.cpp:12
PVOID
void * PVOID
Definition: ajatypes.h:339
AJA_Pnp_DeviceRemoved
@ AJA_Pnp_DeviceRemoved
Definition: pnp.h:25
AJAPnpImpl
Definition: pnpimpl.h:13
AJAPnpImpl::AJAPnpImpl
AJAPnpImpl()
Definition: pnpimpl.cpp:20
SignaledAddRoutine
static void CALLBACK SignaledAddRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
Definition: pnpimpl.cpp:19
AJA_STATUS_NULL
@ AJA_STATUS_NULL
Definition: types.h:387
AJAPnpImpl::AddSignaled
void AddSignaled(void)
Definition: pnpimpl.cpp:96
SignaledRemoveRoutine
static void CALLBACK SignaledRemoveRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
Definition: pnpimpl.cpp:26
AJAPnpImpl::~AJAPnpImpl
virtual ~AJAPnpImpl(void)
Definition: pnpimpl.cpp:25
AJA_Pnp_DeviceAdded
@ AJA_Pnp_DeviceAdded
Definition: pnp.h:24
AJAPnpImpl::RemoveSignaled
void RemoveSignaled(void)
Definition: pnpimpl.cpp:106
PNPINFO
#define PNPINFO(__x__)
Definition: pnpimpl.cpp:15
debug.h
Declares the AJADebug class.