14 #include <linux/dvb/dmx.h>
15 #include <linux/dvb/frontend.h>
16 #include <sys/ioctl.h>
26 #define DVBS_TUNE_TIMEOUT 9000 //ms
27 #define DVBS_LOCK_TIMEOUT 2000 //ms
28 #define DVBC_TUNE_TIMEOUT 9000 //ms
29 #define DVBC_LOCK_TIMEOUT 2000 //ms
30 #define DVBT_TUNE_TIMEOUT 9000 //ms
31 #define DVBT_LOCK_TIMEOUT 2000 //ms
32 #define ATSC_TUNE_TIMEOUT 9000 //ms
33 #define ATSC_LOCK_TIMEOUT 2000 //ms
35 #define SCR_RANDOM_TIMEOUT 500 // ms (add random value up to this when tuning SCR device to avoid lockups)
40 { 0, INVERSION_OFF,
trNOOP(
"off") },
41 { 1, INVERSION_ON,
trNOOP(
"on") },
42 { 999, INVERSION_AUTO,
trNOOP(
"auto") },
47 { 5, 5000000,
"5 MHz" },
48 { 6, 6000000,
"6 MHz" },
49 { 7, 7000000,
"7 MHz" },
50 { 8, 8000000,
"8 MHz" },
51 { 10, 10000000,
"10 MHz" },
52 { 1712, 1712000,
"1.712 MHz" },
57 { 0, FEC_NONE,
trNOOP(
"none") },
58 { 12, FEC_1_2,
"1/2" },
59 { 23, FEC_2_3,
"2/3" },
60 { 34, FEC_3_4,
"3/4" },
61 { 35, FEC_3_5,
"3/5" },
62 { 45, FEC_4_5,
"4/5" },
63 { 56, FEC_5_6,
"5/6" },
64 { 67, FEC_6_7,
"6/7" },
65 { 78, FEC_7_8,
"7/8" },
66 { 89, FEC_8_9,
"8/9" },
67 { 910, FEC_9_10,
"9/10" },
68 { 999, FEC_AUTO,
trNOOP(
"auto") },
73 { 16, QAM_16,
"QAM16" },
74 { 32, QAM_32,
"QAM32" },
75 { 64, QAM_64,
"QAM64" },
76 { 128, QAM_128,
"QAM128" },
77 { 256, QAM_256,
"QAM256" },
80 { 6, APSK_16,
"16APSK" },
81 { 7, APSK_32,
"32APSK" },
82 { 10, VSB_8,
"VSB8" },
83 { 11, VSB_16,
"VSB16" },
84 { 12, DQPSK,
"DQPSK" },
85 { 999, QAM_AUTO,
trNOOP(
"auto") },
89 #define DVB_SYSTEM_1 0 // see also nit.c
90 #define DVB_SYSTEM_2 1
106 { 2, TRANSMISSION_MODE_2K,
"2K" },
108 { 8, TRANSMISSION_MODE_8K,
"8K" },
111 { 999, TRANSMISSION_MODE_AUTO,
trNOOP(
"auto") },
116 { 4, GUARD_INTERVAL_1_4,
"1/4" },
117 { 8, GUARD_INTERVAL_1_8,
"1/8" },
118 { 16, GUARD_INTERVAL_1_16,
"1/16" },
119 { 32, GUARD_INTERVAL_1_32,
"1/32" },
123 { 999, GUARD_INTERVAL_AUTO,
trNOOP(
"auto") },
128 { 0, HIERARCHY_NONE,
trNOOP(
"none") },
129 { 1, HIERARCHY_1,
"1" },
130 { 2, HIERARCHY_2,
"2" },
131 { 4, HIERARCHY_4,
"4" },
132 { 999, HIERARCHY_AUTO,
trNOOP(
"auto") },
137 { 0, ROLLOFF_AUTO,
trNOOP(
"auto") },
138 { 20, ROLLOFF_20,
"0.20" },
139 { 25, ROLLOFF_25,
"0.25" },
140 { 35, ROLLOFF_35,
"0.35" },
171 *String =
tr(Map[n].userString);
205 guard = GUARD_INTERVAL_AUTO;
214 return Value >= 0 && Value != 999 ? sprintf(p,
"%c%d", Name, Value) : 0;
219 #define ST(s) if (strchr(s, Type) && (strchr(s, '0' + system + 1) || strchr(s, '*')))
243 int n = strtol(s, &p, 10);
244 if (!errno && p != s) {
250 esyslog(
"ERROR: invalid value for parameter '%c'", *(s - 1));
257 switch (toupper(*s)) {
273 default:
esyslog(
"ERROR: unknown parameter key '%c'", *s);
282 #define TUNER_POLL_TIMEOUT 10 // ms
315 virtual void Action(
void);
331 bool Locked(
int TimeoutMs = 0);
401 while (t->bondedTuner !=
this)
404 t->bondedTuner = NULL;
419 return diseqc->Commands();
423 bool VoltOff = dtp.Polarization() ==
'V' || dtp.Polarization() ==
'R';
435 if (t->device->Priority() >
IDLEPRIORITY || ConsiderOccupied && t->device->Occupied()) {
436 if (strcmp(BondingParams, t->GetBondedMaster()->GetBondingParams()) != 0)
482 if (BondedMaster ==
this) {
511 if (isLocked || !TimeoutMs)
526 dvb_frontend_event Event;
527 while (ioctl(
fd_frontend, FE_GET_EVENT, &Event) == 0)
536 if (ioctl(
fd_frontend, FE_READ_STATUS, &Status) != -1)
552 if (ioctl(
fd_frontend, FE_READ_SIGNAL_STRENGTH, &Signal) != -1)
557 uint16_t MaxSignal = 0xFFFF;
563 MaxSignal = 670;
break;
565 int s = int(Signal) * 100 / MaxSignal;
568 #ifdef DEBUG_SIGNALSTRENGTH
574 #define LOCK_THRESHOLD 5 // indicates that all 5 FE_HAS_* flags are set
581 if ((Status & FE_HAS_LOCK) == 0) {
582 if ((Status & FE_HAS_SIGNAL) == 0)
584 if ((Status & FE_HAS_CARRIER) == 0)
586 if ((Status & FE_HAS_VITERBI) == 0)
588 if ((Status & FE_HAS_SYNC) == 0)
592 #ifdef DEBUG_SIGNALQUALITY
599 if (errno != EINTR) {
601 #ifdef DEBUG_SIGNALQUALITY
607 #ifdef DEBUG_SIGNALQUALITY
614 if (errno != EINTR) {
616 #ifdef DEBUG_SIGNALQUALITY
622 #ifdef DEBUG_SIGNALQUALITY
627 if (ioctl(
fd_frontend, FE_READ_UNCORRECTED_BLOCKS, &Unc) != -1)
629 if (errno != EINTR) {
631 #ifdef DEBUG_SIGNALQUALITY
637 uint16_t MinSnr = 0x0000;
638 uint16_t MaxSnr = 0xFFFF;
655 int a = int(
constrain(Snr, MinSnr, MaxSnr)) * 100 / (MaxSnr - MinSnr);
656 int b = 100 - (Unc * 10 + (Ber / 256) * 5);
662 #ifdef DEBUG_SIGNALQUALITY
663 fprintf(stderr,
"FE %d/%d: %08X Q = %04X %04X %d %5d %5d %3d%%\n",
adapter,
frontend,
subsystemId, MaxSnr, Snr, HasSnr, HasBer ?
int(Ber) : -1, HasUnc ?
int(Unc) : -1, q);
672 while (f && f < 1000000)
686 struct dvb_diseqc_master_cmd cmd;
687 const char *CurrentAction = NULL;
689 cmd.msg_len =
sizeof(cmd.msg);
701 default:
esyslog(
"ERROR: unknown diseqc command %d", da);
718 int ds = SYS_UNDEFINED;
722 ds = SYS_DVBC_ANNEX_AC;
723 else if (Channel->
IsSat())
725 else if (Channel->
IsTerr())
728 esyslog(
"ERROR: can't determine frontend type for channel %d", Channel->
Number());
736 #define MAXFRONTENDCMDS 16
737 #define SETCMD(c, d) { Frontend[CmdSeq.num].cmd = (c);\
738 Frontend[CmdSeq.num].u.data = (d);\
739 if (CmdSeq.num++ > MAXFRONTENDCMDS) {\
740 esyslog("ERROR: too many tuning commands on frontend %d/%d", adapter, frontend);\
745 memset(&Frontend, 0,
sizeof(Frontend));
746 dtv_properties CmdSeq;
747 memset(&CmdSeq, 0,
sizeof(CmdSeq));
748 CmdSeq.props = Frontend;
750 if (ioctl(
fd_frontend, FE_SET_PROPERTY, &CmdSeq) < 0) {
760 if (frontendType == SYS_UNDEFINED)
763 SETCMD(DTV_DELIVERY_SYSTEM, frontendType);
764 if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2) {
768 frequency -= diseqc->Lof();
786 int tone = SEC_TONE_OFF;
795 int volt = (dtp.Polarization() ==
'V' || dtp.Polarization() ==
'R') ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18;
798 volt = SEC_VOLTAGE_13;
803 frequency = abs(frequency);
806 SETCMD(DTV_FREQUENCY, frequency * 1000UL);
807 SETCMD(DTV_MODULATION, dtp.Modulation());
809 SETCMD(DTV_INNER_FEC, dtp.CoderateH());
810 SETCMD(DTV_INVERSION, dtp.Inversion());
811 if (frontendType == SYS_DVBS2) {
813 SETCMD(DTV_PILOT, PILOT_AUTO);
814 SETCMD(DTV_ROLLOFF, dtp.RollOff());
820 SETCMD(DTV_ROLLOFF, ROLLOFF_35);
826 else if (frontendType == SYS_DVBC_ANNEX_AC || frontendType == SYS_DVBC_ANNEX_B) {
829 SETCMD(DTV_INVERSION, dtp.Inversion());
831 SETCMD(DTV_INNER_FEC, dtp.CoderateH());
832 SETCMD(DTV_MODULATION, dtp.Modulation());
837 else if (frontendType == SYS_DVBT || frontendType ==
SYS_DVBT2) {
840 SETCMD(DTV_INVERSION, dtp.Inversion());
841 SETCMD(DTV_BANDWIDTH_HZ, dtp.Bandwidth());
842 SETCMD(DTV_CODE_RATE_HP, dtp.CoderateH());
843 SETCMD(DTV_CODE_RATE_LP, dtp.CoderateL());
844 SETCMD(DTV_MODULATION, dtp.Modulation());
845 SETCMD(DTV_TRANSMISSION_MODE, dtp.Transmission());
846 SETCMD(DTV_GUARD_INTERVAL, dtp.Guard());
847 SETCMD(DTV_HIERARCHY, dtp.Hierarchy());
860 else if (frontendType == SYS_ATSC) {
863 SETCMD(DTV_INVERSION, dtp.Inversion());
864 SETCMD(DTV_MODULATION, dtp.Modulation());
870 esyslog(
"ERROR: attempt to set channel with unknown DVB frontend type");
874 if (ioctl(
fd_frontend, FE_SET_PROPERTY, &CmdSeq) < 0) {
884 bool LostLock =
false;
885 fe_status_t Status = (fe_status_t)0;
888 fe_status_t NewStatus;
913 if (Status & FE_REINIT) {
920 else if (Status & FE_HAS_LOCK) {
1016 #define ST(s) if (strchr(s, type))
1031 default:
return NULL;
1092 if (fd_frontend >= 0) {
1120 int fd = open(FileName, Mode);
1121 if (fd < 0 && ReportError)
1129 if (access(FileName, F_OK) == 0) {
1130 int f = open(FileName, O_RDONLY);
1135 else if (errno != ENODEV && errno != EINVAL)
1138 else if (errno != ENOENT)
1146 dsyslog(
"probing %s", *FileName);
1148 if (dp->Probe(Adapter, Frontend))
1151 dsyslog(
"creating cDvbDevice");
1182 while ((a = DvbDir.
Next()) != NULL) {
1186 if (AdapterDir.
Ok()) {
1188 while ((f = AdapterDir.
Next()) != NULL) {
1200 if (Nodes.
Size() > 0) {
1202 for (
int i = 0; i < Nodes.
Size(); i++) {
1205 if (2 == sscanf(Nodes[i],
"%d %d", &Adapter, &Frontend)) {
1206 if (
Exists(Adapter, Frontend)) {
1209 if (
Probe(Adapter, Frontend))
1221 isyslog(
"found %d DVB device%s", Found, Found > 1 ?
"s" :
"");
1223 isyslog(
"no DVB device found");
1230 if (ioctl(fd_frontend, FE_GET_INFO, &
frontendInfo) < 0) {
1235 dtv_properties CmdSeq;
1238 memset(&Frontend, 0,
sizeof(Frontend));
1239 memset(&CmdSeq, 0,
sizeof(CmdSeq));
1241 SETCMD(DTV_API_VERSION, 0);
1242 if (ioctl(fd_frontend, FE_GET_PROPERTY, &CmdSeq) != 0) {
1250 bool LegacyMode =
true;
1252 memset(&Frontend, 0,
sizeof(Frontend));
1253 memset(&CmdSeq, 0,
sizeof(CmdSeq));
1256 int Result = ioctl(fd_frontend, FE_GET_PROPERTY, &CmdSeq);
1258 for (uint i = 0; i < Frontend[0].u.buffer.len; i++) {
1268 esyslog(
"ERROR: can't query delivery systems on frontend %d/%d - falling back to legacy mode",
adapter,
frontend);
1302 ms =
"unknown modulations";
1326 int ErrorDevice = 0;
1328 if (Device1->HasSubDevice())
1329 Device1 = Device1->SubDevice();
1331 if (Device2->HasSubDevice())
1332 Device2 = Device2->SubDevice();
1333 if (
cDvbDevice *DvbDevice1 = dynamic_cast<cDvbDevice *>(Device1)) {
1334 if (
cDvbDevice *DvbDevice2 = dynamic_cast<cDvbDevice *>(Device2)) {
1335 if (!DvbDevice1->Bond(DvbDevice2))
1339 ErrorDevice = d + 1;
1342 ErrorDevice = i + 1;
1344 esyslog(
"ERROR: device '%d' in device bondings '%s' is not a cDvbDevice", ErrorDevice, Bondings);
1349 ErrorDevice = d + 1;
1352 ErrorDevice = i + 1;
1354 esyslog(
"ERROR: unknown device '%d' in device bondings '%s'", ErrorDevice, Bondings);
1369 if (
cDvbDevice *d = dynamic_cast<cDvbDevice *>(dev))
1378 if (Device !=
this) {
1388 esyslog(
"ERROR: can't bond device %d with device %d (only DVB-S(2) devices can be bonded)",
CardIndex() + 1, Device->
CardIndex() + 1);
1405 while (d->bondedDevice !=
this)
1406 d = d->bondedDevice;
1408 d->bondedDevice = NULL;
1451 dmx_pes_filter_params pesFilterParams;
1452 memset(&pesFilterParams, 0,
sizeof(pesFilterParams));
1454 if (Handle->
handle < 0) {
1456 if (Handle->
handle < 0) {
1461 pesFilterParams.pid = Handle->
pid;
1462 pesFilterParams.input = DMX_IN_FRONTEND;
1463 pesFilterParams.output = DMX_OUT_TS_TAP;
1464 pesFilterParams.pes_type= DMX_PES_OTHER;
1465 pesFilterParams.flags = DMX_IMMEDIATE_START;
1466 if (ioctl(Handle->
handle, DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
1471 else if (!Handle->
used) {
1474 pesFilterParams.pid = 0x1FFF;
1475 pesFilterParams.input = DMX_IN_FRONTEND;
1476 pesFilterParams.output = DMX_OUT_DECODER;
1477 pesFilterParams.pes_type= DMX_PES_OTHER;
1478 pesFilterParams.flags = DMX_IMMEDIATE_START;
1479 CHECK(ioctl(Handle->
handle, DMX_SET_PES_FILTER, &pesFilterParams));
1491 int f = open(FileName, O_RDWR | O_NONBLOCK);
1493 dmx_sct_filter_params sctFilterParams;
1494 memset(&sctFilterParams, 0,
sizeof(sctFilterParams));
1495 sctFilterParams.pid = Pid;
1496 sctFilterParams.timeout = 0;
1497 sctFilterParams.flags = DMX_IMMEDIATE_START;
1498 sctFilterParams.filter.filter[0] = Tid;
1499 sctFilterParams.filter.mask[0] = Mask;
1500 if (ioctl(f, DMX_SET_FILTER, &sctFilterParams) >= 0)
1503 esyslog(
"ERROR: can't set filter (pid=%d, tid=%02X, mask=%02X): %m", Pid, Tid, Mask);
1508 esyslog(
"ERROR: can't open filter handle on '%s'", *FileName);
1543 dtp.Modulation() == QPSK && !(
frontendInfo.caps & FE_CAN_QPSK) ||
1544 dtp.Modulation() == QAM_16 && !(
frontendInfo.caps & FE_CAN_QAM_16) ||
1545 dtp.Modulation() == QAM_32 && !(
frontendInfo.caps & FE_CAN_QAM_32) ||
1546 dtp.Modulation() == QAM_64 && !(
frontendInfo.caps & FE_CAN_QAM_64) ||
1547 dtp.Modulation() == QAM_128 && !(
frontendInfo.caps & FE_CAN_QAM_128) ||
1548 dtp.Modulation() == QAM_256 && !(
frontendInfo.caps & FE_CAN_QAM_256) ||
1549 dtp.Modulation() == QAM_AUTO && !(
frontendInfo.caps & FE_CAN_QAM_AUTO) ||
1550 dtp.Modulation() == VSB_8 && !(
frontendInfo.caps & FE_CAN_8VSB) ||
1551 dtp.Modulation() == VSB_16 && !(
frontendInfo.caps & FE_CAN_16VSB) ||
1562 bool result =
false;
1564 bool needsDetachReceivers =
false;
1568 result = hasPriority;
1577 needsDetachReceivers =
true;
1597 needsDetachReceivers |= d->Receiving();
1605 if (NeedsDetachReceivers)
1606 *NeedsDetachReceivers = needsDetachReceivers;
1695 d->cDevice::DetachAllReceivers();
1707 DvbDeviceProbes.
Add(
this);
1712 DvbDeviceProbes.
Del(
this,
false);
1717 uint32_t SubsystemId = 0;
1720 if (stat(FileName, &st) == 0) {
1724 while ((e = d.
Next()) != NULL) {
1725 if (strstr(e->d_name,
"frontend")) {
1727 if (FILE *f = fopen(FileName,
"r")) {
1729 char *s = ReadLine.
Read(f);
1733 if (s && 2 == sscanf(s,
"%u:%u", &Major, &Minor)) {
1734 if (((Major << 8) | Minor) == st.st_rdev) {
1735 FileName =
cString::sprintf(
"/sys/class/dvb/%s/device/subsystem_vendor", e->d_name);
1736 if ((f = fopen(FileName,
"r")) != NULL) {
1737 if (
char *s = ReadLine.
Read(f))
1738 SubsystemId = strtoul(s, NULL, 0) << 16;
1741 FileName =
cString::sprintf(
"/sys/class/dvb/%s/device/subsystem_device", e->d_name);
1742 if ((f = fopen(FileName,
"r")) != NULL) {
1743 if (
char *s = ReadLine.
Read(f))
1744 SubsystemId |= strtoul(s, NULL, 0);
static unsigned int FrequencyToHz(unsigned int f)
struct dirent * Next(void)
virtual ~cDvbDeviceProbe()
static bool UseDevice(int n)
Tells whether the device with the given card index shall be used in this instance of VDR...
const char * DeliverySystemNames[]
cDvbTransponderParameters(const char *Parameters=NULL)
virtual bool ProvidesSource(int Source) const
Returns true if this device can provide the given source.
int PrintParameter(char *p, char Name, int Value) const
virtual cString DeviceType(void) const
Returns a string identifying the type of this device (like "DVB-S").
bool IsBondedMaster(void) const
virtual bool SetIdle(bool Idle, bool TestOnly)
static bool Exists(int Adapter, int Frontend)
Checks whether the given adapter/frontend exists.
void ResetToneAndVoltage(void)
#define SCR_RANDOM_TIMEOUT
bool Receiving(bool Dummy=false) const
Returns true if we are currently receiving. The parameter has no meaning (for backwards compatibility...
const char * ParseParameter(const char *s, int &Value, const tDvbParameterMap *Map=NULL)
virtual bool IsTunedToTransponder(const cChannel *Channel) const
Returns true if this device is currently tuned to the given Channel's transponder.
static bool Initialize(void)
Initializes the DVB devices.
void SetDescription(const char *Description,...) __attribute__((format(printf
virtual bool GetTSPacket(uchar *&Data)
Gets exactly one TS packet from the DVR of this device and returns a pointer to it in Data...
#define DVBT_TUNE_TIMEOUT
int UserIndex(int Value, const tDvbParameterMap *Map)
void Add(cListObject *Object, cListObject *After=NULL)
void UnBond(void)
Removes this device from any bonding it might have with other devices.
cTSBuffer * tsBuffer
< Controls how the DVB device handles Transfer Mode when replaying Dolby Digital audio.
#define DVBC_TUNE_TIMEOUT
int Ca(int Index=0) const
void ClearEventQueue(void) const
bool DeviceHooksProvidesTransponder(const cChannel *Channel) const
virtual int SignalQuality(void) const
Returns the "quality" of the currently received signal.
virtual cOsdItem * GetOsdItem(void)
Returns all the OSD items necessary for editing the source specific parameters of the channel that wa...
#define DVBS_LOCK_TIMEOUT
void ExecuteDiseqc(const cDiseqc *Diseqc, unsigned int *Frequency)
static cString sprintf(const char *fmt,...) __attribute__((format(printf
#define DVBC_LOCK_TIMEOUT
const tDvbParameterMap SystemValuesSat[]
virtual void Append(T Data)
#define DVBT_LOCK_TIMEOUT
static uint32_t GetSubsystemId(int Adapter, int Frontend)
const tDvbParameterMap InversionValues[]
bool Parse(const char *s)
static cDevice * GetDevice(int Index)
Gets the device with the given Index.
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView)
Sets the device to the given channel (actual physical setup).
eDiseqcActions Execute(const char **CurrentAction, uchar *Codes, uint8_t *MaxCodes, const cScr *Scr, uint *Frequency) const
Parses the DiSEqC commands and returns the appropriate action code with every call.
static int NumDevices(void)
Returns the total number of devices.
virtual bool Ready(void)
Returns 'true' if all present CAMs in this adapter are ready.
bool IsTunedTo(const cChannel *Channel) const
#define TUNER_POLL_TIMEOUT
void DelLivePids(void)
Deletes the live viewing PIDs.
int GetSignalStrength(void) const
int Transponder(void) const
Returns the transponder frequency in MHz, plus the polarization in case of sat.
cDvbTuner * GetBondedMaster(void)
cString ToString(char Type) const
bool Poll(int TimeoutMs=0)
int MapToDriver(int Value, const tDvbParameterMap *Map)
bool QueryDeliverySystems(int fd_frontend)
const char * Parameters(void) const
bool needsDetachBondedReceivers
static int NextCardIndex(int n=0)
Calculates the next card index.
bool SetTransponderData(int Source, int Frequency, int Srate, const char *Parameters, bool Quiet=false)
bool IsPrimaryDevice(void) const
cCamSlot * CamSlot(void) const
Returns the CAM slot that is currently used with this device, or NULL if no CAM slot is in use...
virtual bool MaySwitchTransponder(const cChannel *Channel) const
Returns true if it is ok to switch to the Channel's transponder on this device, without disturbing an...
cDvbDevice(int Adapter, int Frontend, cDevice *ParentDevice=NULL)
const tDvbParameterMap HierarchyValues[]
void StartSectionHandler(void)
A derived device that provides section data must call this function (typically in its constructor) to...
static bool BondDevices(const char *Bondings)
Bonds the devices as defined in the given Bondings string.
static bool Probe(int Adapter, int Frontend)
Probes for existing DVB devices.
virtual bool SetPid(cPidHandle *Handle, int Type, bool On)
Does the actual PID setting on this device.
uint32_t SubsystemId(void) const
void StopSectionHandler(void)
A device that has called StartSectionHandler() must call this function (typically in its destructor) ...
#define MAXDELIVERYSYSTEMS
bool CanDecrypt(const cChannel *Channel)
Returns true if there is a CAM in this slot that is able to decrypt the given Channel (or at least cl...
virtual void SetData(cChannel *Channel)
Sets all source specific parameters to those of the given Channel.
cDvbDevice * bondedDevice
cDvbSourceParam(char Source, const char *Description)
int MapToUser(int Value, const tDvbParameterMap *Map, const char **String)
cList< cDvbDeviceProbe > DvbDeviceProbes
virtual cString DeviceName(void) const
Returns a string identifying the name of this device.
virtual bool Ready(void)
Returns true if this device is ready.
void bool Start(void)
Actually starts the thread.
virtual void CloseDvr(void)
Shuts down the DVR.
#define DVBS_TUNE_TIMEOUT
virtual void CloseFilter(int Handle)
Closes a file handle that has previously been opened by OpenFilter().
static bool IsSat(int Code)
bool HasSubDevice(void) const
int DriverIndex(int Value, const tDvbParameterMap *Map)
#define ATSC_LOCK_TIMEOUT
bool OpenFrontend(void) const
const tDvbParameterMap ModulationValues[]
bool Running(void)
Returns false if a derived cThread object shall leave its Action() function.
int deliverySystems[MAXDELIVERYSYSTEMS]
bool TimedWait(cMutex &Mutex, int TimeoutMs)
bool Locked(int TimeoutMs=0)
static cDvbCiAdapter * CreateCiAdapter(cDevice *Device, int Fd, int Adapter=-1, int Frontend=-1)
int Frequency(void) const
Returns the actual frequency, as given in 'channels.conf'.
virtual bool OpenDvr(void)
Opens the DVR of this device and prepares it to deliver a Transport Stream for use in a cReceiver...
int GetSignalQuality(void) const
bool Bond(cDvbTuner *Tuner)
virtual void DetachAllReceivers(void)
Detaches all receivers from this device.
static void UnBondDevices(void)
Unbonds all devices.
const char * MapToUserString(int Value, const tDvbParameterMap *Map)
virtual const cChannel * GetCurrentlyTunedTransponder(void) const
Returns a pointer to the currently tuned transponder.
virtual bool HasCi(void)
Returns true if this device has a Common Interface.
int CardIndex(void) const
Returns the card index of this device (0 ... MAXDEVICES - 1).
int Priority(void) const
Returns the priority of the current receiving session (-MAXPRIORITY..MAXPRIORITY), or IDLEPRIORITY if no receiver is currently active.
virtual bool HasLock(int TimeoutMs=0) const
Returns true if the device has a lock on the requested transponder.
virtual int NumProvidedSystems(void) const
Returns the number of individual "delivery systems" this device provides.
dvb_frontend_info frontendInfo
int FrontendType(void) const
virtual bool IsIdle(void) const
const cDiseqc * lastDiseqc
static int GetRequiredDeliverySystem(const cChannel *Channel, const cDvbTransponderParameters *Dtp)
void Del(cListObject *Object, bool DeleteObject=true)
cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int Frontend)
int FirstDeviceIndex(int DeviceIndex) const
Returns the first device index (starting at 0) that uses the same sat cable number as the device with...
virtual bool ProvidesDeliverySystem(int DeliverySystem) const
const tDvbParameterMap RollOffValues[]
static cDevice * PrimaryDevice(void)
Returns the primary device.
static int setTransferModeForDolbyDigital
const tDvbParameterMap CoderateValues[]
bool IsSubDevice(void) const
bool Bond(cDvbDevice *Device)
Bonds this device with the given Device, making both of them use the same satellite cable and LNB...
const cChannel * GetTransponder(void) const
virtual bool ProvidesTransponder(const cChannel *Channel) const
Returns true if this device can provide the transponder of the given Channel (which implies that it c...
const cDiseqc * Get(int Device, int Source, int Frequency, char Polarization, const cScr **Scr) const
Selects a DiSEqC entry suitable for the given Device and tuning parameters.
virtual bool ProvidesChannel(const cChannel *Channel, int Priority=IDLEPRIORITY, bool *NeedsDetachReceivers=NULL) const
Returns true if this device can provide the given channel.
void Sort(bool IgnoreCase=false)
bool BondingOk(const cChannel *Channel, bool ConsiderOccupied=false) const
The cDvbDevice implements a DVB device which can be accessed through the Linux DVB driver API...
virtual bool SetIdleDevice(bool Idle, bool TestOnly)
Called by SetIdle if TestOnly, don't do anything, just return, if the device can be set to the new id...
void SetChannel(const cChannel *Channel)
bool HasPid(int Pid) const
Returns true if this device is currently receiving the given PID.
bool GetFrontendStatus(fe_status_t &Status) const
#define DTV_DVBT2_PLP_ID_LEGACY
const tDvbParameterMap SystemValuesTerr[]
virtual void Action(void)
A derived cThread class must implement the code it wants to execute as a separate thread in this func...
cDevice * SubDevice(void) const
const tDvbParameterMap BandwidthValues[]
bool BondingOk(const cChannel *Channel, bool ConsiderOccupied=false) const
Returns true if this device is either not bonded to any other device, or the given Channel is on the ...
Derived cDevice classes that can receive channels will have to provide Transport Stream (TS) packets ...
virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask)
Opens a file handle for the given filter data.
void Cancel(int WaitSeconds=0)
Cancels the thread by first setting 'running' to false, so that the Action() loop can finish in an or...
virtual int SignalStrength(void) const
Returns the "strength" of the currently received signal.
cString GetBondingParams(const cChannel *Channel=NULL) const
bool SetFrontendType(const cChannel *Channel)
#define ATSC_TUNE_TIMEOUT
virtual bool MaySwitchTransponder(const cChannel *Channel) const
Returns true if it is ok to switch to the Channel's transponder on this device, without disturbing an...
cDvbTransponderParameters dtp
static cString DvbName(const char *Name, int Adapter, int Frontend)
The cDevice class is the base from which actual devices can be derived.
static int DvbOpen(const char *Name, int Adapter, int Frontend, int Mode, bool ReportError=false)
const cDvbDevice * device
const tDvbParameterMap GuardValues[]
virtual void GetData(cChannel *Channel)
Copies all source specific parameters to the given Channel.
const tDvbParameterMap TransmissionValues[]
static void SetTransferModeForDolbyDigital(int Mode)
virtual bool ProvidesEIT(void) const
Returns true if this device provides EIT data and thus wants to be tuned to the channels it can recei...