39 #include <sys/select.h>
41 #include <sys/types.h>
48 #include "mythconfig.h"
62 DTVTunerType tuner_type,
const dvb_frontend_parameters& params);
65 uint intermediate_freq,
bool can_fec_auto,
bool do_tune =
true);
70 #define LOC QString("DVBChan[%1](%2): ").arg(m_inputId).arg(DVBChannel::GetDevice())
72 #define DTV_STAT_FULL_DEBUG 0 // All DTV_STAT_xxx values
80 :
DTVChannel(parent), m_device(std::move(aDevice))
85 m_key += QString(
":%1")
95 else if (master !=
nullptr)
119 QMutexLocker master_locker(&(master->m_hwLock));
120 QMutexLocker new_master_locker(&(new_master->
m_hwLock));
121 new_master->
m_isOpen = master->m_isOpen;
145 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Closing DVB channel");
149 IsOpenMap::iterator it =
m_isOpen.find(who);
156 if (master !=
nullptr && master !=
this)
190 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Opening DVB channel");
195 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Use legacy DVBv3 API");
209 if (!master->
Open(who))
247 QByteArray devn = dvbdev.toLatin1();
249 for (
int tries = 1; ; ++tries)
256 LOG(VB_GENERAL, LOG_WARNING,
LOC +
257 "Opening DVB frontend device failed." +
ENO);
259 if (tries >= 5 || (errno != EBUSY && errno != EAGAIN))
261 LOG(VB_GENERAL, LOG_ERR,
LOC +
262 QString(
"Failed to open DVB frontend device due to "
263 "fatal error or too many attempts."));
266 std::this_thread::sleep_for(std::chrono::milliseconds(50));
271 dvb_frontend_info info {};
274 LOG(VB_GENERAL, LOG_ERR,
LOC +
275 "Failed to get frontend information." +
ENO);
289 LOG(VB_CHANNEL, LOG_INFO,
LOC +
293 LOG(VB_CHANNEL, LOG_INFO, QString(
" %1").
arg(capstr));
298 std::array<struct dtv_property,2> prop = {};
299 struct dtv_properties cmd = {};
301 prop[0].cmd = DTV_API_VERSION;
302 prop[1].cmd = DTV_DELIVERY_SYSTEM;
305 cmd.props = prop.data();
309 prop[0].u.data = 0x300;
310 prop[1].u.data = SYS_UNDEFINED;
336 if (info.caps & FE_CAN_2G_MODULATION)
341 if (info.caps & FE_CAN_TURBO_FEC)
356 if (info.caps & FE_CAN_2G_MODULATION)
363 if (info.caps & (FE_CAN_8VSB | FE_CAN_16VSB))
368 if (info.caps & (FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_QAM_AUTO))
370 delsys = SYS_DVBC_ANNEX_B;
378 LOG(VB_GENERAL, LOG_ERR,
LOC +
388 std::array<struct dtv_property,1> prop = {};
389 struct dtv_properties cmd = {};
391 prop[0].cmd = DTV_ENUM_DELSYS;
394 cmd.props = prop.data();
398 LOG(VB_GENERAL, LOG_ERR,
LOC +
404 int p_num_systems = prop[0].u.buffer.len;
405 for (
int i = 0; i < p_num_systems; i++)
411 if (p_num_systems == 0) {
412 LOG(VB_GENERAL, LOG_ERR,
LOC +
413 QString(
"Frontend '%1' returned 0 supported delivery systems!").
arg(
m_frontendName));
423 LOG(VB_CHANNEL, LOG_INFO,
LOC +
425 LOG(VB_CHANNEL, LOG_INFO,
LOC +
426 QString(
"DVB version:0x%1 ").
arg(
m_version,3,16,QChar(
'0')) +
431 LOG(VB_CHANNEL, LOG_INFO,
"Supported delivery systems: ");
436 LOG(VB_CHANNEL, LOG_INFO, QString(
" [%1]")
437 .
arg(delsys.toString()));
441 LOG(VB_CHANNEL, LOG_INFO, QString(
" %1")
442 .
arg(delsys.toString()));
446 uint32_t frq_min = info.frequency_min;
447 uint32_t frq_max = info.frequency_max;
448 uint32_t frq_stp = info.frequency_stepsize;
450 if (info.type == FE_QPSK)
458 LOG(VB_CHANNEL, LOG_INFO, QString(
"Frequency range for the current standard:"));
459 LOG(VB_CHANNEL, LOG_INFO, QString(
" From: %1 Hz").
arg(frq_min,11));
460 LOG(VB_CHANNEL, LOG_INFO, QString(
" To: %1 Hz").
arg(frq_max,11));
461 LOG(VB_CHANNEL, LOG_INFO, QString(
" Step: %1 Hz").
arg(frq_stp,11));
463 if (info.type == FE_QPSK || info.type == FE_QAM)
465 LOG(VB_CHANNEL, LOG_INFO, QString(
"Symbol rate ranges for the current standard:"));
466 LOG(VB_CHANNEL, LOG_INFO, QString(
" From: %1 Baud").
arg(info.symbol_rate_min,11));
467 LOG(VB_CHANNEL, LOG_INFO, QString(
" To: %1 Baud").
arg(info.symbol_rate_max,11));
480 LOG(VB_CHANNEL, LOG_INFO,
LOC +
481 QString(
"Change delivery system from %1 to %2.")
490 LOG(VB_CHANNEL, LOG_INFO,
LOC +
491 QString(
"Delivery system in database and in card equal, leave at %1.")
497 LOG(VB_CHANNEL, LOG_INFO,
LOC +
515 LOG(VB_CHANNEL, LOG_INFO,
LOC +
516 QString(
"Requested %1 channel is on SCR system")
521 LOG(VB_CHANNEL, LOG_INFO,
LOC +
522 QString(
"Requested %1 channel is on non-SCR system")
547 IsOpenMap::const_iterator it =
m_isOpen.find(
this);
568 LOG(VB_GENERAL, LOG_WARNING,
LOC +
569 QString(
"Frequency setting (%1) is out of range (min/max:%2/%3)")
579 LOG(VB_GENERAL, LOG_WARNING,
LOC +
580 "'Auto' inversion parameter unsupported by this driver, "
581 "falling back to 'off'.");
600 LOG(VB_GENERAL, LOG_WARNING,
LOC +
601 QString(
"Symbol Rate setting (%1) is out of range (min/max:%2/%3)")
608 LOG(VB_GENERAL, LOG_WARNING,
LOC +
609 "Selected fec_inner parameter unsupported by this driver.");
614 LOG(VB_GENERAL, LOG_WARNING,
LOC +
615 "Selected modulation parameter unsupported by this driver.");
631 LOG(VB_GENERAL, LOG_WARNING,
LOC +
632 "Selected code_rate_hp parameter unsupported by this driver.");
637 LOG(VB_GENERAL, LOG_WARNING,
LOC +
638 "Selected code_rate_lp parameter unsupported by this driver.");
644 LOG(VB_GENERAL, LOG_WARNING,
LOC +
645 "'Auto' bandwidth parameter unsupported by this driver.");
651 LOG(VB_GENERAL, LOG_WARNING,
LOC +
652 "'Auto' transmission_mode parameter unsupported by this driver.");
658 LOG(VB_GENERAL, LOG_WARNING,
LOC +
659 "'Auto' guard_interval parameter unsupported by this driver.");
665 LOG(VB_GENERAL, LOG_WARNING,
LOC +
666 "'Auto' hierarchy parameter unsupported by this driver. ");
671 LOG(VB_GENERAL, LOG_WARNING,
LOC +
672 "Selected modulation parameter unsupported by this driver.");
707 #if HAVE_FE_CAN_2G_MODULATION
711 #endif //HAVE_FE_CAN_2G_MODULATION
747 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Tune(): Invalid input."));
750 return Tune(tuning,
false,
false);
779 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Tuning on slave channel");
781 bool ok = master->
Tune(tuning, force_reset,
false);
788 uint intermediate_freq = 0;
789 bool can_fec_auto =
false;
794 LOG(VB_GENERAL, LOG_ERR,
LOC +
795 "DVB-S/S2 needs device tree for LNB handling");
803 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Tune(): Card not open!");
811 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Tuning parameters:");
813 LOG(VB_CHANNEL, LOG_INFO,
" New: " + tuning.
toString());
818 int freq_mult = (is_dvbs) ? 1 : 1000;
819 QString suffix = (is_dvbs) ?
"kHz" :
"Hz";
823 LOG(VB_CHANNEL, LOG_INFO,
LOC + QString(
"Tune(): Tuning to %1%2")
829 int64_t this_tuning = QDateTime::currentMSecsSinceEpoch();
831 if (tuning_delay > 0)
833 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Next tuning after less than %1ms, delaying by %2ms")
835 std::this_thread::sleep_for(std::chrono::milliseconds(tuning_delay));
851 LOG(VB_GENERAL, LOG_ERR,
LOC +
852 "Tune(): Failed to setup DiSEqC devices");
860 LOG(VB_GENERAL, LOG_ERR,
LOC +
861 "Tune(): No LNB for this configuration");
895 struct dtv_property p_clear = {};
896 struct dtv_properties cmdseq_clear = {};
898 p_clear.cmd = DTV_CLEAR;
899 cmdseq_clear.num = 1;
900 cmdseq_clear.props = &p_clear;
902 if ((ioctl(
m_fdFrontend, FE_SET_PROPERTY, &cmdseq_clear)) < 0)
904 LOG(VB_GENERAL, LOG_ERR,
LOC +
905 "Tune(): Clearing DTV properties cache failed." +
ENO);
913 LOG(VB_GENERAL, LOG_ERR,
LOC +
914 "Failed to convert DTVMultiplex to DTV_PROPERTY sequence");
920 for (
uint i = 0; i < cmds->num; i++)
922 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
923 QString(
"prop %1: cmd = %2, data %3")
924 .
arg(i).
arg(cmds->props[i].cmd)
925 .arg(cmds->props[i].u.data));
936 LOG(VB_GENERAL, LOG_ERR,
LOC +
937 "Tune(): Setting Frontend tuning parameters failed." +
ENO);
945 m_tunerType, tuning, intermediate_freq, can_fec_auto);
949 LOG(VB_GENERAL, LOG_ERR,
LOC +
950 "Tune(): Setting Frontend tuning parameters failed." +
ENO);
957 std::this_thread::sleep_for(std::chrono::milliseconds(
m_tuningDelay));
966 LOG(VB_CHANNEL, LOG_INFO,
LOC + QString(
"Tune(): Tuning to %1%2 skipped, already tuned")
974 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Tune(): Frequency tuning successful");
993 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Card not open!");
1015 dvb_frontend_parameters params {};
1017 int res = ioctl(
m_fdFrontend, FE_GET_FRONTEND, ¶ms);
1020 LOG(VB_CHANNEL, LOG_ERR,
LOC +
"FE_GET_FRONTEND failed." +
ENO);
1039 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Card not open!");
1069 dvb_frontend_parameters params {};
1072 LOG(VB_GENERAL, LOG_ERR,
LOC +
1073 "Getting Frontend tuning parameters failed." +
ENO);
1101 "FROM channel, capturecard "
1102 "WHERE channel.deleted IS NULL AND "
1103 " capturecard.sourceid = channel.sourceid AND "
1104 " channel.channum = :CHANNUM AND "
1105 " capturecard.cardid = :INPUTID");
1122 idlist.append(chanid);
1126 if (idlist.isEmpty())
1128 LOG(VB_GENERAL, LOG_INFO,
LOC +
1129 QString(
"No visible channel ID for %1")
1134 id = idlist.value(0);
1135 if (idlist.count() > 1)
1138 for (
auto chanid : idlist)
1140 sl.append(QString::number(chanid));
1142 LOG(VB_CHANNEL, LOG_INFO,
LOC +
1143 QString(
"Found for '%1' multiple visible channel IDs: %2")
1148 LOG(VB_CHANNEL, LOG_INFO,
LOC +
1149 QString(
"Found visible channel ID %1 for '%2'")
1170 bool haslock = master->
HasLock(ok);
1176 #if ((DVB_API_VERSION > 5) || ((DVB_API_VERSION == 5) && (DVB_API_VERSION_MINOR > 10)))
1177 fe_status_t status = FE_NONE;
1178 #else // debian9, centos7
1179 fe_status_t status = (fe_status_t)0;
1182 int ret = ioctl(
m_fdFrontend, FE_READ_STATUS, &status);
1185 LOG(VB_GENERAL, LOG_ERR,
LOC +
"FE_READ_STATUS failed" +
ENO);
1189 LOG(VB_CHANNEL, LOG_DEBUG,
LOC + QString(
"%1 status: 0x%2 %3")
1196 return (status & FE_HAS_LOCK) != 0;
1201 struct dtv_property prop = {};
1202 struct dtv_properties cmd = {};
1204 prop.cmd = DTV_STAT_SIGNAL_STRENGTH;
1210 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"FE_GET_PROPERTY DTV_STAT_SIGNAL_STRENGTH failed" +
ENO);
1214 #if DTV_STAT_FULL_DEBUG
1215 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"DTV_STAT_SIGNAL_STRENGTH " +
1216 QString(
"res=%1 len=%2 scale=%3 val=%4")
1217 .
arg(cmd.props->result)
1218 .arg(cmd.props->u.st.len)
1219 .arg(cmd.props->u.st.stat[0].scale)
1220 .arg(cmd.props->u.st.stat[0].svalue));
1224 bool tmpOk = (ret == 0) && (cmd.props->u.st.len > 0);
1231 if (cmd.props->u.st.stat[0].scale == FE_SCALE_DECIBEL)
1237 int64_t svalue = cmd.props->u.st.stat[0].svalue;
1238 if (svalue >= -100000 && svalue <= 0)
1241 value = svalue + 100000;
1242 value = value / 100000.0;
1247 else if (cmd.props->u.st.stat[0].scale == FE_SCALE_RELATIVE)
1250 value = cmd.props->u.st.stat[0].uvalue / 65535.0;
1282 int ret = ioctl(
m_fdFrontend, FE_READ_SIGNAL_STRENGTH, &sig);
1286 return sig * (1.0 / 65535.0);
1291 struct dtv_property prop = {};
1292 struct dtv_properties cmd = {};
1294 prop.cmd = DTV_STAT_CNR;
1300 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"FE_GET_PROPERTY DTV_STAT_CNR failed" +
ENO);
1304 #if DTV_STAT_FULL_DEBUG
1305 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"DTV_STAT_CNR " +
1306 QString(
"res=%1 len=%2 scale=%3 val=%4")
1307 .
arg(cmd.props->result)
1308 .arg(cmd.props->u.st.len)
1309 .arg(cmd.props->u.st.stat[0].scale)
1310 .arg(cmd.props->u.st.stat[0].svalue));
1314 bool tmpOk = (ret == 0) && (cmd.props->u.st.len > 0);
1320 if (cmd.props->u.st.stat[0].scale == FE_SCALE_DECIBEL)
1325 value = cmd.props->u.st.stat[0].svalue;
1326 value = value / 50000.0;
1332 else if (cmd.props->u.st.stat[0].scale == FE_SCALE_RELATIVE)
1335 value = cmd.props->u.st.stat[0].uvalue / 65535.0;
1346 double val = master->
GetSNR(ok);
1371 return snr * (1.0 / 65535.0);
1376 std::array<struct dtv_property,2> prop {};
1377 struct dtv_properties cmd = {};
1379 prop[0].cmd = DTV_STAT_POST_ERROR_BIT_COUNT;
1380 prop[1].cmd = DTV_STAT_POST_TOTAL_BIT_COUNT;
1381 cmd.num = prop.size();
1382 cmd.props = prop.data();
1386 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"FE_GET_PROPERTY DTV_STAT_POST_ERROR_BIT_COUNT failed" +
ENO);
1390 #if DTV_STAT_FULL_DEBUG
1391 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"DTV_STAT_POST_ERROR_BIT_COUNT " +
1392 QString(
"res=%1 len=%2 scale=%3 val=%4 res=%5 len=%6 scale=%7 val=%8")
1393 .
arg(cmd.props[0].result)
1394 .arg(cmd.props[0].u.st.len)
1395 .arg(cmd.props[0].u.st.stat[0].scale)
1396 .arg(cmd.props[0].u.st.stat[0].uvalue)
1397 .arg(cmd.props[1].result)
1398 .arg(cmd.props[1].u.st.len)
1399 .arg(cmd.props[1].u.st.stat[0].scale)
1400 .arg(cmd.props[1].u.st.stat[0].uvalue));
1404 bool tmpOk = (ret == 0) &&
1405 (cmd.props[0].u.st.len > 0) &&
1406 (cmd.props[1].u.st.len > 0);
1412 if ((cmd.props[0].u.st.stat[0].scale == FE_SCALE_COUNTER) &&
1413 (cmd.props[1].u.st.stat[0].scale == FE_SCALE_COUNTER) &&
1414 (cmd.props[1].u.st.stat[0].uvalue != 0))
1416 value =
static_cast<double>(
1417 static_cast<long double>(cmd.props[0].u.st.stat[0].uvalue) /
1418 cmd.props[1].u.st.stat[0].uvalue);
1452 return (
double) ber;
1457 struct dtv_property prop = {};
1458 struct dtv_properties cmd = {};
1460 prop.cmd = DTV_STAT_ERROR_BLOCK_COUNT;
1466 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"FE_GET_PROPERTY DTV_STAT_ERROR_BLOCK_COUNT failed" +
ENO);
1470 #if DTV_STAT_FULL_DEBUG
1471 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"DTV_STAT_ERROR_BLOCK_COUNT " +
1472 QString(
"res=%1 len=%2 scale=%3 val=%4")
1473 .
arg(cmd.props[0].result)
1474 .arg(cmd.props[0].u.st.len)
1475 .arg(cmd.props[0].u.st.stat[0].scale)
1476 .arg(cmd.props[0].u.st.stat[0].svalue));
1480 bool tmpOk = (ret == 0) && (cmd.props->u.st.len > 0);
1486 if (cmd.props->u.st.stat[0].scale == FE_SCALE_COUNTER)
1487 value = cmd.props->u.st.stat[0].uvalue;
1515 uint32_t ublocks = 0;
1516 int ret = ioctl(
m_fdFrontend, FE_READ_UNCORRECTED_BLOCKS, &ublocks);
1520 return static_cast<double>(ublocks);
1533 auto *dvbm =
dynamic_cast<DVBChannel*
>(master);
1534 if (master && !dvbm)
1542 bool is_master = (master ==
this);
1554 struct dvb_frontend_event event {};
1556 while ((ret = ioctl(fd, FE_GET_EVENT, &event)) == 0);
1557 if ((ret < 0) && (EAGAIN != errno) && (EWOULDBLOCK != errno) && (EOVERFLOW != errno))
1559 LOG(VB_CHANNEL, LOG_ERR,
LOC +
1560 QString(
"%1 FE_GET_EVENT failed: ").
arg(__func__) +
logStrerror(errno));
1589 struct timeval select_timeout = { timeout_ms/1000, (timeout_ms % 1000) * 1000 };
1590 fd_set fd_select_set;
1591 FD_ZERO( &fd_select_set);
1592 FD_SET (fd, &fd_select_set);
1597 do ret = select(fd+1, &fd_select_set,
nullptr,
nullptr, &select_timeout);
1598 while ((-1 == ret) && (EINTR == errno));
1602 LOG(VB_GENERAL, LOG_ERR,
LOC +
1603 QString(
"%1: Failed to wait on output.").
arg(__func__) +
ENO);
1609 #if ((DVB_API_VERSION > 5) || ((DVB_API_VERSION == 5) && (DVB_API_VERSION_MINOR > 10)))
1610 fe_status_t status = FE_NONE;
1611 #else // debian9, centos7
1612 fe_status_t status = (fe_status_t)0;
1615 if (ioctl(fd, FE_READ_STATUS, &status) < 0)
1617 LOG(VB_GENERAL, LOG_ERR,
LOC +
1618 QString(
"%1: FE_READ_STATUS failed.").
arg(__func__) +
ENO);
1623 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
1624 QString(
"%1: status: 0x%2 %3") .
arg(__func__)
1634 uint intermediate_freq,
bool can_fec_auto)
1636 dvb_frontend_parameters params {};
1638 params.frequency = tuning.m_frequency;
1639 params.inversion = (fe_spectral_inversion_t) (
int) tuning.m_inversion;
1645 LOG(VB_GENERAL, LOG_ERR,
1646 "DVBChan: Cannot tune to DVB-S2 transport with DVB-S card.");
1649 params.frequency = intermediate_freq;
1650 params.u.qpsk.symbol_rate = tuning.m_symbolRate;
1651 params.u.qpsk.fec_inner = can_fec_auto ? FEC_AUTO
1652 : (fe_code_rate_t) (
int) tuning.m_fec;
1657 LOG(VB_GENERAL, LOG_ERR,
1658 "DVBChan: Cannot tune DVB-S2 card with DVBv3 API.");
1663 params.u.qam.symbol_rate = tuning.m_symbolRate;
1664 params.u.qam.fec_inner = (fe_code_rate_t) (
int) tuning.m_fec;
1665 params.u.qam.modulation = (fe_modulation_t) (
int) tuning.m_modulation;
1671 params.u.ofdm.bandwidth = (fe_bandwidth_t) (
int) tuning.m_bandwidth;
1672 params.u.ofdm.code_rate_HP = (fe_code_rate_t) (
int) tuning.m_hpCodeRate;
1673 params.u.ofdm.code_rate_LP = (fe_code_rate_t) (
int) tuning.m_lpCodeRate;
1674 params.u.ofdm.constellation = (fe_modulation_t) (
int) tuning.m_modulation;
1675 params.u.ofdm.transmission_mode = (fe_transmit_mode_t) (
int) tuning.m_transMode;
1676 params.u.ofdm.guard_interval = (fe_guard_interval_t) (
int) tuning.m_guardInterval;
1677 params.u.ofdm.hierarchy_information = (fe_hierarchy_t) (
int) tuning.m_hierarchy;
1682 params.u.vsb.modulation = (fe_modulation_t) (
int) tuning.m_modulation;
1691 DTVTunerType tuner_type,
const dvb_frontend_parameters ¶ms)
1702 tuning.
m_fec = params.u.qpsk.fec_inner;
1708 tuning.
m_fec = params.u.qam.fec_inner;
1719 tuning.
m_transMode = params.u.ofdm.transmission_mode;
1721 tuning.
m_hierarchy = params.u.ofdm.hierarchy_information;
1736 uint intermediate_freq,
bool can_fec_auto,
bool do_tune)
1741 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]: m_modsys:%2 current_sys:%3")
1746 auto *cmdseq = (
struct dtv_properties*) calloc(1,
sizeof(
struct dtv_properties));
1750 cmdseq->props = (
struct dtv_property*) calloc(20,
sizeof(*(cmdseq->props)));
1751 if (!(cmdseq->props))
1762 can_fec_auto =
false;
1772 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1777 delivery_system = current_sys;
1778 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1784 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1790 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1796 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1802 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1808 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1814 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1818 LOG(VB_CHANNEL, LOG_INFO, QString(
"DVBChan[%1]: Delivery system: %2")
1823 cmdseq->props[c].cmd = DTV_DELIVERY_SYSTEM;
1824 cmdseq->props[c++].u.data = delivery_system;
1828 LOG(VB_GENERAL, LOG_ERR, QString(
"DVBChan[%1]: Delivery system: %2")
1833 cmdseq->props[c].cmd = DTV_FREQUENCY;
1834 cmdseq->props[c++].u.data = intermediate_freq ? intermediate_freq : tuning.
m_frequency;
1835 cmdseq->props[c].cmd = DTV_MODULATION;
1837 cmdseq->props[c].cmd = DTV_INVERSION;
1845 cmdseq->props[c].cmd = DTV_SYMBOL_RATE;
1852 cmdseq->props[c].cmd = DTV_INNER_FEC;
1853 cmdseq->props[c++].u.data = can_fec_auto ? FEC_AUTO
1854 : (fe_code_rate_t) (
int) tuning.
m_fec;
1861 cmdseq->props[c].cmd = DTV_BANDWIDTH_HZ;
1862 cmdseq->props[c++].u.data = (8-tuning.
m_bandwidth) * 1000000;
1863 cmdseq->props[c].cmd = DTV_CODE_RATE_HP;
1865 cmdseq->props[c].cmd = DTV_CODE_RATE_LP;
1867 cmdseq->props[c].cmd = DTV_TRANSMISSION_MODE;
1869 cmdseq->props[c].cmd = DTV_GUARD_INTERVAL;
1871 cmdseq->props[c].cmd = DTV_HIERARCHY;
1878 cmdseq->props[c].cmd = DTV_ROLLOFF;
1885 cmdseq->props[c].cmd = DTV_PILOT;
1886 cmdseq->props[c++].u.data = PILOT_AUTO;
1887 cmdseq->props[c].cmd = DTV_ROLLOFF;
1888 cmdseq->props[c++].u.data = tuning.
m_rolloff;
1892 cmdseq->props[c++].cmd = DTV_TUNE;