AJA NTV2 SDK  17.5.0.1242
NTV2 SDK 17.5.0.1242
ntv2regroute.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
8 #include "ntv2card.h"
9 #include "ntv2utils.h"
10 #include "ntv2registerexpert.h"
11 #include "ajabase/system/debug.h"
12 #include <deque>
13 
14 using namespace std;
15 
16 #define HEX16(__x__) "0x" << hex << setw(16) << setfill('0') << uint64_t(__x__) << dec
17 #define INSTP(_p_) HEX16(uint64_t(_p_))
18 #define LOGGING_ROUTING_CHANGES (AJADebug::IsActive(AJA_DebugUnit_RoutingGeneric))
19 #define ROUTEFAIL(__x__) AJA_sERROR (AJA_DebugUnit_RoutingGeneric, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
20 #define ROUTEWARN(__x__) AJA_sWARNING(AJA_DebugUnit_RoutingGeneric, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
21 #define ROUTENOTE(__x__) AJA_sNOTICE (AJA_DebugUnit_RoutingGeneric, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
22 #define ROUTEINFO(__x__) AJA_sINFO (AJA_DebugUnit_RoutingGeneric, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
23 #define ROUTEDBG(__x__) AJA_sDEBUG (AJA_DebugUnit_RoutingGeneric, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
24 
25 
26 static const ULWord sMasks[] = { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 };
27 static const ULWord sShifts[] = { 0, 8, 16, 24 };
28 
30 {
31  const ULWord maxRegNum (GetNumSupported(kDeviceGetMaxRegisterNumber));
32  uint32_t regNum (0);
33  uint32_t ndx (0);
34 
35  outOutputXpt = NTV2_OUTPUT_CROSSPOINT_INVALID;
36  if (!CNTV2RegisterExpert::GetCrosspointSelectGroupRegisterInfo (inInputXpt, regNum, ndx))
37  return false;
38 
39  if (!regNum)
40  return false; // Register number is zero
41  if (ndx > 3)
42  return false; // Bad index
43  if (regNum > maxRegNum)
44  return false; // This device doesn't have that routing register
45 
46  return CNTV2DriverInterface::ReadRegister (regNum, outOutputXpt, sMasks[ndx], sShifts[ndx]);
47 
48 } // GetConnectedOutput
49 
50 
52 {
53  for (outInputXpt = NTV2_FIRST_INPUT_CROSSPOINT;
54  outInputXpt <= NTV2_LAST_INPUT_CROSSPOINT;
55  outInputXpt = NTV2InputCrosspointID(outInputXpt+1))
56  {
58  if (GetConnectedOutput (outInputXpt, tmpOutputXpt))
59  if (tmpOutputXpt == inOutputXpt)
60  return true;
61  }
62  outInputXpt = NTV2_INPUT_CROSSPOINT_INVALID;
63  return true;
64 }
65 
66 
68 {
69  outInputXpts.clear();
70  if (!NTV2_IS_VALID_OutputCrosspointID(inOutputXpt))
71  return false;
72  if (inOutputXpt == NTV2_XptBlack)
73  return false;
75  inputXpt <= NTV2_LAST_INPUT_CROSSPOINT;
76  inputXpt = NTV2InputCrosspointID(inputXpt+1))
77  {
79  if (GetConnectedOutput (inputXpt, tmpOutputXpt))
80  if (tmpOutputXpt == inOutputXpt)
81  outInputXpts.insert(inputXpt);
82  }
83  return !outInputXpts.empty();
84 }
85 
86 
87 bool CNTV2Card::Connect (const NTV2InputCrosspointID inInputXpt, const NTV2OutputCrosspointID inOutputXpt, const bool inValidate)
88 {
89  if (inOutputXpt == NTV2_XptBlack)
90  return Disconnect (inInputXpt);
91 
92  const ULWord maxRegNum (GetNumSupported(kDeviceGetMaxRegisterNumber));
93  uint32_t regNum (0);
94  uint32_t ndx (0);
95  bool canConnect (true);
96 
98  {ROUTEFAIL(GetDisplayName() << ": GetCrosspointSelectGroupRegisterInfo failed, inputXpt=" << DEC(inInputXpt)); return false;}
99  if (!regNum || regNum > maxRegNum)
100  {ROUTEFAIL(GetDisplayName() << ": GetCrosspointSelectGroupRegisterInfo returned bad register number '" << DEC(regNum) << "' for inputXpt=" << DEC(inInputXpt)); return false;}
101  if (ndx > 3)
102  {ROUTEFAIL(GetDisplayName() << ": GetCrosspointSelectGroupRegisterInfo returned bad index '" << DEC(ndx) << "' for inputXpt=" << DEC(inInputXpt)); return false;}
103 
104  if (inValidate) // If caller requested xpt validation
105  if (CanConnect(inInputXpt, inOutputXpt, canConnect)) // If answer can be trusted
106  if (!canConnect) // If route not valid
107  {
108  ROUTEFAIL (GetDisplayName() << ": Unsupported route " << ::NTV2InputCrosspointIDToString(inInputXpt) << " <== " << ::NTV2OutputCrosspointIDToString(inOutputXpt)
109  << ": reg=" << DEC(regNum) << " val=" << DEC(inOutputXpt) << " mask=" << xHEX0N(sMasks[ndx],8) << " shift=" << DEC(sShifts[ndx]));
110  return false;
111  }
112 
113  ULWord outputXpt(0);
114  const bool isLogging (LOGGING_ROUTING_CHANGES);
115  if (isLogging)
116  ReadRegister(regNum, outputXpt, sMasks[ndx], sShifts[ndx]);
117  const bool result (WriteRegister(regNum, inOutputXpt, sMasks[ndx], sShifts[ndx]));
118  if (isLogging)
119  {
120  if (!result)
121  ROUTEFAIL(GetDisplayName() << ": Failed to connect " << ::NTV2InputCrosspointIDToString(inInputXpt) << " <== " << ::NTV2OutputCrosspointIDToString(inOutputXpt)
122  << ": reg=" << DEC(regNum) << " val=" << DEC(inOutputXpt) << " mask=" << xHEX0N(sMasks[ndx],8) << " shift=" << DEC(sShifts[ndx]));
123  else if (outputXpt && inOutputXpt != outputXpt)
124  ROUTENOTE(GetDisplayName() << ": Connected " << ::NTV2InputCrosspointIDToString(inInputXpt) << " <== " << ::NTV2OutputCrosspointIDToString(inOutputXpt)
125  << " -- was from " << ::NTV2OutputCrosspointIDToString(NTV2OutputXptID(outputXpt)));
126  else if (!outputXpt && inOutputXpt != outputXpt)
127  ROUTENOTE(GetDisplayName() << ": Connected " << ::NTV2InputCrosspointIDToString(inInputXpt) << " <== " << ::NTV2OutputCrosspointIDToString(inOutputXpt) << " -- was disconnected");
128  //else ROUTEDBG(GetDisplayName() << ": Connection " << ::NTV2InputCrosspointIDToString(inInputXpt) << " <== " << ::NTV2OutputCrosspointIDToString(inOutputXpt) << " unchanged -- already connected");
129  }
130  return result;
131 }
132 
133 
135 {
136  const ULWord maxRegNum (GetNumSupported(kDeviceGetMaxRegisterNumber));
137  uint32_t regNum (0);
138  uint32_t ndx (0);
139  ULWord outputXpt (0);
140 
141  if (!CNTV2RegisterExpert::GetCrosspointSelectGroupRegisterInfo(inInputXpt, regNum, ndx))
142  return false;
143  if (!regNum)
144  return false; // Register number is zero
145  if (ndx > 3)
146  return false; // Bad index
147  if (regNum > maxRegNum)
148  return false; // This device doesn't have that routing register
149 
150  const bool isLogging (LOGGING_ROUTING_CHANGES);
151  bool changed (false);
152  if (isLogging)
153  changed = ReadRegister(regNum, outputXpt, sMasks[ndx], sShifts[ndx]) && outputXpt;
154  const bool result (WriteRegister(regNum, NTV2_XptBlack, sMasks[ndx], sShifts[ndx]));
155  if (isLogging)
156  {
157  if (result && changed)
158  ROUTENOTE(GetDisplayName() << ": Disconnected " << ::NTV2InputCrosspointIDToString(inInputXpt) << " <== " << ::NTV2OutputCrosspointIDToString(NTV2OutputXptID(outputXpt)));
159  else if (!result)
160  ROUTEFAIL(GetDisplayName() << ": Failed to disconnect " << ::NTV2InputCrosspointIDToString(inInputXpt) << " <== " << ::NTV2OutputCrosspointIDToString(NTV2OutputXptID(outputXpt))
161  << ": reg=" << DEC(regNum) << " val=0 mask=" << xHEX0N(sMasks[ndx],8) << " shift=" << DEC(sShifts[ndx]));
162  //else ROUTEDBG(GetDisplayName() << ": " << ::NTV2InputCrosspointIDToString(inInputXpt) << " <== " << ::NTV2OutputCrosspointIDToString(NTV2OutputXptID(outputXpt)) << " already disconnected");
163  }
164  return result;
165 }
166 
167 
168 bool CNTV2Card::IsConnectedTo (const NTV2InputCrosspointID inInputXpt, const NTV2OutputCrosspointID inOutputXpt, bool & outIsConnected)
169 {
171 
172  outIsConnected = false;
173  if (!GetConnectedOutput (inInputXpt, outputID))
174  return false;
175 
176  outIsConnected = outputID == inOutputXpt;
177  return true;
178 }
179 
180 
181 bool CNTV2Card::IsConnected (const NTV2InputCrosspointID inInputXpt, bool & outIsConnected)
182 {
183  bool isConnectedToBlack (false);
184  if (!IsConnectedTo (inInputXpt, NTV2_XptBlack, isConnectedToBlack))
185  return false;
186 
187  outIsConnected = !isConnectedToBlack;
188  return true;
189 }
190 
191 
192 bool CNTV2Card::CanConnect (const NTV2InputCrosspointID inInputXpt, const NTV2OutputCrosspointID inOutputXpt, bool & outCanConnect)
193 {
194  outCanConnect = false;
195  if (!IsSupported(kDeviceHasXptConnectROM))
196  return false; // No CanConnect ROM -- can't say
197 
198  // NOTE: This is not a very efficient implementation, but CanConnect probably isn't being
199  // called every frame. The good news is that this function now gets its information
200  // "straight from the horse's mouth" via the validated GetRouteROMInfoFromReg function,
201  // so its answer will be trustworthy.
202 
203  // Check for reasonable input xpt...
204  if (ULWord(inInputXpt) < ULWord(NTV2_FIRST_INPUT_CROSSPOINT) || ULWord(inInputXpt) > NTV2_LAST_INPUT_CROSSPOINT)
205  {
206  ROUTEFAIL(GetDisplayName() << ": " << xHEX0N(UWord(inInputXpt),4) << " > "
207  << xHEX0N(UWord(NTV2_LAST_INPUT_CROSSPOINT),4) << " (out of range)");
208  return false;
209  }
210 
211  // Every input xpt can connect to XptBlack...
212  if (inOutputXpt == NTV2_XptBlack)
213  {outCanConnect = true; return true;}
214 
215  // Check for reasonable output xpt...
216  if (ULWord(inOutputXpt) >= UWord(NTV2_LAST_OUTPUT_CROSSPOINT))
217  {
218  ROUTEFAIL(GetDisplayName() << ": Bad output xpt " << xHEX0N(ULWord(inOutputXpt),4) << " >= "
220  return false;
221  }
222 
223  // Determine all legal output xpts for this input xpt...
224  NTV2OutputXptIDSet legalOutputXpts;
225  const uint32_t regBase(uint32_t(kRegFirstValidXptROMRegister) + 4UL * uint32_t(inInputXpt - NTV2_FIRST_INPUT_CROSSPOINT));
226  for (uint32_t ndx(0); ndx < 4; ndx++)
227  {
228  ULWord regVal(0);
229  NTV2InputXptID inputXpt;
230  ReadRegister(regBase + ndx, regVal);
231  if (!CNTV2SignalRouter::GetRouteROMInfoFromReg (regBase + ndx, regVal, inputXpt, legalOutputXpts, true/*append*/))
232  ROUTEWARN(GetDisplayName() << ": GetRouteROMInfoFromReg failed for register " << DEC(regBase+ndx)
233  << ", input xpt ' " << ::NTV2InputCrosspointIDToString(inInputXpt) << "' " << xHEX0N(UWord(inInputXpt),2));
234  }
235 
236  // Is the route implemented?
237  outCanConnect = legalOutputXpts.find(inOutputXpt) != legalOutputXpts.end();
238  return true;
239 }
240 
241 
242 bool CNTV2Card::ApplySignalRoute (const CNTV2SignalRouter & inRouter, const bool inReplace)
243 {
244  if (inReplace)
245  if (!ClearRouting ())
246  return false;
247 
248  NTV2RegisterWrites registerWrites;
249  if (!inRouter.GetRegisterWrites (registerWrites))
250  return false;
251 
252  return WriteRegisters (registerWrites);
253 }
254 
255 bool CNTV2Card::ApplySignalRoute (const NTV2XptConnections & inConnections, const bool inReplace)
256 {
257  if (inReplace)
258  if (!ClearRouting ())
259  return false;
260 
261  unsigned failures(0);
262  for (NTV2XptConnectionsConstIter iter(inConnections.begin()); iter != inConnections.end(); ++iter)
263  if (!Connect(iter->first, iter->second, IsSupported(kDeviceHasXptConnectROM)))
264  failures++;
265  return failures == 0;
266 }
267 
269 {
270  unsigned failures(0);
271  for (NTV2XptConnectionsConstIter iter(inConnections.begin()); iter != inConnections.end(); ++iter)
272  if (!Disconnect(iter->first))
273  failures++;
274  return failures == 0;
275 }
276 
277 
279 {
281  const ULWord maxRegisterNumber (GetNumSupported(kDeviceGetMaxRegisterNumber));
282  unsigned nFailures (0);
283  ULWord tally (0);
284 
285  for (NTV2RegNumSetConstIter it(routingRegisters.begin()); it != routingRegisters.end(); ++it) // for each routing register
286  if (*it <= maxRegisterNumber) // if it's valid for this board
287  { ULWord num(0);
288  if (ReadRegister (*it, num))
289  tally += num;
290  if (!WriteRegister (*it, 0)) // then if WriteRegister fails
291  nFailures++; // then bump the failure tally
292  }
293 
294  if (tally && !nFailures)
295  ROUTEINFO(GetDisplayName() << ": Routing cleared");
296  else if (!nFailures)
297  ROUTEDBG(GetDisplayName() << ": Routing already clear, nothing changed");
298  else
299  ROUTEFAIL(GetDisplayName() << ": " << DEC(nFailures) << " register write(s) failed");
300  return nFailures == 0;
301 
302 } // ClearRouting
303 
304 
306 {
307  outRouting.Reset ();
308 
309  // First, compile a set of NTV2WidgetIDs that are legit for this device...
310  NTV2WidgetIDSet validWidgets;
311  if (!CNTV2SignalRouter::GetWidgetIDs (GetDeviceID(), validWidgets))
312  return false;
313 
314  ROUTEDBG(GetDisplayName() << ": '" << ::NTV2DeviceIDToString(GetDeviceID()) << "' has " << validWidgets.size() << " widgets: " << validWidgets);
315 
316  // Inspect every input of every widget...
317  for (NTV2WidgetIDSetConstIter pWidgetID (validWidgets.begin ()); pWidgetID != validWidgets.end (); ++pWidgetID)
318  {
319  const NTV2WidgetID curWidgetID (*pWidgetID);
320  NTV2InputXptIDSet inputs;
321 
322  CNTV2SignalRouter::GetWidgetInputs (curWidgetID, inputs);
323  ROUTEDBG(GetDisplayName() << ": " << ::NTV2WidgetIDToString(curWidgetID) << " (" << ::NTV2WidgetIDToString(curWidgetID, true) << ") has " << inputs.size() << " input(s): " << inputs);
324 
325  for (NTV2InputCrosspointIDSetConstIter pInputID (inputs.begin ()); pInputID != inputs.end (); ++pInputID)
326  {
328  if (!GetConnectedOutput (*pInputID, outputID))
329  ROUTEDBG(GetDisplayName() << ": 'GetConnectedOutput' failed for input " << ::NTV2InputCrosspointIDToString(*pInputID) << " (" << ::NTV2InputCrosspointIDToString(*pInputID, true) << ")");
330  else if (outputID == NTV2_XptBlack)
331  ROUTEDBG(GetDisplayName() << ": 'GetConnectedOutput' returned XptBlack for input '" << ::NTV2InputCrosspointIDToString(*pInputID, true) << "' (" << ::NTV2InputCrosspointIDToString(*pInputID, false) << ")");
332  else
333  {
334  outRouting.AddConnection (*pInputID, outputID); // Record this connection...
335  ROUTEDBG(GetDisplayName() << ": Connection found -- from input '" << ::NTV2InputCrosspointIDToString(*pInputID, true) << "' (" << ::NTV2InputCrosspointIDToString(*pInputID, false)
336  << ") <== to output '" << ::NTV2OutputCrosspointIDToString(outputID, true) << "' (" << ::NTV2OutputCrosspointIDToString(outputID, false) << ")");
337  }
338  } // for each input
339  } // for each valid widget
340  ROUTEDBG(GetDisplayName() << ": Returning " << outRouting);
341  return true;
342 
343 } // GetRouting
344 
346 {
347  outConnections.clear();
348  NTV2RegisterReads regInfos;
349  NTV2InputCrosspointIDSet inputXpts;
350  return CNTV2SignalRouter::GetAllWidgetInputs (_boardID, inputXpts)
351  && CNTV2SignalRouter::GetAllRoutingRegInfos (inputXpts, regInfos)
352  && ReadRegisters(regInfos)
353  && CNTV2SignalRouter::GetConnectionsFromRegs (inputXpts, regInfos, outConnections);
354 }
355 
356 
357 typedef deque <NTV2InputCrosspointID> NTV2InputCrosspointQueue;
358 typedef NTV2InputCrosspointQueue::const_iterator NTV2InputCrosspointQueueConstIter;
359 typedef NTV2InputCrosspointQueue::iterator NTV2InputCrosspointQueueIter;
360 
361 
363 {
364  NTV2InputCrosspointQueue inputXptQueue; // List of inputs to trace backward from
367  outRouting.Reset();
368 
369  if (IS_CHANNEL_INVALID(inChannel))
370  return false;
371 
372  // Seed the input crosspoint queue...
373  inputXptQueue.push_back(SDIOutInputs[inChannel]);
374  const ULWordSet wgtIDs (GetSupportedItems(kNTV2EnumsID_WidgetID));
375 
376  // Process all queued inputs...
377  while (!inputXptQueue.empty())
378  {
379  NTV2InputCrosspointID inputXpt (inputXptQueue.front());
382  NTV2InputCrosspointIDSet inputXpts;
383 
384  inputXptQueue.pop_front();
385 
386  if (inputXpt == NTV2_INPUT_CROSSPOINT_INVALID)
387  continue;
388 
389  // Find out what this input is connected to...
390  if (!GetConnectedOutput (inputXpt, outputXpt))
391  continue; // Keep processing input crosspoints, even if this fails
392 
393  if (outputXpt != NTV2_XptBlack)
394  {
395  // Make a note of this connection...
396  outRouting.AddConnection (inputXpt, outputXpt);
397 
398  // Find out what widget this output belongs to...
399  CNTV2SignalRouter::GetWidgetForOutput (outputXpt, widgetID);
400  if (!NTV2_IS_VALID_WIDGET(widgetID))
401  continue; // Keep processing input crosspoints, even if no such widget
402  if (wgtIDs.find(widgetID) == wgtIDs.end()) // widget not present?
403  continue; // Keep processing input crosspoints, even if no such widget on this device
404 
405  // Add every input of the output's widget to the queue...
406  CNTV2SignalRouter::GetWidgetInputs (widgetID, inputXpts);
407  for (NTV2InputCrosspointIDSetConstIter it (inputXpts.begin ()); it != inputXpts.end (); ++it)
408  inputXptQueue.push_back(*it);
409  } // if connected to something other than "black" output crosspoint
410  } // loop til inputXptQueue empty
411 
412  ROUTEDBG(GetDisplayName() << ": Channel " << DEC(inChannel+1) << " routing: " << outRouting);
413  return true;
414 
415 } // GetRoutingForChannel
NTV2InputCrosspointQueueConstIter
NTV2InputCrosspointQueue::const_iterator NTV2InputCrosspointQueueConstIter
Definition: ntv2regroute.cpp:358
NTV2InputCrosspointQueue
deque< NTV2InputCrosspointID > NTV2InputCrosspointQueue
Definition: ntv2regroute.cpp:357
CNTV2RegisterExpert::GetCrosspointSelectGroupRegisterInfo
static bool GetCrosspointSelectGroupRegisterInfo(const NTV2InputCrosspointID inInputXpt, uint32_t &outXptRegNum, uint32_t &outMaskIndex)
Answers with the crosspoint select register and mask information for a given widget input.
Definition: ntv2registerexpert.cpp:4719
CNTV2Card::GetConnections
virtual bool GetConnections(NTV2XptConnections &outConnections)
Answers with the device's current widget routing connections.
Definition: ntv2regroute.cpp:345
ROUTENOTE
#define ROUTENOTE(__x__)
Definition: ntv2regroute.cpp:21
NTV2RegNumSetConstIter
ULWordSetConstIter NTV2RegNumSetConstIter
A const iterator that iterates over a set of distinct NTV2RegisterNumbers.
Definition: ntv2publicinterface.h:7416
NTV2InputCrosspointIDSet
std::set< NTV2InputXptID > NTV2InputCrosspointIDSet
Definition: ntv2signalrouter.h:26
NTV2InputXptIDSet
std::set< NTV2InputXptID > NTV2InputXptIDSet
A collection of distinct NTV2InputXptID values.
Definition: ntv2signalrouter.h:26
kDeviceHasXptConnectROM
@ kDeviceHasXptConnectROM
True if device has a crosspoint connection ROM (New in SDK 17.0)
Definition: ntv2devicefeatures.h:146
NTV2XptConnectionsConstIter
NTV2XptConnections::const_iterator NTV2XptConnectionsConstIter
Definition: ntv2signalrouter.h:40
NTV2Channel
NTV2Channel
These enum values are mostly used to identify a specific widget_framestore. They're also commonly use...
Definition: ntv2enums.h:1334
sShifts
static const ULWord sShifts[]
Definition: ntv2regroute.cpp:27
NTV2InputCrosspointQueueIter
NTV2InputCrosspointQueue::iterator NTV2InputCrosspointQueueIter
Definition: ntv2regroute.cpp:359
NTV2_FIRST_INPUT_CROSSPOINT
@ NTV2_FIRST_INPUT_CROSSPOINT
Definition: ntv2enums.h:2723
CNTV2SignalRouter::GetConnectionsFromRegs
static bool GetConnectionsFromRegs(const NTV2InputXptIDSet &inInputXptIDs, const NTV2RegisterReads &inRegValues, NTV2XptConnections &outConnections)
Converts a set of crosspoint registers into a set of crosspoint connections.
Definition: ntv2signalrouter.cpp:605
CNTV2SignalRouter::GetRegisterWrites
virtual bool GetRegisterWrites(NTV2RegisterWrites &outRegWrites) const
Returns a sequence of NTV2RegInfo values that can be written to an NTV2 device using its WriteRegiste...
Definition: ntv2signalrouter.cpp:132
sMasks
static const ULWord sMasks[]
Definition: ntv2regroute.cpp:26
CNTV2Card::IsConnected
virtual bool IsConnected(const NTV2InputCrosspointID inInputXpt, bool &outIsConnected)
Answers whether or not the given widget signal input (sink) is connected to another output (source).
Definition: ntv2regroute.cpp:181
CNTV2Card::ClearRouting
virtual bool ClearRouting(void)
Removes all existing signal path connections between any and all widgets on the AJA device.
Definition: ntv2regroute.cpp:278
NTV2_WIDGET_INVALID
@ NTV2_WIDGET_INVALID
Definition: ntv2enums.h:2999
NTV2_XptSDIOut7Input
@ NTV2_XptSDIOut7Input
Definition: ntv2enums.h:2780
CNTV2Card::ApplySignalRoute
virtual bool ApplySignalRoute(const CNTV2SignalRouter &inRouter, const bool inReplace=(0))
Applies the given routing table to the AJA device.
Definition: ntv2regroute.cpp:242
NTV2InputXptID
enum NTV2InputCrosspointID NTV2InputXptID
NTV2_OUTPUT_CROSSPOINT_INVALID
@ NTV2_OUTPUT_CROSSPOINT_INVALID
Definition: ntv2enums.h:2687
NTV2_XptSDIOut4Input
@ NTV2_XptSDIOut4Input
Definition: ntv2enums.h:2774
CNTV2SignalRouter::GetAllRoutingRegInfos
static bool GetAllRoutingRegInfos(const NTV2InputXptIDSet &inInputs, NTV2RegisterWrites &outRegInfos)
Returns all routing registers for the given set of input crosspoints.
Definition: ntv2signalrouter.cpp:473
ROUTEWARN
#define ROUTEWARN(__x__)
Definition: ntv2regroute.cpp:20
NTV2RegNumSet
NTV2RegisterNumberSet NTV2RegNumSet
A set of distinct NTV2RegisterNumbers.
Definition: ntv2publicinterface.h:7415
CNTV2DriverInterface::ReadRegister
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....
Definition: ntv2driverinterface.cpp:429
NTV2WidgetIDSetConstIter
NTV2WidgetIDSet::const_iterator NTV2WidgetIDSetConstIter
An iterator for iterating over a read-only NTV2WidgetIDSet.
Definition: ntv2signalrouter.h:33
ROUTEFAIL
#define ROUTEFAIL(__x__)
Definition: ntv2regroute.cpp:19
ULWordSet
std::set< ULWord > ULWordSet
A collection of unique ULWord (uint32_t) values.
Definition: ntv2publicinterface.h:54
CNTV2SignalRouter::GetRouteROMInfoFromReg
static bool GetRouteROMInfoFromReg(const ULWord inROMRegNum, const ULWord inROMRegValue, NTV2InputXptID &outInputXpt, NTV2OutputXptIDSet &outOutputXpts, const bool inAppendOutputXpts=false)
Answers with the NTV2InputXptID and NTV2OutputXptIDSet for the given ROM register value.
Definition: ntv2signalrouter.cpp:1029
ULWord
uint32_t ULWord
Definition: ajatypes.h:255
NTV2_XptSDIOut2Input
@ NTV2_XptSDIOut2Input
Definition: ntv2enums.h:2770
NTV2DeviceIDToString
std::string NTV2DeviceIDToString(const NTV2DeviceID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:4673
ntv2card.h
Declares the CNTV2Card class.
CNTV2Card::IsConnectedTo
virtual bool IsConnectedTo(const NTV2InputCrosspointID inInputXpt, const NTV2OutputCrosspointID inOutputXpt, bool &outIsConnected)
Answers whether or not the given widget signal input (sink) is connected to another output (source).
Definition: ntv2regroute.cpp:168
kDeviceGetMaxRegisterNumber
@ kDeviceGetMaxRegisterNumber
The highest register number for the device.
Definition: ntv2devicefeatures.h:175
NTV2InputCrosspointIDToString
std::string NTV2InputCrosspointIDToString(const NTV2InputCrosspointID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:5874
UWord
uint16_t UWord
Definition: ajatypes.h:253
NTV2RegisterReads
NTV2RegWrites NTV2RegisterReads
Definition: ntv2publicinterface.h:4014
ntv2utils.h
Declares numerous NTV2 utility functions.
CNTV2Card::Disconnect
virtual bool Disconnect(const NTV2InputCrosspointID inInputXpt)
Disconnects the given widget signal input (sink) from whatever output (source) it may be connected.
Definition: ntv2regroute.cpp:134
NTV2InputCrosspointID
NTV2InputCrosspointID
Identifies a widget input that potentially can accept a signal emitted from another widget's output (...
Definition: ntv2enums.h:2721
kRegClass_Routing
#define kRegClass_Routing
Definition: ntv2registerexpert.h:64
NTV2InputCrosspointIDSetConstIter
NTV2InputXptIDSet::const_iterator NTV2InputCrosspointIDSetConstIter
Definition: ntv2signalrouter.h:27
NTV2OutputXptIDSet
std::set< NTV2OutputXptID > NTV2OutputXptIDSet
A collection of distinct NTV2OutputXptID values.
Definition: ntv2signalrouter.h:18
NTV2WidgetID
NTV2WidgetID
Definition: ntv2enums.h:2878
CNTV2Card::CanConnect
virtual bool CanConnect(const NTV2InputCrosspointID inInputXpt, const NTV2OutputCrosspointID inOutputXpt, bool &outCanConnect)
Answers whether or not the given widget signal input (sink) can legally be connected to the given sig...
Definition: ntv2regroute.cpp:192
ROUTEDBG
#define ROUTEDBG(__x__)
Definition: ntv2regroute.cpp:23
CNTV2SignalRouter
This class is a collection of widget input-to-output connections that can be applied all-at-once to a...
Definition: ntv2signalrouter.h:55
kNTV2EnumsID_WidgetID
@ kNTV2EnumsID_WidgetID
Identifies the NTV2AudioWidgetID enumerated type.
Definition: ntv2devicefeatures.h:247
NTV2_IS_VALID_OutputCrosspointID
#define NTV2_IS_VALID_OutputCrosspointID(__s__)
Definition: ntv2enums.h:2712
NTV2_XptBlack
@ NTV2_XptBlack
Definition: ntv2enums.h:2505
NTV2_INPUT_CROSSPOINT_INVALID
@ NTV2_INPUT_CROSSPOINT_INVALID
Definition: ntv2enums.h:2858
NTV2_XptSDIOut5Input
@ NTV2_XptSDIOut5Input
Definition: ntv2enums.h:2776
CNTV2Card::RemoveConnections
virtual bool RemoveConnections(const NTV2XptConnections &inConnections)
Removes the given widget routing connections from the AJA device.
Definition: ntv2regroute.cpp:268
CNTV2Card::GetConnectedInputs
virtual bool GetConnectedInputs(const NTV2OutputCrosspointID inOutputXpt, NTV2InputCrosspointIDSet &outInputXpts)
Answers with all of the NTV2InputCrosspointIDs that are connected to the given NTV2OutputCrosspointID...
Definition: ntv2regroute.cpp:67
CNTV2SignalRouter::GetWidgetIDs
static bool GetWidgetIDs(const NTV2DeviceID inDeviceID, NTV2WidgetIDSet &outWidgets)
Returns the widget IDs supported by the given device.
Definition: ntv2signalrouter.cpp:379
CNTV2SignalRouter::GetAllWidgetInputs
static bool GetAllWidgetInputs(const NTV2DeviceID inDeviceID, NTV2InputXptIDSet &outInputs)
Returns all known widget input crosspoints for the given device.
Definition: ntv2signalrouter.cpp:456
NTV2OutputCrosspointID
NTV2OutputCrosspointID
Identifies a widget output, a signal source, that potentially can drive another widget's input (ident...
Definition: ntv2enums.h:2502
NTV2_XptSDIOut8Input
@ NTV2_XptSDIOut8Input
Definition: ntv2enums.h:2782
CNTV2Card::GetRouting
virtual bool GetRouting(CNTV2SignalRouter &outRouting)
Answers with the current signal routing between any and all widgets on the AJA device.
Definition: ntv2regroute.cpp:305
CNTV2Card::Connect
virtual bool Connect(const NTV2InputCrosspointID inInputXpt, const NTV2OutputCrosspointID inOutputXpt, const bool inValidate=(0))
Connects the given widget signal input (sink) to the given widget signal output (source).
Definition: ntv2regroute.cpp:87
CNTV2RegisterExpert::GetRegistersForClass
static NTV2RegNumSet GetRegistersForClass(const std::string &inClassName)
Definition: ntv2registerexpert.cpp:4684
CNTV2SignalRouter::GetWidgetForOutput
static bool GetWidgetForOutput(const NTV2OutputXptID inOutputXpt, NTV2WidgetID &outWidgetID, const NTV2DeviceID inDeviceID=DEVICE_ID_NOTFOUND)
Returns the widget that "owns" the specified output crosspoint.
Definition: ntv2signalrouter.cpp:426
DEC
#define DEC(__x__)
Definition: ntv2publicinterface.h:5606
NTV2RegisterWrites
std::vector< NTV2RegInfo > NTV2RegisterWrites
Definition: ntv2publicinterface.h:4011
NTV2XptConnections
std::map< NTV2InputXptID, NTV2OutputXptID > NTV2XptConnections
Definition: ntv2signalrouter.h:39
std
Definition: json.hpp:5362
NTV2_LAST_INPUT_CROSSPOINT
@ NTV2_LAST_INPUT_CROSSPOINT
Definition: ntv2enums.h:2857
kRegFirstValidXptROMRegister
@ kRegFirstValidXptROMRegister
Definition: ntv2publicinterface.h:845
NTV2_XptSDIOut6Input
@ NTV2_XptSDIOut6Input
Definition: ntv2enums.h:2778
LOGGING_ROUTING_CHANGES
#define LOGGING_ROUTING_CHANGES
Definition: ntv2regroute.cpp:18
CNTV2SignalRouter::GetWidgetInputs
static bool GetWidgetInputs(const NTV2WidgetID inWidgetID, NTV2InputXptIDSet &outInputs)
Returns the input crosspoints known to be "owned" by the given widget.
Definition: ntv2signalrouter.cpp:448
NTV2_LAST_OUTPUT_CROSSPOINT
@ NTV2_LAST_OUTPUT_CROSSPOINT
Definition: ntv2enums.h:2686
NTV2OutputXptID
enum NTV2OutputCrosspointID NTV2OutputXptID
NTV2_IS_VALID_WIDGET
#define NTV2_IS_VALID_WIDGET(__w__)
Definition: ntv2enums.h:3002
NTV2OutputCrosspointIDToString
std::string NTV2OutputCrosspointIDToString(const NTV2OutputCrosspointID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:6017
xHEX0N
#define xHEX0N(__x__, __n__)
Definition: ntv2publicinterface.h:5605
CNTV2Card::GetRoutingForChannel
virtual bool GetRoutingForChannel(const NTV2Channel inChannel, CNTV2SignalRouter &outRouting)
Answers with the current signal routing for the given channel.
Definition: ntv2regroute.cpp:362
CNTV2SignalRouter::Reset
virtual void Reset(void)
Resets me, erasing any/all existing connections.
Definition: ntv2signalrouter.h:108
ntv2registerexpert.h
Declares the CNTV2RegisterExpert class.
NTV2WidgetIDToString
std::string NTV2WidgetIDToString(const NTV2WidgetID inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6222
CNTV2SignalRouter::AddConnection
virtual bool AddConnection(const NTV2InputXptID inSignalInput, const NTV2OutputXptID inSignalOutput=NTV2_XptBlack)
Adds a connection between a widget's signal input (sink) and another widget's signal output (source).
Definition: ntv2signalrouter.cpp:62
NTV2_XptSDIOut1Input
@ NTV2_XptSDIOut1Input
Definition: ntv2enums.h:2768
NTV2WidgetIDSet
std::set< NTV2WidgetID > NTV2WidgetIDSet
A collection of distinct NTV2WidgetID values.
Definition: ntv2signalrouter.h:32
debug.h
Declares the AJADebug class.
NTV2_XptSDIOut3Input
@ NTV2_XptSDIOut3Input
Definition: ntv2enums.h:2772
CNTV2Card::GetConnectedOutput
virtual bool GetConnectedOutput(const NTV2InputCrosspointID inInputXpt, NTV2OutputCrosspointID &outOutputXpt)
Answers with the currently connected NTV2OutputCrosspointID for the given NTV2InputCrosspointID.
Definition: ntv2regroute.cpp:29
CNTV2Card::GetConnectedInput
virtual bool GetConnectedInput(const NTV2OutputCrosspointID inOutputXpt, NTV2InputCrosspointID &outInputXpt)
Answers with a connected NTV2InputCrosspointID for the given NTV2OutputCrosspointID.
Definition: ntv2regroute.cpp:51
ROUTEINFO
#define ROUTEINFO(__x__)
Definition: ntv2regroute.cpp:22