MythTV  master
cardutil.h
Go to the documentation of this file.
1 // -*- Mode: c++ -*-
2 #ifndef CARDUTIL_H
3 #define CARDUTIL_H
4 
5 // C++ headers
6 #include <chrono>
7 #include <cstdint>
8 #include <vector>
9 
10 // Qt headers
11 #include <QList>
12 #include <QStringList>
13 #include <QMap>
14 #include <QMetaEnum>
15 
16 // MythTV headers
17 #include "mythtvexp.h"
18 #include "dtvconfparserhelpers.h"
19 
20 class InputInfo;
21 class CardInput;
22 using InputNames = QMap<int,QString>;
23 
24 MTV_PUBLIC QString get_on_input(const QString &to_get, uint inputid);
25 
26 MTV_PUBLIC bool set_on_input(const QString &to_set, uint inputid, const QString &value);
27 
28 enum dvb_dev_type_t : std::uint8_t
29 {
36 };
37 
41 class MTV_PUBLIC CardUtil : public QObject
42 {
43  Q_OBJECT
44 
45  public:
46  using InputTypes = QMap<QString, QString>;
47 
49  enum class INPUT_TYPES : std::uint8_t
50  {
51  ERROR_OPEN = 0,
52  ERROR_UNKNOWN = 1,
53  ERROR_PROBE = 2,
54  QPSK = 3, DVBS = 3,
55  QAM = 4, DVBC = 4,
56  OFDM = 5, DVBT = 5,
57  ATSC = 6,
58  V4L = 7,
59  MPEG = 8,
60  FIREWIRE = 9,
61  HDHOMERUN = 10,
62  FREEBOX = 11,
63  HDPVR = 12,
64  DVBS2 = 13,
65  IMPORT = 14,
66  DEMO = 15,
67  ASI = 16,
68  CETON = 17,
69  EXTERNAL = 18,
70  VBOX = 19,
71  DVBT2 = 20,
72  V4L2ENC = 21,
73  SATIP = 22
74  };
75 
76  Q_ENUM(INPUT_TYPES)
77 
78  static INPUT_TYPES toInputType(const QString &name)
79  {
80  if ("ERROR_OPEN" == name)
81  return INPUT_TYPES::ERROR_OPEN;
82  if ("ERROR_UNKNOWN" == name)
83  return INPUT_TYPES::ERROR_UNKNOWN;
84  if ("ERROR_PROBE" == name)
85  return INPUT_TYPES::ERROR_PROBE;
86  if ("QPSK" == name)
87  return INPUT_TYPES::QPSK;
88  if ("DVBS" == name)
89  return INPUT_TYPES::DVBS;
90  if ("QAM" == name)
91  return INPUT_TYPES::QAM;
92  if ("DVBC" == name)
93  return INPUT_TYPES::DVBC;
94  if ("OFDM" == name)
95  return INPUT_TYPES::OFDM;
96  if ("DVBT" == name)
97  return INPUT_TYPES::DVBT;
98  if ("ATSC" == name)
99  return INPUT_TYPES::ATSC;
100  if ("V4L" == name)
101  return INPUT_TYPES::V4L;
102  if ("MPEG" == name)
103  return INPUT_TYPES::MPEG;
104  if ("FIREWIRE" == name)
105  return INPUT_TYPES::FIREWIRE;
106  if ("HDHOMERUN" == name)
107  return INPUT_TYPES::HDHOMERUN;
108  if ("FREEBOX" == name)
109  return INPUT_TYPES::FREEBOX;
110  if ("HDPVR" == name)
111  return INPUT_TYPES::HDPVR;
112  if ("DVB_S2" == name)
113  return INPUT_TYPES::DVBS2;
114  if ("IMPORT" == name)
115  return INPUT_TYPES::IMPORT;
116  if ("DEMO" == name)
117  return INPUT_TYPES::DEMO;
118  if ("ASI" == name)
119  return INPUT_TYPES::ASI;
120  if ("CETON" == name)
121  return INPUT_TYPES::CETON;
122  if ("EXTERNAL" == name)
123  return INPUT_TYPES::EXTERNAL;
124  if ("VBOX" == name)
125  return INPUT_TYPES::VBOX;
126  if ("DVB_T2" == name)
127  return INPUT_TYPES::DVBT2;
128  if ("V4L2ENC" == name)
129  return INPUT_TYPES::V4L2ENC;
130  if ("SATIP" == name)
131  return INPUT_TYPES::SATIP;
132  return INPUT_TYPES::ERROR_UNKNOWN;
133  }
134 
135  static bool IsEncoder(const QString &rawtype)
136  {
137  return
138  (rawtype != "DVB") && (rawtype != "FIREWIRE") &&
139  (rawtype != "HDHOMERUN") && (rawtype != "FREEBOX") &&
140  (rawtype != "IMPORT") && (rawtype != "DEMO") &&
141  (rawtype != "ASI") && (rawtype != "CETON") &&
142  (rawtype != "VBOX") && (rawtype != "SATIP");
143  }
144 
145  static bool IsV4L(const QString &rawtype)
146  {
147  return (rawtype == "V4L" || rawtype == "MPEG" ||
148  rawtype == "HDPVR" || rawtype == "GO7007" ||
149  rawtype == "MJPEG" || rawtype == "V4L2ENC");
150  }
151 
152  static bool IsChannelChangeDiscontinuous(const QString &rawtype)
153  {
154  return (!IsEncoder(rawtype) || rawtype == "HDPVR" ||
155  rawtype == "EXTERNAL");
156  }
157 
158  static bool IsUnscanable(const QString &rawtype)
159  {
160  return
161  (rawtype == "FIREWIRE") || (rawtype == "HDPVR") ||
162  (rawtype == "IMPORT") || (rawtype == "DEMO") ||
163  (rawtype == "GO7007") || (rawtype == "MJPEG");
164  }
165  static QString GetScanableInputTypes(void);
166 
167  static bool IsCableCardPresent(uint inputid,
168  const QString &inputType);
169 
170  static bool IsEITCapable(const QString &rawtype)
171  {
172  return
173  (rawtype == "DVB") || (rawtype == "HDHOMERUN") ||
174  (rawtype == "SATIP");
175  }
176 
177  static bool IsTunerSharingCapable(const QString &rawtype)
178  {
179  return
180  (rawtype == "DVB") || (rawtype == "HDHOMERUN") ||
181  (rawtype == "ASI") || (rawtype == "FREEBOX") ||
182  (rawtype == "CETON") || (rawtype == "EXTERNAL") ||
183  (rawtype == "VBOX") || (rawtype == "V4L2ENC") ||
184  (rawtype == "SATIP");
185  }
186 
187  static bool HasTuner(const QString &rawtype, const QString & device);
188  static bool IsTunerShared(uint inputidA, uint inputidB);
189 
190  static bool IsTuningDigital(const QString &rawtype)
191  {
192  return
193  (rawtype == "DVB") || (rawtype == "HDHOMERUN") ||
194  (rawtype == "ASI") || (rawtype == "CETON") ||
195  (rawtype == "EXTERNAL") || (rawtype == "SATIP");
196  }
197 
198  static bool IsTuningAnalog(const QString &rawtype)
199  {
200  return
201  (rawtype == "V4L") || (rawtype == "V4L2ENC" ||
202  rawtype == "MPEG");
203  }
204 
205  static bool IsTuningVirtual(const QString &rawtype)
206  {
207  return
208  (rawtype == "FIREWIRE") || (rawtype == "HDPVR") ||
209  (rawtype == "EXTERNAL") || (rawtype == "V4L2ENC");
210  }
211 
212  static bool IsSingleInputType(const QString &rawtype)
213  {
214  return
215  (rawtype == "FIREWIRE") || (rawtype == "HDHOMERUN") ||
216  (rawtype == "FREEBOX") || (rawtype == "ASI") ||
217  (rawtype == "IMPORT") || (rawtype == "DEMO") ||
218  (rawtype == "CETON") || (rawtype == "EXTERNAL") ||
219  (rawtype == "VBOX") || (rawtype == "SATIP");
220  }
221 
222  static bool IsChannelReusable(const QString &rawtype)
223  {
224  return !(rawtype == "FREEBOX" || rawtype == "VBOX");
225  }
226 
227 #ifdef USING_VBOX
228  static bool IsVBoxPresent(uint inputid);
229 #endif
230 #ifdef USING_SATIP
231  static bool IsSatIPPresent(uint inputid);
232 #endif
233 
234  // Card creation and deletion
235 
236  static int CreateCaptureCard(const QString &videodevice,
237  const QString &audiodevice,
238  const QString &vbidevice,
239  const QString &inputtype,
240  uint audioratelimit,
241  const QString &hostname,
242  uint dvb_swfilter,
243  uint dvb_sat_type,
244  bool dvb_wait_for_seqstart,
245  bool skipbtaudio,
246  bool dvb_on_demand,
247  uint dvb_diseqc_type,
248  uint firewire_speed,
249  const QString &firewire_model,
250  uint firewire_connection,
251  std::chrono::milliseconds signal_timeout,
252  std::chrono::milliseconds channel_timeout,
253  uint dvb_tuning_delay,
254  uint contrast,
255  uint brightness,
256  uint colour,
257  uint hue,
258  uint diseqcid,
259  bool dvb_eitscan);
260 
261  static bool DeleteInput(uint inputid);
262  static bool DeleteAllInputs(void);
263  static std::vector<uint> GetInputList(void);
264  static std::vector<uint> GetSchedInputList(void);
265  static std::vector<uint> GetLiveTVInputList(void);
266 
268  static uint GetFirstInputID(const QString &videodevice)
269  {
270  std::vector<uint> list = GetInputIDs(videodevice);
271  if (list.empty())
272  return 0;
273  return list[0];
274  }
275 
276  static std::vector<uint> GetInputIDs(const QString& videodevice = QString(),
277  const QString& rawtype = QString(),
278  const QString& inputname = QString(),
279  QString hostname = QString());
280 
281  static uint GetChildInputCount(uint inputid);
282  static std::vector<uint> GetChildInputIDs(uint inputid);
283 
284  static bool IsInputTypePresent(const QString &rawtype,
285  QString hostname = QString());
286  static InputTypes GetInputTypes(void); // input types on ALL hosts
287  static QStringList GetInputTypeNames(uint sourceid); // input types for a given source id
288 
289  static QStringList GetVideoDevices(const QString &rawtype,
290  QString hostname = QString());
291 
292  static QString GetRawInputType(uint inputid)
293  { return get_on_input("cardtype", inputid).toUpper(); }
294  static QString GetVideoDevice(uint inputid)
295  { return get_on_input("videodevice", inputid); }
296  static QString GetAudioDevice(uint inputid)
297  { return get_on_input("audiodevice", inputid); }
298  static QString GetVBIDevice(uint inputid)
299  { return get_on_input("vbidevice", inputid); }
300  static QString GetDeliverySystemFromDB(uint inputid)
301  { return get_on_input("inputname", inputid); } // use capturecard/inputname for now
302  static QString GetDiSEqCPosition(uint inputid)
303  { return get_on_input("dvb_diseqc_type", inputid); } // use capturecard/dvb_diseqc_type for now
304 
305  static QString GetHostname(uint inputid)
306  { return get_on_input("hostname", inputid); }
307 
308  static int GetValueInt(const QString &col, uint inputid)
309  { return get_on_input(col, inputid).toInt(); }
310  static bool SetValue(const QString &col, uint inputid,
311  int val)
312  { return set_on_input(col, inputid, QString::number(val)); }
313  static bool SetValue(const QString &col, uint inputid,
314  const QString &val)
315  { return set_on_input(col, inputid, val); }
316 
317  static bool SetStartChannel(uint inputid,
318  const QString &channum);
319 
320  // Input creation and deletion
321  static int CreateCardInput(uint inputid,
322  uint sourceid,
323  const QString &inputname,
324  const QString &externalcommand,
325  const QString &changer_device,
326  const QString &changer_model,
327  const QString &hostname,
328  const QString &tunechan,
329  const QString &startchan,
330  const QString &displayname,
331  bool dishnet_eit,
332  uint recpriority,
333  uint quicktune,
334  uint schedorder,
335  uint livetvorder);
336 
337  // Other input functions
338 
339  static std::vector<uint> GetInputIDs(uint sourceid);
340  static bool GetInputInfo(InputInfo &input,
341  std::vector<uint> *groupids = nullptr);
342  static QList<InputInfo> GetAllInputInfo(bool virtTuners);
343  static QString GetInputName(uint inputid);
344  static QString GetStartChannel(uint inputid);
345  static QString GetDisplayName(uint inputid);
346  static bool IsUniqueDisplayName(const QString &name,
347  uint exclude_inputid);
348  static uint GetSourceID(uint inputid);
349 
350  // Input Groups
351  static uint CreateInputGroup(const QString &name);
352  static uint CreateDeviceInputGroup(uint inputid,
353  const QString &type,
354  const QString &host,
355  const QString &device);
356  static uint GetDeviceInputGroup(uint inputid);
357  static bool LinkInputGroup(uint inputid, uint inputgroupid);
358  static bool UnlinkInputGroup(uint inputid, uint inputgroupid);
359  static std::vector<uint> GetInputGroups(uint inputid);
360  static std::vector<uint> GetGroupInputIDs(uint inputgroupid);
361  static std::vector<uint> GetConflictingInputs(uint inputid);
362 
363  static QString GetDeviceLabel(const QString &inputtype,
364  const QString &videodevice);
365  static QString GetDeviceLabel(uint inputid);
366 
367  static QString ProbeSubTypeName(uint inputid);
368 
369  static QStringList ProbeVideoInputs(const QString& device,
370  const QString& inputtype = QString());
371  static QStringList ProbeAudioInputs(const QString& device,
372  const QString& inputtype = QString());
373  static void GetDeviceInputNames(const QString &device,
374  const QString &inputtype,
375  QStringList &inputs);
376 
377  // General info from OS
378  static QStringList ProbeVideoDevices(const QString &rawtype);
379  static void ClearVideoDeviceCache();
380 
381  // Other
382  static uint CloneCard(uint src_inputid, uint dst_inputid);
383  static bool InputSetMaxRecordings(uint parentid,
384  uint max_recordings);
385  static uint AddChildInput(uint parentid);
386  static QString GetFirewireChangerNode(uint inputid);
387  static QString GetFirewireChangerModel(uint inputid);
388 
389  // DTV info
390  static bool GetTimeouts(uint inputid,
391  std::chrono::milliseconds &signal_timeout,
392  std::chrono::milliseconds &channel_timeout);
393  static bool IgnoreEncrypted(uint inputid,
394  const QString &inputname);
395  static bool TVOnly(uint inputid, const QString &inputname);
396  static bool IsInNeedOfExternalInputConf(uint inputid);
397  static uint GetQuickTuning(uint inputid, const QString &input_name);
398 
399  // DVB info
401  static bool IsDVB(uint inputid)
402  { return "DVB" == GetRawInputType(inputid); }
403  static bool IsDVBInputType(const QString &inputType);
404  static QStringList ProbeDeliverySystems(const QString &device);
405  static QStringList ProbeDeliverySystems(int fd_frontend);
406  static QString ProbeDefaultDeliverySystem(const QString &device);
407  static QString ProbeDVBType(const QString &device);
408  static QString ProbeDVBFrontendName(const QString &device);
409  static bool HasDVBCRCBug(const QString &device);
410  static std::chrono::milliseconds GetMinSignalMonitoringDelay(const QString &device);
411  static DTVTunerType ConvertToTunerType(DTVModulationSystem delsys);
412  static DTVTunerType GetTunerType(uint inputid);
413  static DTVTunerType ProbeTunerType(int fd_frontend);
414  static DTVTunerType ProbeTunerType(const QString &device);
415  static DTVTunerType GetTunerTypeFromMultiplex(uint mplexid);
416  static DTVModulationSystem GetDeliverySystem(uint inputid);
417  static DTVModulationSystem ProbeCurrentDeliverySystem(const QString &device);
418  static DTVModulationSystem ProbeCurrentDeliverySystem(int fd_frontend);
419  static DTVModulationSystem ProbeBestDeliverySystem(int fd);
420  static DTVModulationSystem GetOrProbeDeliverySystem(uint inputid, int fd);
421  static int SetDefaultDeliverySystem(uint inputid, int fd);
422  static int SetDeliverySystem(uint inputid);
423  static int SetDeliverySystem(uint inputid, DTVModulationSystem delsys);
424  static int SetDeliverySystem(uint inputid, int fd);
425  static int SetDeliverySystem(uint inputid, DTVModulationSystem delsys, int fd);
426  static int OpenVideoDevice(int inputid);
427  static int OpenVideoDevice(const QString &device);
428  static QString GetDeviceName(dvb_dev_type_t type, const QString &device);
429  static InputNames GetConfiguredDVBInputs(const QString &device);
430  static QStringList CapabilitiesToString(uint64_t capabilities);
431 
432  // V4L info
433  static bool hasV4L2(int videofd);
434  static bool GetV4LInfo(int videofd, QString &input, QString &driver,
435  uint32_t &version, uint32_t &capabilities);
436  static bool GetV4LInfo(int videofd, QString &input, QString &driver)
437  {
438  uint32_t d1 = 0;
439  uint32_t d2 = 0;
440  return GetV4LInfo(videofd, input, driver, d1, d2);
441  }
442  static InputNames ProbeV4LVideoInputs(int videofd, bool &ok);
443  static InputNames ProbeV4LAudioInputs(int videofd, bool &ok);
444 
445  // HDHomeRun info
446  static bool HDHRdoesDVB(const QString &device);
447  static bool HDHRdoesDVBC(const QString &device);
448  static QString GetHDHRdesc(const QString &device);
449 
450  // VBox info
451  static QString GetVBoxdesc(const QString &id, const QString &ip,
452  const QString &tunerNo, const QString &tunerType);
453 
454  // ASI info
455  static int GetASIDeviceNumber(const QString &device,
456  QString *error = nullptr);
457 
458  static uint GetASIBufferSize(uint device_num,
459  QString *error = nullptr);
460  static uint GetASINumBuffers(uint device_num,
461  QString *error = nullptr);
462  static int GetASIMode(uint device_num,
463  QString *error = nullptr);
464  static bool SetASIMode(uint device_num, uint mode,
465  QString *error = nullptr);
466 
467  private:
468  static QStringList ProbeV4LVideoInputs(const QString& device);
469  static QStringList ProbeV4LAudioInputs(const QString& device);
470  static QStringList ProbeDVBInputs(const QString& device);
471  static QMap <QString,QStringList> s_videoDeviceCache;
472 };
473 
474 #endif //CARDUTIL_H
CardUtil::SetValue
static bool SetValue(const QString &col, uint inputid, const QString &val)
Definition: cardutil.h:313
CardUtil::s_videoDeviceCache
static QMap< QString, QStringList > s_videoDeviceCache
Definition: cardutil.h:471
DVB_DEV_AUDIO
@ DVB_DEV_AUDIO
Definition: cardutil.h:34
CardUtil::IsDVB
static bool IsDVB(uint inputid)
Returns true if the input is a DVB input.
Definition: cardutil.h:401
CardUtil::IsTuningVirtual
static bool IsTuningVirtual(const QString &rawtype)
Definition: cardutil.h:205
CardUtil::GetV4LInfo
static bool GetV4LInfo(int videofd, QString &input, QString &driver)
Definition: cardutil.h:436
mythtvexp.h
CardUtil::GetFirstInputID
static uint GetFirstInputID(const QString &videodevice)
Convenience function for GetInputIDs()
Definition: cardutil.h:268
DTVTunerType
Definition: dtvconfparserhelpers.h:76
CardUtil::IsTuningDigital
static bool IsTuningDigital(const QString &rawtype)
Definition: cardutil.h:190
CardUtil::SetValue
static bool SetValue(const QString &col, uint inputid, int val)
Definition: cardutil.h:310
CardUtil::IsChannelChangeDiscontinuous
static bool IsChannelChangeDiscontinuous(const QString &rawtype)
Definition: cardutil.h:152
CardUtil::IsEncoder
static bool IsEncoder(const QString &rawtype)
Definition: cardutil.h:135
CardUtil::IsSingleInputType
static bool IsSingleInputType(const QString &rawtype)
Definition: cardutil.h:212
CardUtil::GetAudioDevice
static QString GetAudioDevice(uint inputid)
Definition: cardutil.h:296
CardUtil::GetDeliverySystemFromDB
static QString GetDeliverySystemFromDB(uint inputid)
Definition: cardutil.h:300
CardUtil
Collection of helper utilities for input DB use.
Definition: cardutil.h:41
CardUtil::GetValueInt
static int GetValueInt(const QString &col, uint inputid)
Definition: cardutil.h:308
CardUtil::IsV4L
static bool IsV4L(const QString &rawtype)
Definition: cardutil.h:145
DVB_DEV_DEMUX
@ DVB_DEV_DEMUX
Definition: cardutil.h:32
hardwareprofile.smolt.error
def error(message)
Definition: smolt.py:409
set_on_input
MTV_PUBLIC bool set_on_input(const QString &to_set, uint inputid, const QString &value)
Definition: cardutil.cpp:1274
CardInput
Definition: videosource.h:889
MTV_PUBLIC
#define MTV_PUBLIC
Definition: mythtvexp.h:15
CardUtil::GetRawInputType
static QString GetRawInputType(uint inputid)
Definition: cardutil.h:292
DVB_DEV_CA
@ DVB_DEV_CA
Definition: cardutil.h:33
CardUtil::InputTypes
QMap< QString, QString > InputTypes
Definition: cardutil.h:46
DTVModulationSystem
Definition: dtvconfparserhelpers.h:644
dvb_dev_type_t
dvb_dev_type_t
Definition: cardutil.h:28
InputInfo
Definition: inputinfo.h:14
CardUtil::IsTunerSharingCapable
static bool IsTunerSharingCapable(const QString &rawtype)
Definition: cardutil.h:177
CardUtil::GetVBIDevice
static QString GetVBIDevice(uint inputid)
Definition: cardutil.h:298
InputNames
QMap< int, QString > InputNames
Definition: cardutil.h:22
CardUtil::IsEITCapable
static bool IsEITCapable(const QString &rawtype)
Definition: cardutil.h:170
musicbrainzngs.caa.hostname
string hostname
Definition: caa.py:17
CardUtil::INPUT_TYPES
INPUT_TYPES
all the different inputs
Definition: cardutil.h:49
CardUtil::GetHostname
static QString GetHostname(uint inputid)
Definition: cardutil.h:305
CardUtil::GetDiSEqCPosition
static QString GetDiSEqCPosition(uint inputid)
Definition: cardutil.h:302
CardUtil::IsTuningAnalog
static bool IsTuningAnalog(const QString &rawtype)
Definition: cardutil.h:198
CardUtil::IsUnscanable
static bool IsUnscanable(const QString &rawtype)
Definition: cardutil.h:158
DVB_DEV_VIDEO
@ DVB_DEV_VIDEO
Definition: cardutil.h:35
CardUtil::IsChannelReusable
static bool IsChannelReusable(const QString &rawtype)
Definition: cardutil.h:222
nv_python_libs.bbciplayer.bbciplayer_api.version
string version
Definition: bbciplayer_api.py:77
DVB_DEV_DVR
@ DVB_DEV_DVR
Definition: cardutil.h:31
dtvconfparserhelpers.h
get_on_input
MTV_PUBLIC QString get_on_input(const QString &to_get, uint inputid)
Definition: cardutil.cpp:1257
CardUtil::GetVideoDevice
static QString GetVideoDevice(uint inputid)
Definition: cardutil.h:294
uint
unsigned int uint
Definition: freesurround.h:24
DVB_DEV_FRONTEND
@ DVB_DEV_FRONTEND
Definition: cardutil.h:30