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"
19
20class InputInfo;
21class CardInput;
22using InputNames = QMap<int,QString>;
23
24MTV_PUBLIC QString get_on_input(const QString &to_get, uint inputid);
25
26MTV_PUBLIC bool set_on_input(const QString &to_set, uint inputid, const QString &value);
27
28enum dvb_dev_type_t : std::uint8_t
29{
36};
37
41class 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#if CONFIG_VBOX
228 static bool IsVBoxPresent(uint inputid);
229#endif
230#if CONFIG_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
MTV_PUBLIC bool set_on_input(const QString &to_set, uint inputid, const QString &value)
Definition: cardutil.cpp:1275
dvb_dev_type_t
Definition: cardutil.h:29
@ DVB_DEV_AUDIO
Definition: cardutil.h:34
@ DVB_DEV_VIDEO
Definition: cardutil.h:35
@ DVB_DEV_DEMUX
Definition: cardutil.h:32
@ DVB_DEV_DVR
Definition: cardutil.h:31
@ DVB_DEV_CA
Definition: cardutil.h:33
@ DVB_DEV_FRONTEND
Definition: cardutil.h:30
QMap< int, QString > InputNames
Definition: cardutil.h:22
MTV_PUBLIC QString get_on_input(const QString &to_get, uint inputid)
Definition: cardutil.cpp:1258
Collection of helper utilities for input DB use.
Definition: cardutil.h:42
static bool IsTunerSharingCapable(const QString &rawtype)
Definition: cardutil.h:177
static bool IsUnscanable(const QString &rawtype)
Definition: cardutil.h:158
static QString GetRawInputType(uint inputid)
Definition: cardutil.h:292
static QString GetAudioDevice(uint inputid)
Definition: cardutil.h:296
static bool IsTuningAnalog(const QString &rawtype)
Definition: cardutil.h:198
INPUT_TYPES
all the different inputs
Definition: cardutil.h:50
static bool IsTuningVirtual(const QString &rawtype)
Definition: cardutil.h:205
static QString GetDiSEqCPosition(uint inputid)
Definition: cardutil.h:302
static bool SetValue(const QString &col, uint inputid, int val)
Definition: cardutil.h:310
static int GetValueInt(const QString &col, uint inputid)
Definition: cardutil.h:308
static QMap< QString, QStringList > s_videoDeviceCache
Definition: cardutil.h:471
static bool IsChannelChangeDiscontinuous(const QString &rawtype)
Definition: cardutil.h:152
static uint GetFirstInputID(const QString &videodevice)
Convenience function for GetInputIDs()
Definition: cardutil.h:268
static bool IsEITCapable(const QString &rawtype)
Definition: cardutil.h:170
static QString GetDeliverySystemFromDB(uint inputid)
Definition: cardutil.h:300
static bool TVOnly(uint inputid, const QString &inputname)
static QString GetVideoDevice(uint inputid)
Definition: cardutil.h:294
static bool IsV4L(const QString &rawtype)
Definition: cardutil.h:145
static bool IgnoreEncrypted(uint inputid, const QString &inputname)
static bool IsEncoder(const QString &rawtype)
Definition: cardutil.h:135
static QString GetVBIDevice(uint inputid)
Definition: cardutil.h:298
static bool IsTuningDigital(const QString &rawtype)
Definition: cardutil.h:190
static QString GetHostname(uint inputid)
Definition: cardutil.h:305
static bool IsSingleInputType(const QString &rawtype)
Definition: cardutil.h:212
static bool IsDVB(uint inputid)
Returns true if the input is a DVB input.
Definition: cardutil.h:401
static bool GetV4LInfo(int videofd, QString &input, QString &driver)
Definition: cardutil.h:436
QMap< QString, QString > InputTypes
Definition: cardutil.h:46
static bool SetValue(const QString &col, uint inputid, const QString &val)
Definition: cardutil.h:313
static bool IsChannelReusable(const QString &rawtype)
Definition: cardutil.h:222
unsigned int uint
Definition: freesurround.h:24
#define MTV_PUBLIC
Definition: mythtvexp.h:15
string version
Definition: giantbomb.py:185
def error(message)
Definition: smolt.py:409
string hostname
Definition: caa.py:17