39 #include <sys/select.h>
41 #include <sys/types.h>
48 #include "libmythbase/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())
73 #define DTV_STAT_FULL_DEBUG 0 // All DTV_STAT_xxx values
86 m_key += QString(
":%1")
96 else if (master !=
nullptr)
120 QMutexLocker master_locker(&(master->m_hwLock));
121 QMutexLocker new_master_locker(&(new_master->
m_hwLock));
122 new_master->
m_isOpen = master->m_isOpen;
146 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Closing DVB channel");
150 IsOpenMap::iterator it =
m_isOpen.find(who);
157 if (master !=
nullptr && master !=
this)
191 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Opening DVB channel");
196 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Use legacy DVBv3 API");
210 if (!master->
Open(who))
248 QByteArray devn = dvbdev.toLatin1();
250 for (
int tries = 1; ; ++tries)
257 LOG(VB_GENERAL, LOG_WARNING,
LOC +
258 "Opening DVB frontend device failed." +
ENO);
260 if (tries >= 5 || (errno != EBUSY && errno != EAGAIN))
262 LOG(VB_GENERAL, LOG_ERR,
LOC +
263 QString(
"Failed to open DVB frontend device due to "
264 "fatal error or too many attempts."));
267 std::this_thread::sleep_for(50ms);
272 dvb_frontend_info info {};
275 LOG(VB_GENERAL, LOG_ERR,
LOC +
276 "Failed to get frontend information." +
ENO);
290 LOG(VB_CHANNEL, LOG_INFO,
LOC +
294 LOG(VB_CHANNEL, LOG_INFO, QString(
" %1").arg(capstr));
299 std::array<struct dtv_property,2> prop = {};
300 struct dtv_properties cmd = {};
302 prop[0].cmd = DTV_API_VERSION;
303 prop[1].cmd = DTV_DELIVERY_SYSTEM;
306 cmd.props = prop.data();
310 prop[0].u.data = 0x300;
311 prop[1].u.data = SYS_UNDEFINED;
337 if (info.caps & FE_CAN_2G_MODULATION)
342 if (info.caps & FE_CAN_TURBO_FEC)
357 if (info.caps & FE_CAN_2G_MODULATION)
364 if (info.caps & (FE_CAN_8VSB | FE_CAN_16VSB))
369 if (info.caps & (FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_QAM_AUTO))
371 delsys = SYS_DVBC_ANNEX_B;
379 LOG(VB_GENERAL, LOG_ERR,
LOC +
380 QString(
"Frontend '%1' delivery system not detected.").arg(
m_frontendName));
389 std::array<struct dtv_property,1> prop = {};
390 struct dtv_properties cmd = {};
392 prop[0].cmd = DTV_ENUM_DELSYS;
395 cmd.props = prop.data();
399 LOG(VB_GENERAL, LOG_ERR,
LOC +
400 QString(
"Frontend '%1' FE_GET_PROPERTY failed.").arg(
m_frontendName));
405 int p_num_systems = prop[0].u.buffer.len;
406 for (
int i = 0; i < p_num_systems; i++)
412 if (p_num_systems == 0) {
413 LOG(VB_GENERAL, LOG_ERR,
LOC +
414 QString(
"Frontend '%1' returned 0 supported delivery systems!").arg(
m_frontendName));
424 LOG(VB_CHANNEL, LOG_INFO,
LOC +
426 LOG(VB_CHANNEL, LOG_INFO,
LOC +
427 QString(
"DVB version:0x%1 ").arg(
m_version,3,16,QChar(
'0')) +
432 LOG(VB_CHANNEL, LOG_INFO,
"Supported delivery systems: ");
437 LOG(VB_CHANNEL, LOG_INFO, QString(
" [%1]")
438 .arg(delsys.toString()));
442 LOG(VB_CHANNEL, LOG_INFO, QString(
" %1")
443 .arg(delsys.toString()));
447 uint32_t frq_min = info.frequency_min;
448 uint32_t frq_max = info.frequency_max;
449 uint32_t frq_stp = info.frequency_stepsize;
451 if (info.type == FE_QPSK)
459 LOG(VB_CHANNEL, LOG_INFO, QString(
"Frequency range for the current standard:"));
460 LOG(VB_CHANNEL, LOG_INFO, QString(
" From: %1 Hz").arg(frq_min,11));
461 LOG(VB_CHANNEL, LOG_INFO, QString(
" To: %1 Hz").arg(frq_max,11));
462 LOG(VB_CHANNEL, LOG_INFO, QString(
" Step: %1 Hz").arg(frq_stp,11));
464 if (info.type == FE_QPSK || info.type == FE_QAM)
466 LOG(VB_CHANNEL, LOG_INFO, QString(
"Symbol rate ranges for the current standard:"));
467 LOG(VB_CHANNEL, LOG_INFO, QString(
" From: %1 Baud").arg(info.symbol_rate_min,11));
468 LOG(VB_CHANNEL, LOG_INFO, QString(
" To: %1 Baud").arg(info.symbol_rate_max,11));
481 LOG(VB_CHANNEL, LOG_INFO,
LOC +
482 QString(
"Change delivery system from %1 to %2.")
491 LOG(VB_CHANNEL, LOG_INFO,
LOC +
492 QString(
"Delivery system in database and in card equal, leave at %1.")
498 LOG(VB_CHANNEL, LOG_INFO,
LOC +
516 LOG(VB_CHANNEL, LOG_INFO,
LOC +
517 QString(
"Requested %1 channel is on SCR system")
522 LOG(VB_CHANNEL, LOG_INFO,
LOC +
523 QString(
"Requested %1 channel is on non-SCR system")
548 IsOpenMap::const_iterator it =
m_isOpen.find(
this);
569 LOG(VB_GENERAL, LOG_WARNING,
LOC +
570 QString(
"Frequency setting (%1) is out of range (min/max:%2/%3)")
580 LOG(VB_GENERAL, LOG_WARNING,
LOC +
581 "'Auto' inversion parameter unsupported by this driver, "
582 "falling back to 'off'.");
601 LOG(VB_GENERAL, LOG_WARNING,
LOC +
602 QString(
"Symbol Rate setting (%1) is out of range (min/max:%2/%3)")
609 LOG(VB_GENERAL, LOG_WARNING,
LOC +
610 "Selected fec_inner parameter unsupported by this driver.");
615 LOG(VB_GENERAL, LOG_WARNING,
LOC +
616 "Selected modulation parameter unsupported by this driver.");
632 LOG(VB_GENERAL, LOG_WARNING,
LOC +
633 "Selected code_rate_hp parameter unsupported by this driver.");
638 LOG(VB_GENERAL, LOG_WARNING,
LOC +
639 "Selected code_rate_lp parameter unsupported by this driver.");
645 LOG(VB_GENERAL, LOG_WARNING,
LOC +
646 "'Auto' bandwidth parameter unsupported by this driver.");
652 LOG(VB_GENERAL, LOG_WARNING,
LOC +
653 "'Auto' transmission_mode parameter unsupported by this driver.");
659 LOG(VB_GENERAL, LOG_WARNING,
LOC +
660 "'Auto' guard_interval parameter unsupported by this driver.");
666 LOG(VB_GENERAL, LOG_WARNING,
LOC +
667 "'Auto' hierarchy parameter unsupported by this driver. ");
672 LOG(VB_GENERAL, LOG_WARNING,
LOC +
673 "Selected modulation parameter unsupported by this driver.");
708 #if HAVE_FE_CAN_2G_MODULATION
712 #endif //HAVE_FE_CAN_2G_MODULATION
748 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Tune(): Invalid input."));
751 return Tune(tuning,
false,
false);
780 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Tuning on slave channel");
782 bool ok = master->
Tune(tuning, force_reset,
false);
789 uint intermediate_freq = 0;
790 bool can_fec_auto =
false;
795 LOG(VB_GENERAL, LOG_ERR,
LOC +
796 "DVB-S/S2 needs device tree for LNB handling");
804 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Tune(): Card not open!");
812 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Tuning parameters:");
814 LOG(VB_CHANNEL, LOG_INFO,
" New: " + tuning.
toString());
819 int freq_mult = (is_dvbs) ? 1 : 1000;
820 QString suffix = (is_dvbs) ?
"kHz" :
"Hz";
824 LOG(VB_CHANNEL, LOG_INFO,
LOC + QString(
"Tune(): Tuning to %1%2")
825 .arg(intermediate_freq ? intermediate_freq : tuning.
m_frequency)
832 if (tuning_delay > 0ms)
834 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Next tuning after less than %1ms, delaying by %2ms")
836 std::this_thread::sleep_for(tuning_delay);
852 LOG(VB_GENERAL, LOG_ERR,
LOC +
853 "Tune(): Failed to setup DiSEqC devices");
861 LOG(VB_GENERAL, LOG_ERR,
LOC +
862 "Tune(): No LNB for this configuration");
896 struct dtv_property p_clear = {};
897 struct dtv_properties cmdseq_clear = {};
899 p_clear.cmd = DTV_CLEAR;
900 cmdseq_clear.num = 1;
901 cmdseq_clear.props = &p_clear;
903 if ((ioctl(
m_fdFrontend, FE_SET_PROPERTY, &cmdseq_clear)) < 0)
905 LOG(VB_GENERAL, LOG_ERR,
LOC +
906 "Tune(): Clearing DTV properties cache failed." +
ENO);
914 LOG(VB_GENERAL, LOG_ERR,
LOC +
915 "Failed to convert DTVMultiplex to DTV_PROPERTY sequence");
921 for (
uint i = 0; i < cmds->num; i++)
923 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
924 QString(
"prop %1: cmd = %2, data %3")
925 .arg(i).arg(cmds->props[i].cmd)
926 .arg(cmds->props[i].u.data));
937 LOG(VB_GENERAL, LOG_ERR,
LOC +
938 "Tune(): Setting Frontend tuning parameters failed." +
ENO);
946 m_tunerType, tuning, intermediate_freq, can_fec_auto);
950 LOG(VB_GENERAL, LOG_ERR,
LOC +
951 "Tune(): Setting Frontend tuning parameters failed." +
ENO);
967 LOG(VB_CHANNEL, LOG_INFO,
LOC + QString(
"Tune(): Tuning to %1%2 skipped, already tuned")
968 .arg(intermediate_freq ? intermediate_freq : tuning.
m_frequency)
975 LOG(VB_CHANNEL, LOG_INFO,
LOC +
"Tune(): Frequency tuning successful");
994 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Card not open!");
1016 dvb_frontend_parameters params {};
1018 int res = ioctl(
m_fdFrontend, FE_GET_FRONTEND, ¶ms);
1021 LOG(VB_CHANNEL, LOG_ERR,
LOC +
"FE_GET_FRONTEND failed." +
ENO);
1040 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Card not open!");
1070 dvb_frontend_parameters params {};
1073 LOG(VB_GENERAL, LOG_ERR,
LOC +
1074 "Getting Frontend tuning parameters failed." +
ENO);
1101 query.
prepare(
"SELECT chanid, visible "
1102 "FROM channel, capturecard "
1103 "WHERE channel.deleted IS NULL AND "
1104 " capturecard.sourceid = channel.sourceid AND "
1105 " channel.channum = :CHANNUM AND "
1106 " capturecard.cardid = :INPUTID");
1117 while (query.
next())
1119 bool visible = query.
value(1).toInt() > 0;
1122 int chanid = query.
value(0).toInt();
1123 idlist.append(chanid);
1127 if (idlist.isEmpty())
1129 LOG(VB_GENERAL, LOG_WARNING,
LOC +
1130 QString(
"No visible channel ID for %1")
1135 id = idlist.value(0);
1136 if (idlist.count() > 1)
1139 for (
auto chanid : idlist)
1141 sl.append(QString::number(chanid));
1143 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
1144 QString(
"Found for '%1' multiple visible channel IDs: %2")
1149 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
1150 QString(
"Found visible channel ID %1 for '%2'")
1171 bool haslock = master->
HasLock(ok);
1177 #if ((DVB_API_VERSION > 5) || ((DVB_API_VERSION == 5) && (DVB_API_VERSION_MINOR > 10)))
1178 fe_status_t status = FE_NONE;
1179 #else // debian9, centos7
1180 fe_status_t status = (fe_status_t)0;
1183 int ret = ioctl(
m_fdFrontend, FE_READ_STATUS, &status);
1186 LOG(VB_GENERAL, LOG_ERR,
LOC +
"FE_READ_STATUS failed" +
ENO);
1190 LOG(VB_CHANNEL, LOG_DEBUG,
LOC + QString(
"%1 status: 0x%2 %3")
1191 .arg(__func__).arg(status,2,16,QChar(
'0')).arg(
toString(status)));
1197 return (status & FE_HAS_LOCK) != 0;
1202 struct dtv_property prop = {};
1203 struct dtv_properties cmd = {};
1205 prop.cmd = DTV_STAT_SIGNAL_STRENGTH;
1211 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"FE_GET_PROPERTY DTV_STAT_SIGNAL_STRENGTH failed" +
ENO);
1215 #if DTV_STAT_FULL_DEBUG
1216 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"DTV_STAT_SIGNAL_STRENGTH " +
1217 QString(
"res=%1 len=%2 scale=%3 val=%4")
1218 .arg(cmd.props->result)
1219 .arg(cmd.props->u.st.len)
1220 .arg(cmd.props->u.st.stat[0].scale)
1221 .arg(cmd.props->u.st.stat[0].svalue));
1225 bool tmpOk = (ret == 0) && (cmd.props->u.st.len > 0);
1232 if (cmd.props->u.st.stat[0].scale == FE_SCALE_DECIBEL)
1238 int64_t svalue = cmd.props->u.st.stat[0].svalue;
1239 if (svalue >= -100000 && svalue <= 0)
1242 value = svalue + 100000;
1243 value = value / 100000.0;
1248 else if (cmd.props->u.st.stat[0].scale == FE_SCALE_RELATIVE)
1251 value = cmd.props->u.st.stat[0].uvalue / 65535.0;
1283 int ret = ioctl(
m_fdFrontend, FE_READ_SIGNAL_STRENGTH, &sig);
1287 return sig * (1.0 / 65535.0);
1292 struct dtv_property prop = {};
1293 struct dtv_properties cmd = {};
1295 prop.cmd = DTV_STAT_CNR;
1301 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"FE_GET_PROPERTY DTV_STAT_CNR failed" +
ENO);
1305 #if DTV_STAT_FULL_DEBUG
1306 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"DTV_STAT_CNR " +
1307 QString(
"res=%1 len=%2 scale=%3 val=%4")
1308 .arg(cmd.props->result)
1309 .arg(cmd.props->u.st.len)
1310 .arg(cmd.props->u.st.stat[0].scale)
1311 .arg(cmd.props->u.st.stat[0].svalue));
1315 bool tmpOk = (ret == 0) && (cmd.props->u.st.len > 0);
1321 if (cmd.props->u.st.stat[0].scale == FE_SCALE_DECIBEL)
1326 value = cmd.props->u.st.stat[0].svalue;
1327 value = value / 50000.0;
1333 else if (cmd.props->u.st.stat[0].scale == FE_SCALE_RELATIVE)
1336 value = cmd.props->u.st.stat[0].uvalue / 65535.0;
1347 double val = master->
GetSNR(ok);
1372 return snr * (1.0 / 65535.0);
1377 std::array<struct dtv_property,2> prop {};
1378 struct dtv_properties cmd = {};
1380 prop[0].cmd = DTV_STAT_POST_ERROR_BIT_COUNT;
1381 prop[1].cmd = DTV_STAT_POST_TOTAL_BIT_COUNT;
1382 cmd.num = prop.size();
1383 cmd.props = prop.data();
1387 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"FE_GET_PROPERTY DTV_STAT_POST_ERROR_BIT_COUNT failed" +
ENO);
1391 #if DTV_STAT_FULL_DEBUG
1392 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"DTV_STAT_POST_ERROR_BIT_COUNT " +
1393 QString(
"res=%1 len=%2 scale=%3 val=%4 res=%5 len=%6 scale=%7 val=%8")
1394 .arg(cmd.props[0].result)
1395 .arg(cmd.props[0].u.st.len)
1396 .arg(cmd.props[0].u.st.stat[0].scale)
1397 .arg(cmd.props[0].u.st.stat[0].uvalue)
1398 .arg(cmd.props[1].result)
1399 .arg(cmd.props[1].u.st.len)
1400 .arg(cmd.props[1].u.st.stat[0].scale)
1401 .arg(cmd.props[1].u.st.stat[0].uvalue));
1405 bool tmpOk = (ret == 0) &&
1406 (cmd.props[0].u.st.len > 0) &&
1407 (cmd.props[1].u.st.len > 0);
1413 if ((cmd.props[0].u.st.stat[0].scale == FE_SCALE_COUNTER) &&
1414 (cmd.props[1].u.st.stat[0].scale == FE_SCALE_COUNTER) &&
1415 (cmd.props[1].u.st.stat[0].uvalue != 0))
1417 value =
static_cast<double>(
1418 static_cast<long double>(cmd.props[0].u.st.stat[0].uvalue) /
1419 cmd.props[1].u.st.stat[0].uvalue);
1453 return (
double) ber;
1458 struct dtv_property prop = {};
1459 struct dtv_properties cmd = {};
1461 prop.cmd = DTV_STAT_ERROR_BLOCK_COUNT;
1467 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"FE_GET_PROPERTY DTV_STAT_ERROR_BLOCK_COUNT failed" +
ENO);
1471 #if DTV_STAT_FULL_DEBUG
1472 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
"DTV_STAT_ERROR_BLOCK_COUNT " +
1473 QString(
"res=%1 len=%2 scale=%3 val=%4")
1474 .arg(cmd.props[0].result)
1475 .arg(cmd.props[0].u.st.len)
1476 .arg(cmd.props[0].u.st.stat[0].scale)
1477 .arg(cmd.props[0].u.st.stat[0].svalue));
1481 bool tmpOk = (ret == 0) && (cmd.props->u.st.len > 0);
1487 if (cmd.props->u.st.stat[0].scale == FE_SCALE_COUNTER)
1488 value = cmd.props->u.st.stat[0].uvalue;
1516 uint32_t ublocks = 0;
1517 int ret = ioctl(
m_fdFrontend, FE_READ_UNCORRECTED_BLOCKS, &ublocks);
1521 return static_cast<double>(ublocks);
1534 auto *dvbm =
dynamic_cast<DVBChannel*
>(master);
1535 if (master && !dvbm)
1543 bool is_master = (master ==
this);
1555 struct dvb_frontend_event event {};
1557 while ((ret = ioctl(fd, FE_GET_EVENT, &event)) == 0);
1558 if ((ret < 0) && (EAGAIN != errno) && (EWOULDBLOCK != errno) && (EOVERFLOW != errno))
1560 LOG(VB_CHANNEL, LOG_ERR,
LOC +
1561 QString(
"%1 FE_GET_EVENT failed: ").arg(__func__) +
logStrerror(errno));
1590 auto seconds = duration_cast<std::chrono::seconds>(timeout_ms);
1591 auto usecs = duration_cast<std::chrono::microseconds>(timeout_ms) - seconds;
1592 struct timeval select_timeout = { seconds.count(), usecs.count()};
1593 fd_set fd_select_set;
1594 FD_ZERO( &fd_select_set);
1595 FD_SET (fd, &fd_select_set);
1600 do ret = select(fd+1, &fd_select_set,
nullptr,
nullptr, &select_timeout);
1601 while ((-1 == ret) && (EINTR == errno));
1605 LOG(VB_GENERAL, LOG_ERR,
LOC +
1606 QString(
"%1: Failed to wait on output.").arg(__func__) +
ENO);
1612 #if ((DVB_API_VERSION > 5) || ((DVB_API_VERSION == 5) && (DVB_API_VERSION_MINOR > 10)))
1613 fe_status_t status = FE_NONE;
1614 #else // debian9, centos7
1615 fe_status_t status = (fe_status_t)0;
1618 if (ioctl(fd, FE_READ_STATUS, &status) < 0)
1620 LOG(VB_GENERAL, LOG_ERR,
LOC +
1621 QString(
"%1: FE_READ_STATUS failed.").arg(__func__) +
ENO);
1626 LOG(VB_CHANNEL, LOG_DEBUG,
LOC +
1627 QString(
"%1: status: 0x%2 %3") .arg(__func__)
1628 .arg(status,2,16,QChar(
'0')).arg(
toString(status)));
1637 uint intermediate_freq,
bool can_fec_auto)
1639 dvb_frontend_parameters params {};
1641 params.frequency = tuning.m_frequency;
1642 params.inversion = (fe_spectral_inversion_t) (
int) tuning.m_inversion;
1648 LOG(VB_GENERAL, LOG_ERR,
1649 "DVBChan: Cannot tune to DVB-S2 transport with DVB-S card.");
1652 params.frequency = intermediate_freq;
1653 params.u.qpsk.symbol_rate = tuning.m_symbolRate;
1654 params.u.qpsk.fec_inner = can_fec_auto ? FEC_AUTO
1655 : (fe_code_rate_t) (
int) tuning.m_fec;
1660 LOG(VB_GENERAL, LOG_ERR,
1661 "DVBChan: Cannot tune DVB-S2 card with DVBv3 API.");
1666 params.u.qam.symbol_rate = tuning.m_symbolRate;
1667 params.u.qam.fec_inner = (fe_code_rate_t) (
int) tuning.m_fec;
1668 params.u.qam.modulation = (fe_modulation_t) (
int) tuning.m_modulation;
1674 params.u.ofdm.bandwidth = (fe_bandwidth_t) (
int) tuning.m_bandwidth;
1675 params.u.ofdm.code_rate_HP = (fe_code_rate_t) (
int) tuning.m_hpCodeRate;
1676 params.u.ofdm.code_rate_LP = (fe_code_rate_t) (
int) tuning.m_lpCodeRate;
1677 params.u.ofdm.constellation = (fe_modulation_t) (
int) tuning.m_modulation;
1678 params.u.ofdm.transmission_mode = (fe_transmit_mode_t) (
int) tuning.m_transMode;
1679 params.u.ofdm.guard_interval = (fe_guard_interval_t) (
int) tuning.m_guardInterval;
1680 params.u.ofdm.hierarchy_information = (fe_hierarchy_t) (
int) tuning.m_hierarchy;
1685 params.u.vsb.modulation = (fe_modulation_t) (
int) tuning.m_modulation;
1694 DTVTunerType tuner_type,
const dvb_frontend_parameters ¶ms)
1705 tuning.
m_fec = params.u.qpsk.fec_inner;
1711 tuning.
m_fec = params.u.qam.fec_inner;
1722 tuning.
m_transMode = params.u.ofdm.transmission_mode;
1724 tuning.
m_hierarchy = params.u.ofdm.hierarchy_information;
1739 uint intermediate_freq,
bool can_fec_auto,
bool do_tune)
1744 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]: m_modsys:%2 current_sys:%3")
1745 .arg(QString::number(inputId),
1749 auto *cmdseq = (
struct dtv_properties*) calloc(1,
sizeof(
struct dtv_properties));
1753 cmdseq->props = (
struct dtv_property*) calloc(20,
sizeof(*(cmdseq->props)));
1754 if (!(cmdseq->props))
1765 can_fec_auto =
false;
1775 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1776 .arg(inputId).arg(__LINE__).arg(delivery_system.
toString()));
1780 delivery_system = current_sys;
1781 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1782 .arg(inputId).arg(__LINE__).arg(delivery_system.
toString()));
1787 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1788 .arg(inputId).arg(__LINE__).arg(delivery_system.
toString()));
1793 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1794 .arg(inputId).arg(__LINE__).arg(delivery_system.
toString()));
1799 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1800 .arg(inputId).arg(__LINE__).arg(delivery_system.
toString()));
1805 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1806 .arg(inputId).arg(__LINE__).arg(delivery_system.
toString()));
1811 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1812 .arg(inputId).arg(__LINE__).arg(delivery_system.
toString()));
1817 LOG(VB_CHANNEL, LOG_DEBUG, QString(
"DVBChan[%1]:%2 set delivery_system to %3")
1818 .arg(inputId).arg(__LINE__).arg(delivery_system.
toString()));
1821 LOG(VB_CHANNEL, LOG_INFO, QString(
"DVBChan[%1]: Delivery system: %2")
1822 .arg(inputId).arg(delivery_system.
toString()));
1826 cmdseq->props[c].cmd = DTV_DELIVERY_SYSTEM;
1827 cmdseq->props[c++].u.data = delivery_system;
1831 LOG(VB_GENERAL, LOG_ERR, QString(
"DVBChan[%1]: Delivery system: %2")
1832 .arg(inputId).arg(delivery_system.
toString()));
1836 cmdseq->props[c].cmd = DTV_FREQUENCY;
1837 cmdseq->props[c++].u.data = intermediate_freq ? intermediate_freq : tuning.
m_frequency;
1838 cmdseq->props[c].cmd = DTV_MODULATION;
1840 cmdseq->props[c].cmd = DTV_INVERSION;
1848 cmdseq->props[c].cmd = DTV_SYMBOL_RATE;
1855 cmdseq->props[c].cmd = DTV_INNER_FEC;
1856 cmdseq->props[c++].u.data = can_fec_auto ? FEC_AUTO
1857 : (fe_code_rate_t) (
int) tuning.
m_fec;
1864 cmdseq->props[c].cmd = DTV_BANDWIDTH_HZ;
1865 cmdseq->props[c++].u.data = (8-tuning.
m_bandwidth) * 1000000;
1866 cmdseq->props[c].cmd = DTV_CODE_RATE_HP;
1868 cmdseq->props[c].cmd = DTV_CODE_RATE_LP;
1870 cmdseq->props[c].cmd = DTV_TRANSMISSION_MODE;
1872 cmdseq->props[c].cmd = DTV_GUARD_INTERVAL;
1874 cmdseq->props[c].cmd = DTV_HIERARCHY;
1881 cmdseq->props[c].cmd = DTV_ROLLOFF;
1888 cmdseq->props[c].cmd = DTV_PILOT;
1889 cmdseq->props[c++].u.data = PILOT_AUTO;
1890 cmdseq->props[c].cmd = DTV_ROLLOFF;
1891 cmdseq->props[c++].u.data = tuning.
m_rolloff;
1895 cmdseq->props[c++].cmd = DTV_TUNE;