Ticket #5882: t5882_s2api_support_21272.diff

File t5882_s2api_support_21272.diff, 68.9 KB (added by Janne Grunau, 15 years ago)
  • mythtv/configure

    diff --git a/mythtv/configure b/mythtv/configure
    index 1363586..d231bcb 100755
    a b HAVE_LIST=" 
    11231123    fast_64bit
    11241124    fast_cmov
    11251125    fast_unaligned
     1126    fe_can_2g_modulation
    11261127    fork
    11271128    freetype2
    11281129    ftime
    if enabled dvb; then 
    33823383    fi
    33833384fi
    33843385
     3386
     3387enabled dvb && check_cc -I"$dvb_path" <<EOF && enable fe_can_2g_modulation
     3388#include <linux/dvb/frontend.h>
     3389int main(void) {
     3390    if (FE_CAN_2G_MODULATION != 0x10000000)
     3391        return 1;
     3392    return 0;
     3393}
     3394EOF
     3395
    33853396# Check that all MythTV build "requirements" are met:
    33863397
    33873398enabled freetype2 ||
    if enabled backend; then 
    37893800  echo "HR-PVR support            ${hdpvr-no}"
    37903801  echo "FireWire support          ${firewire-no}"
    37913802  echo "DVB support               ${dvb-no} [$dvb_path]"
     3803  echo "DVB-S2 support            ${fe_can_2g_modulation-no}"
    37923804#  echo "DBox2 support             ${dbox2-no}"
    37933805  echo "HDHomeRun support         ${hdhomerun-no}"
    37943806  echo "IPTV support              ${iptv-no}"
  • mythtv/libs/libmythtv/cardutil.cpp

    diff --git a/mythtv/libs/libmythtv/cardutil.cpp b/mythtv/libs/libmythtv/cardutil.cpp
    index 6c2cf39..cba395a 100644
    a b  
    1313#include <QDir>
    1414
    1515// MythTV headers
     16#include "mythconfig.h"
    1617#include "cardutil.h"
    1718#include "videosource.h"
    1819#include "dvbchannel.h"
    QString CardUtil::ProbeDVBType(const QString &device) 
    293294    close(fd_frontend);
    294295
    295296    DTVTunerType type(info.type);
     297#if HAVE_FE_CAN_2G_MODULATION
     298    if (type == DTVTunerType::kTunerTypeQPSK &&
     299        (info.caps & FE_CAN_2G_MODULATION))
     300        type = DTVTunerType::kTunerTypeDVB_S2;
     301#endif // HAVE_FE_CAN_2G_MODULATION
    296302    ret = (type.toString() != "UNKNOWN") ? type.toString().toUpper() : ret;
    297303#endif // USING_DVB
    298304
    bool CardUtil::IsDVBCardType(const QString card_type) 
    385391{
    386392    QString ct = card_type.toUpper();
    387393    return (ct == "DVB") || (ct == "QAM") || (ct == "QPSK") ||
    388         (ct == "OFDM") || (ct == "ATSC");
     394        (ct == "OFDM") || (ct == "ATSC") || (ct == "DVB_S2");
    389395}
    390396
    391397QString get_on_cardid(const QString &to_get, uint cardid)
  • mythtv/libs/libmythtv/cardutil.h

    diff --git a/mythtv/libs/libmythtv/cardutil.h b/mythtv/libs/libmythtv/cardutil.h
    index 328b341..ea9e54c 100644
    a b class MPUBLIC CardUtil 
    5555        HDHOMERUN = 10,
    5656        FREEBOX   = 11,
    5757        HDPVR     = 12,
     58        DVBS2     = 13,
    5859    };
    5960
    6061    static enum CARD_TYPES toCardType(const QString &name)
    class MPUBLIC CardUtil 
    8586            return FREEBOX;
    8687        if ("HDPVR" == name)
    8788            return HDPVR;
     89        if ("DVB_S2" == name)
     90            return DVBS2;
    8891        return ERROR_UNKNOWN;
    8992    }
    9093
  • mythtv/libs/libmythtv/channelscan/channelimporter.cpp

    diff --git a/mythtv/libs/libmythtv/channelscan/channelimporter.cpp b/mythtv/libs/libmythtv/channelscan/channelimporter.cpp
    index bb1711c..9931128 100644
    a b void ChannelImporter::CleanupDuplicates(ScanDTVTransportList &transports) const 
    530530
    531531    bool is_dvbs =
    532532        (DTVTunerType::kTunerTypeQPSK   == tuner_type) ||
    533         (DTVTunerType::kTunerTypeDVB_S  == tuner_type) ||
    534533        (DTVTunerType::kTunerTypeDVB_S2 == tuner_type);
    535534
    536535    uint freq_mult = (is_dvbs) ? 1 : 1000;
    ScanDTVTransportList ChannelImporter::GetDBTransports( 
    604603
    605604    bool is_dvbs =
    606605        (DTVTunerType::kTunerTypeQPSK   == tuner_type) ||
    607         (DTVTunerType::kTunerTypeDVB_S  == tuner_type) ||
    608606        (DTVTunerType::kTunerTypeDVB_S2 == tuner_type);
    609607
    610608    uint freq_mult = (is_dvbs) ? 1 : 1000;
  • mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp

    diff --git a/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp b/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp
    index 60a6661..49d311c 100644
    a b bool ChannelScanSM::ScanTransportsStartingOn( 
    15061506    QMap<QString,QString>::const_iterator it;
    15071507
    15081508    if (startChan.find("std")        == startChan.end() ||
    1509         startChan.find("modulation") == startChan.end())
     1509        startChan.find("type")      == startChan.end())
    15101510    {
    15111511        return false;
    15121512    }
    15131513
    15141514    QString std    = *startChan.find("std");
    1515     QString mod    = (*(startChan.find("modulation"))).toUpper();
    15161515    QString si_std = (std.toLower() != "atsc") ? "dvb" : "atsc";
    1517     QString name   = "";
    15181516    bool    ok     = false;
    15191517
    15201518    if (scanning)
    bool ChannelScanSM::ScanTransportsStartingOn( 
    15261524    DTVMultiplex tuning;
    15271525
    15281526    DTVTunerType type;
    1529 
    1530     if (std == "dvb")
    1531     {
    1532         ok = type.Parse(mod);
    1533     }
    1534     else if (std == "atsc")
    1535     {
    1536         type = DTVTunerType::kTunerTypeATSC;
    1537         ok = true;
    1538     }
     1527    ok = type.Parse(startChan["type"]);
    15391528
    15401529    if (ok)
    15411530    {
    bool ChannelScanSM::ScanTransportsStartingOn( 
    15471536            startChan["coderate_hp"],    startChan["coderate_lp"],
    15481537            startChan["constellation"],  startChan["trans_mode"],
    15491538            startChan["guard_interval"], startChan["hierarchy"],
    1550             startChan["modulation"],     startChan["bandwidth"]);
     1539            startChan["modulation"],     startChan["bandwidth"],
     1540            startChan["mod_sys"],        startChan["rolloff"]);
    15511541    }
    15521542
    15531543    if (ok)
  • mythtv/libs/libmythtv/channelscan/channelscanmiscsettings.h

    diff --git a/mythtv/libs/libmythtv/channelscan/channelscanmiscsettings.h b/mythtv/libs/libmythtv/channelscan/channelscanmiscsettings.h
    index 855bed7..3b3122c 100644
    a b class ScanHierarchy: public ComboBoxSetting, public TransientStorage 
    248248    };
    249249};
    250250
     251class ScanModSys: public ComboBoxSetting, public TransientStorage
     252{
     253    public:
     254    ScanModSys() : ComboBoxSetting(this)
     255    {
     256        setLabel(QObject::tr("Mod Sys"));
     257        setHelpText(QObject::tr("Modulation system (Default: DVB-S)"));
     258        addSelection("DVB-S");
     259        addSelection("DVB-S2");
     260    };
     261};
     262
     263class ScanRollOff: public ComboBoxSetting, public TransientStorage
     264{
     265    public:
     266    ScanRollOff() : ComboBoxSetting(this)
     267    {
     268        setLabel(QObject::tr("Rolloff"));
     269        setHelpText(QObject::tr("Roll Off factor (Default: 0.35)"));
     270        addSelection("0.35");
     271        addSelection("0.20");
     272        addSelection("0.25");
     273        addSelection(QObject::tr("Auto"),"auto");
     274    };
     275};
     276
    251277class PaneError : public HorizontalConfigurationGroup
    252278{
    253279  public:
  • mythtv/libs/libmythtv/channelscan/channelscanner.cpp

    diff --git a/mythtv/libs/libmythtv/channelscan/channelscanner.cpp b/mythtv/libs/libmythtv/channelscan/channelscanner.cpp
    index ce550ae..79a1db1 100644
    a b void ChannelScanner::Scan( 
    158158        ok = sigmonScanner->ScanTransports(
    159159            sourceid, freq_std, mod, tbl, tbl_start, tbl_end);
    160160    }
    161     else if ((ScanTypeSetting::NITAddScan_DVBT == scantype) ||
    162              (ScanTypeSetting::NITAddScan_DVBS == scantype) ||
    163              (ScanTypeSetting::NITAddScan_DVBC == scantype))
     161    else if ((ScanTypeSetting::NITAddScan_DVBT  == scantype) ||
     162             (ScanTypeSetting::NITAddScan_DVBS  == scantype) ||
     163             (ScanTypeSetting::NITAddScan_DVBS2 == scantype) ||
     164             (ScanTypeSetting::NITAddScan_DVBC  == scantype))
    164165    {
    165166        VERBOSE(VB_CHANSCAN, LOC + "ScanTransports()");
    166167
  • mythtv/libs/libmythtv/channelscan/modulationsetting.h

    diff --git a/mythtv/libs/libmythtv/channelscan/modulationsetting.h b/mythtv/libs/libmythtv/channelscan/modulationsetting.h
    index 88f0254..67e25b2 100644
    a b class ScanModulationSetting: public ComboBoxSetting 
    5858    {
    5959        addSelection(QObject::tr("Auto"),"auto",true);
    6060        addSelection("QPSK","qpsk");
    61 #ifdef FE_GET_EXTENDED_INFO
    62         addSelection("8PSK","8psk");
    63 #endif
    6461        addSelection("QAM 16","qam_16");
    6562        addSelection("QAM 32","qam_32");
    6663        addSelection("QAM 64","qam_64");
    class ScanConstellation: public ScanModulationSetting, 
    9087    };
    9188};
    9289
     90class ScanDVBSModulation: public ComboBoxSetting, public TransientStorage
     91{
     92  public:
     93    ScanDVBSModulation() : ComboBoxSetting(this)
     94    {
     95
     96        addSelection("QPSK",  "qpsk", true);
     97        addSelection("8PSK",  "8psk");
     98        addSelection("QAM 16","qam_16");
     99
     100        setLabel(QObject::tr("Modulation"));
     101        setHelpText(
     102            QObject::tr("Modulation, QPSK, 8PSK, QAM-16") + " " +
     103            QObject::tr("Most DVB-S transponders use QPSK, DVB-S2 8PSK "
     104                        "QAM-16 is not available for DVB-S2 transports."));
     105    }
     106};
     107
    93108#endif // _MODULATION_SETTING_H_
    94109
  • mythtv/libs/libmythtv/channelscan/panedvbs2.h

    diff --git a/mythtv/libs/libmythtv/channelscan/panedvbs2.h b/mythtv/libs/libmythtv/channelscan/panedvbs2.h
    index fe40ab2..7247b7d 100644
    a b class PaneDVBS2 : public HorizontalConfigurationGroup 
    2222        left->addChild( pfrequency  = new ScanFrequency());
    2323        left->addChild( ppolarity   = new ScanPolarity());
    2424        left->addChild( psymbolrate = new ScanSymbolRateDVBS());
     25        left->addChild( pmod_sys    = new ScanModSys());
    2526        right->addChild(pfec        = new ScanFec());
    26         right->addChild(pmodulation = new ScanModulation());
     27        right->addChild(pmodulation = new ScanDVBSModulation());
    2728        right->addChild(pinversion  = new ScanInversion());
     29        right->addChild(prolloff    = new ScanRollOff());
    2830        addChild(left);
    2931        addChild(right);     
    3032    }
    class PaneDVBS2 : public HorizontalConfigurationGroup 
    3537    QString fec(void)        const { return pfec->getValue();        }
    3638    QString polarity(void)   const { return ppolarity->getValue();   }
    3739    QString modulation(void) const { return pmodulation->getValue(); }
     40    QString mod_sys(void)    const { return pmod_sys->getValue();    }
     41    QString rolloff(void)    const { return prolloff->getValue();    }
    3842
    3943  protected:
    4044    ScanFrequency  *pfrequency;
    class PaneDVBS2 : public HorizontalConfigurationGroup 
    4246    ScanInversion  *pinversion;
    4347    ScanFec        *pfec;
    4448    ScanPolarity   *ppolarity;
    45     ScanModulation *pmodulation;
     49    ScanDVBSModulation *pmodulation;
     50    ScanModSys     *pmod_sys;
     51    ScanRollOff    *prolloff;
    4652};
    4753
    4854#endif // _PANE_DVBS2_H_
  • mythtv/libs/libmythtv/channelscan/scaninfo.cpp

    diff --git a/mythtv/libs/libmythtv/channelscan/scaninfo.cpp b/mythtv/libs/libmythtv/channelscan/scaninfo.cpp
    index faeafd5..e01035e 100644
    a b ScanDTVTransportList LoadScan(uint scanid) 
    8181        "       hp_code_rate,      lp_code_rate,   modulation, "
    8282        "       transmission_mode, guard_interval, hierarchy, "
    8383        "       modulation,        bandwidth,      sistandard, "
    84         "       tuner_type,        transportid "
     84        "       tuner_type,        transportid,    mod_sys, "
     85        "       rolloff "
    8586        "FROM channelscan_dtv_multiplex "
    8687        "WHERE scanid = :SCANID");
    8788    query.bindValue(":SCANID", scanid);
    ScanDTVTransportList LoadScan(uint scanid) 
    102103            query.value(6).toString(),  query.value(7).toString(),
    103104            query.value(8).toString(),  query.value(9).toString(),
    104105            query.value(10).toString(), query.value(11).toString(),
    105             query.value(12).toString());
     106            query.value(12).toString(), query.value(13).toString(),
     107            query.value(14).toString());
    106108
    107109        query2.prepare(
    108110            "SELECT "
  • mythtv/libs/libmythtv/channelscan/scanwizardconfig.cpp

    diff --git a/mythtv/libs/libmythtv/channelscan/scanwizardconfig.cpp b/mythtv/libs/libmythtv/channelscan/scanwizardconfig.cpp
    index b233fee..141ed3c 100644
    a b void ScanTypeSetting::SetInput(const QString &cardids_inputname) 
    140140            addSelection(tr("Import existing scan"),
    141141                         QString::number(ExistingScanImport));
    142142            break;
     143        case CardUtil::DVBS2:
     144            addSelection(tr("Full Scan (Tuned)"),
     145                         QString::number(NITAddScan_DVBS2));
     146            addSelection(tr("Import channels.conf"),
     147                         QString::number(DVBUtilsImport));
     148            addSelection(tr("Import existing scan"),
     149                         QString::number(ExistingScanImport));
     150            break;
    143151        case CardUtil::QAM:
    144152            addSelection(tr("Full Scan (Tuned)"),
    145153                         QString::number(NITAddScan_DVBC));
    ScanOptionalConfig::ScanOptionalConfig(ScanTypeSetting *_scan_type) : 
    228236              paneDVBC);
    229237    addTarget(QString::number(ScanTypeSetting::NITAddScan_DVBS),
    230238              paneDVBS);
     239    addTarget(QString::number(ScanTypeSetting::NITAddScan_DVBS2),
     240              paneDVBS2);
    231241    addTarget(QString::number(ScanTypeSetting::NITAddScan_DVBT),
    232242              paneDVBT);
    233243    addTarget(QString::number(ScanTypeSetting::FullScan_ATSC),
    QMap<QString,QString> ScanOptionalConfig::GetStartChan(void) const 
    373383        const PaneDVBT *pane = paneDVBT;
    374384
    375385        startChan["std"]            = "dvb";
     386        startChan["type"]           = "OFDM";
    376387        startChan["frequency"]      = pane->frequency();
    377388        startChan["inversion"]      = pane->inversion();
    378389        startChan["bandwidth"]      = pane->bandwidth();
    379         startChan["modulation"]     = "ofdm";
    380390        startChan["coderate_hp"]    = pane->coderate_hp();
    381391        startChan["coderate_lp"]    = pane->coderate_lp();
    382392        startChan["constellation"]  = pane->constellation();
    QMap<QString,QString> ScanOptionalConfig::GetStartChan(void) const 
    389399        const PaneDVBS *pane = paneDVBS;
    390400
    391401        startChan["std"]        = "dvb";
     402        startChan["type"]       = "QPSK";
    392403        startChan["frequency"]  = pane->frequency();
    393404        startChan["inversion"]  = pane->inversion();
    394405        startChan["symbolrate"] = pane->symbolrate();
    395406        startChan["fec"]        = pane->fec();
    396         startChan["modulation"] = "qpsk";
    397407        startChan["polarity"]   = pane->polarity();
    398408    }
    399409    else if (ScanTypeSetting::NITAddScan_DVBC == st)
    QMap<QString,QString> ScanOptionalConfig::GetStartChan(void) const 
    401411        const PaneDVBC *pane = paneDVBC;
    402412
    403413        startChan["std"]        = "dvb";
     414        startChan["type"]       = "QAM";
     415        startChan["frequency"]  = pane->frequency();
     416        startChan["inversion"]  = pane->inversion();
     417        startChan["symbolrate"] = pane->symbolrate();
     418        startChan["fec"]        = pane->fec();
     419        startChan["modulation"] = pane->modulation();
     420    }
     421    else if (ScanTypeSetting::NITAddScan_DVBS2 == st)
     422    {
     423        const PaneDVBS2 *pane = paneDVBS2;
     424
     425        startChan["std"]        = "dvb";
     426        startChan["type"]       = "DVB_S2";
    404427        startChan["frequency"]  = pane->frequency();
    405428        startChan["inversion"]  = pane->inversion();
    406429        startChan["symbolrate"] = pane->symbolrate();
    407430        startChan["fec"]        = pane->fec();
    408431        startChan["modulation"] = pane->modulation();
     432        startChan["polarity"]   = pane->polarity();
     433        startChan["mod_sys"]    = pane->mod_sys();
     434        startChan["rolloff"]    = pane->rolloff();
    409435    }
    410436
    411437    return startChan;
  • mythtv/libs/libmythtv/channelscan/scanwizardconfig.h

    diff --git a/mythtv/libs/libmythtv/channelscan/scanwizardconfig.h b/mythtv/libs/libmythtv/channelscan/scanwizardconfig.h
    index 178bec6..b419d2a 100644
    a b class ScanTypeSetting : public ComboBoxSetting, public TransientStorage 
    6868        // seen in the Network Information Tables to the scan.
    6969        NITAddScan_DVBT,
    7070        NITAddScan_DVBS,
     71        NITAddScan_DVBS2,
    7172        NITAddScan_DVBC,
    7273        // Scan of all transports already in the database
    7374        FullTransportScan,
  • mythtv/libs/libmythtv/channelutil.cpp

    diff --git a/mythtv/libs/libmythtv/channelutil.cpp b/mythtv/libs/libmythtv/channelutil.cpp
    index df12092..b100a54 100644
    a b static uint insert_dtv_multiplex( 
    127127    signed char trans_mode,
    128128    QString     inner_FEC,     QString      constellation,
    129129    signed char hierarchy,     QString      hp_code_rate,
    130     QString     lp_code_rate,  QString      guard_interval)
     130    QString     lp_code_rate,  QString      guard_interval,
     131    QString     mod_sys,       QString      rolloff)
    131132{
    132133    MSqlQuery query(MSqlQuery::InitCon());
    133134
    static uint insert_dtv_multiplex( 
    174175        "lp_code_rate     = :LP_CODE_RATE, " : "";
    175176    updateStr += (!guard_interval.isNull()) ?
    176177        "guard_interval   = :GUARD_INTERVAL, " : "";
     178    updateStr += (!mod_sys.isNull()) ?
     179        "mod_sys          = :MOD_SYS, " : "";
     180    updateStr += (symbol_rate >= 0) ?
     181        "rolloff          = :ROLLOFF, " : "";
    177182    updateStr += (transport_id && !isDVB) ?
    178183        "transportid      = :TRANSPORTID, " : "";
    179184
    static uint insert_dtv_multiplex( 
    205210    insertStr += (!hp_code_rate.isNull())   ? "hp_code_rate, "      : "";
    206211    insertStr += (!lp_code_rate.isNull())   ? "lp_code_rate, "      : "";
    207212    insertStr += (!guard_interval.isNull()) ? "guard_interval, "    : "";
     213    insertStr += (!mod_sys.isNull())        ? "mod_sys, "           : "";
     214    insertStr += (!rolloff.isNull())        ? "rolloff, "           : "";
    208215    insertStr = insertStr.left(insertStr.length()-2) + ") ";
    209216
    210217    insertStr +=
    static uint insert_dtv_multiplex( 
    224231    insertStr += (!hp_code_rate.isNull())   ? ":HP_CODE_RATE, "     : "";
    225232    insertStr += (!lp_code_rate.isNull())   ? ":LP_CODE_RATE, "     : "";
    226233    insertStr += (!guard_interval.isNull()) ? ":GUARD_INTERVAL, "   : "";
     234    insertStr += (!mod_sys.isNull())        ? ":MOD_SYS, "          : "";
     235    insertStr += (!rolloff.isNull())        ? ":ROLLOFF, "          : "";
    227236    insertStr = insertStr.left(insertStr.length()-2) + ");";
    228237
    229238    query.prepare((mplex) ? updateStr : insertStr);
    static uint insert_dtv_multiplex( 
    284293        query.bindValue(":LP_CODE_RATE",  lp_code_rate);
    285294    if (!guard_interval.isNull())
    286295        query.bindValue(":GUARD_INTERVAL",guard_interval);
     296    if (!mod_sys.isNull())
     297        query.bindValue(":MOD_SYS",       mod_sys);
     298    if (!rolloff.isNull())
     299        query.bindValue(":ROLLOFF",       rolloff);
    287300
    288301    if (!query.exec() || !query.isActive())
    289302    {
    void handle_transport_desc(vector<uint> &muxes, const MPEGDescriptor &desc, 
    337350            cd.TransmissionModeString()[0].toAscii(),
    338351            QString(),                         cd.ConstellationString(),
    339352            cd.HierarchyString()[0].toAscii(), cd.CodeRateHPString(),
    340             cd.CodeRateLPString(),             cd.GuardIntervalString());
     353            cd.CodeRateLPString(),             cd.GuardIntervalString(),
     354            QString(),                         QString());
    341355
    342356        if (mux)
    343357            muxes.push_back(mux);
    void handle_transport_desc(vector<uint> &muxes, const MPEGDescriptor &desc, 
    364378            -1,
    365379            cd.FECInnerString(),  QString(),
    366380            -1,                   QString(),
    367             QString(),            QString());
     381            QString(),            QString(),
     382            cd.ModulationSystemString(), cd.RollOffString());
    368383
    369384        if (mux)
    370385            muxes.push_back(mux);
    void handle_transport_desc(vector<uint> &muxes, const MPEGDescriptor &desc, 
    387402            -1,
    388403            cd.FECInnerString(),  QString::null,
    389404            -1,                   QString::null,
     405            QString::null,        QString::null,
    390406            QString::null,        QString::null);
    391407
    392408        if (mux)
    uint ChannelUtil::CreateMultiplex(int sourceid, QString sistandard, 
    407423        -1,
    408424        QString::null,      QString::null,
    409425        -1,                 QString::null,
     426        QString::null,      QString::null,
    410427        QString::null,      QString::null);
    411428}
    412429
    uint ChannelUtil::CreateMultiplex( 
    420437    signed char trans_mode,
    421438    QString     inner_FEC,    QString     constellation,
    422439    signed char hierarchy,    QString     hp_code_rate,
    423     QString     lp_code_rate, QString     guard_interval)
     440    QString     lp_code_rate, QString     guard_interval,
     441    QString     mod_sys,      QString     rolloff)
    424442{
    425443    return insert_dtv_multiplex(
    426444        sourceid,           sistandard,
    uint ChannelUtil::CreateMultiplex( 
    432450        trans_mode,
    433451        inner_FEC,          constellation,
    434452        hierarchy,          hp_code_rate,
    435         lp_code_rate,       guard_interval);
     453        lp_code_rate,       guard_interval,
     454        mod_sys,            rolloff);
    436455}
    437456
    438457uint ChannelUtil::CreateMultiplex(uint sourceid, const DTVMultiplex &mux,
    uint ChannelUtil::CreateMultiplex(uint sourceid, const DTVMultiplex &mux, 
    448467        mux.trans_mode.toChar().toAscii(),
    449468        mux.fec.toString(),               mux.modulation.toString(),
    450469        mux.hierarchy.toChar().toAscii(), mux.hp_code_rate.toString(),
    451         mux.lp_code_rate.toString(),      mux.guard_interval.toString());
     470        mux.lp_code_rate.toString(),      mux.guard_interval.toString(),
     471        mux.mod_sys.toString(),           mux.rolloff.toString());
    452472}
    453473
    454474
  • mythtv/libs/libmythtv/channelutil.h

    diff --git a/mythtv/libs/libmythtv/channelutil.h b/mythtv/libs/libmythtv/channelutil.h
    index ed9fdb4..31de276 100644
    a b class MPUBLIC ChannelUtil 
    6767        signed char trans_mode,
    6868        QString     inner_FEC,    QString     constellation,
    6969        signed char hierarchy,    QString     hp_code_rate,
    70         QString     lp_code_rate, QString     guard_interval);
     70        QString     lp_code_rate, QString     guard_interval,
     71        QString     mod_sys,      QString     rolloff);
    7172
    7273    static uint    CreateMultiplex(uint sourceid, const DTVMultiplex&,
    7374                                   int transport_id, int network_id);
  • mythtv/libs/libmythtv/dtvconfparser.cpp

    diff --git a/mythtv/libs/libmythtv/dtvconfparser.cpp b/mythtv/libs/libmythtv/dtvconfparser.cpp
    index 1dfedc1..bbaacc7 100644
    a b DTVConfParser::return_t DTVConfParser::Parse(void) 
    112112        {
    113113            if ((type == OFDM) && (str == "T"))
    114114                ok &= ParseVDR(list, channelNo);
    115             else if ((type == QPSK) && (str == "S"))
     115            else if ((type == QPSK || type == DVBS2) && (str == "S"))
    116116                ok &= ParseVDR(list, channelNo);
    117117            else if ((type == QAM) && (str == "C"))
    118118                ok &= ParseVDR(list, channelNo);
    DTVConfParser::return_t DTVConfParser::Parse(void) 
    121121            ok &= ParseConfOFDM(list);
    122122        else if (type == ATSC)
    123123            ok &= ParseConfATSC(list);
    124         else if (type == QPSK)
     124        else if (type == QPSK || type == DVBS2)
    125125            ok &= ParseConfQPSK(list);
    126126        else if (type == QAM)
    127127            ok &= ParseConfQAM(list);
    bool DTVConfParser::ParseVDR(const QStringList &tokens, int channelNo) 
    275275            case 'L':
    276276                mux.polarity.ParseVDR(ori);
    277277                break;
     278            case 'S':
     279                mux.mod_sys.ParseVDR(params);
     280                break;
     281            case 'O':
     282                mux.rolloff.ParseVDR(params);
     283                break;
    278284            default:
    279285                return false;
    280286        }
  • mythtv/libs/libmythtv/dtvconfparser.h

    diff --git a/mythtv/libs/libmythtv/dtvconfparser.h b/mythtv/libs/libmythtv/dtvconfparser.h
    index 2795493..a230782 100644
    a b class DTVConfParser 
    8080{
    8181  public:
    8282    enum return_t   { ERROR_CARDTYPE, ERROR_OPEN, ERROR_PARSE, OK };
    83     enum cardtype_t { ATSC, OFDM, QPSK, QAM, UNKNOWN };
     83    enum cardtype_t { ATSC, OFDM, QPSK, QAM, DVBS2, UNKNOWN };
    8484
    8585    DTVConfParser(enum cardtype_t _type, uint sourceid, const QString &_file);
    8686    virtual ~DTVConfParser() { }
  • mythtv/libs/libmythtv/dtvconfparserhelpers.cpp

    diff --git a/mythtv/libs/libmythtv/dtvconfparserhelpers.cpp b/mythtv/libs/libmythtv/dtvconfparserhelpers.cpp
    index 697e882..8117fe7 100644
    a b bool DTVParamHelper::ParseParam(const QString &symbol, int &value, 
    1212
    1313    while (!p->symbol.isEmpty())
    1414    {
    15         if (p->symbol == symbol.left(p->symbol.length()))
     15        if (p->symbol == symbol) //.left(p->symbol.length()))
    1616        {
    1717            //symbol = symbol.mid(p->symbol.length());
    1818            value = p->value;
    void DTVTunerType::initStr(void) 
    4747    dtv_tt_canonical_str[kTunerTypeQAM]     = "QAM";
    4848    dtv_tt_canonical_str[kTunerTypeOFDM]    = "OFDM";
    4949    dtv_tt_canonical_str[kTunerTypeATSC]    = "ATSC";
    50     dtv_tt_canonical_str[kTunerTypeDVB_S]   = "DVB_S";
    51     dtv_tt_canonical_str[kTunerTypeDVB_C]   = "DVB_C";
    52     dtv_tt_canonical_str[kTunerTypeDVB_T]   = "DVB_T";
    5350    dtv_tt_canonical_str[kTunerTypeDVB_S2]  = "DVB_S2";
    5451    dtv_tt_canonical_str[kTunerTypeUnknown] = "UNKNOWN";
    5552}
    const DTVParamHelperStruct DTVTunerType::parseTable[] = 
    6966    { "QAM",     kTunerTypeQAM     },
    7067    { "OFDM",    kTunerTypeOFDM    },
    7168    { "ATSC",    kTunerTypeATSC    },
    72     { "DVB_S",   kTunerTypeDVB_S   },
    73     { "DVB_C",   kTunerTypeDVB_C   },
    74     { "DVB_T",   kTunerTypeDVB_T   },
    7569    { "DVB_S2",  kTunerTypeDVB_S2  },
    7670    { "UNKNOWN", kTunerTypeUnknown },
    7771    { NULL,      kTunerTypeUnknown },
    const DTVParamHelperStruct DTVCodeRate::confTable[] = 
    155149    { "FEC_7_8",  kFEC_7_8  },
    156150    { "FEC_8_9",  kFEC_8_9  },
    157151    { "FEC_NONE", kFECNone },
     152    { "FEC_3_5",  kFEC_3_5  },
     153    { "FEC_9_10", kFEC_9_10 },
    158154    { NULL,       kFECAuto },
    159155};
    160156
    const DTVParamHelperStruct DTVCodeRate::vdrTable[] = 
    170166    { "78",  kFEC_7_8 },
    171167    { "89",  kFEC_8_9 },
    172168    { "0",   kFECNone },
     169    { "35",  kFEC_3_5 },
     170    { "910", kFEC_9_10 },
    173171    { NULL,  kFECAuto }
    174172};
    175173
    const char *DTVCodeRate::dbStr[DTVCodeRate::kDBStrCnt] = 
    199197     "6/7",  ///< kFEC_6_7
    200198     "7/8",  ///< kFEC_7_8
    201199     "8/9",  ///< kFEC_8_9
    202      "auto"  ///< kFECAuto
     200     "auto", ///< kFECAuto
     201     "3/5",  ///< KFEC_3_5
     202     "9/10",  ///< KFEC_9_10
    203203};
    204204
    205205const DTVParamHelperStruct DTVModulation::confTable[] =
    const DTVParamHelperStruct DTVModulation::confTable[] = 
    213213   { "QPSK",     kModulationQPSK    },
    214214   { "8VSB",     kModulation8VSB    },
    215215   { "16VSB",    kModulation16VSB   },
    216    { "2VSB",     kModulation2VSB    },
    217    { "4VSB",     kModulation4VSB    },
    218    { "BPSK",     kModulationBPSK    },
     216   { "8PSK",     kModulation8PSK    },
    219217   { "16APSK",   kModulation16APSK  },
    220218   { "32APSK",   kModulation32APSK  },
    221    { "8PSK",     kModulation8PSK    },
    222    { "16PSK",    kModulation16PSK   },
     219   { "DQPSK",    kModulationDQPSK   },
     220   { "16PSK",    kModulationInvalid },
     221   { "2VSB",     kModulationInvalid },
     222   { "4VSB",     kModulationInvalid },
     223   { "BPSK",     kModulationInvalid },
    223224   { "analog",   kModulationAnalog  },
    224225   { NULL,       kModulationQAMAuto },
    225226};
    226227
    227228const DTVParamHelperStruct DTVModulation::vdrTable[] =
    228229{
    229    { "999", kModulationQAMAuto },
     230   { "998", kModulationQAMAuto },
    230231   { "16",  kModulationQAM16   },
    231232   { "32",  kModulationQAM32   },
    232233   { "64",  kModulationQAM64   },
    233234   { "128", kModulationQAM128  },
    234235   { "256", kModulationQAM256  },
    235    { "0",   kModulationQPSK    },
     236   { "2",   kModulationQPSK    },
     237   { "5",   kModulation8PSK    },
     238   { "6",   kModulation16APSK  },
     239   { "7",   kModulation32APSK  },
     240   { "10",  kModulation8VSB    },
     241   { "11",  kModulation16VSB   },
    236242   { NULL,  kModulationQAMAuto },
    237243};
    238244
    const DTVParamHelperStruct DTVModulation::parseTable[] = 
    247253   { "qpsk",     kModulationQPSK    },
    248254   { "8vsb",     kModulation8VSB    },
    249255   { "16vsb",    kModulation16VSB   },
    250    { "2vsb",     kModulation2VSB    },
    251    { "4vsb",     kModulation4VSB    },
    252    { "bpsk",     kModulationBPSK    },
     256   { "8psk",     kModulation8PSK    },
    253257   { "16apsk",   kModulation16APSK  },
    254258   { "32apsk",   kModulation32APSK  },
    255    { "8psk",     kModulation8PSK    },
    256    { "16psk",    kModulation16PSK   },
     259   { "dqpsk",    kModulationDQPSK   },
    257260   // alternates
    258261   { "a",        kModulationQAMAuto },
    259262   { "qam_auto", kModulationQAMAuto },
    const DTVParamHelperStruct DTVModulation::parseTable[] = 
    265268   // qpsk, no alternative
    266269   { "8-vsb",    kModulation8VSB    },
    267270   { "16-vsb",   kModulation16VSB   },
    268    { "2-vsb",    kModulation2VSB    },
    269    { "4-vsb",    kModulation4VSB    },
    270271   // bpsk, no alternative
    271272   { "16-apsk",  kModulation16APSK  },
    272273   { "32-apsk",  kModulation32APSK  },
    273274   { "8-psk",    kModulation8PSK    },
    274    { "16-psk",   kModulation16PSK   },
     275   // removed modulations and alternatives
     276   { "bpsk",     kModulationInvalid },
     277   { "2vsb",     kModulationInvalid },
     278   { "2-vsb",    kModulationInvalid },
     279   { "4vsb",     kModulationInvalid },
     280   { "4-vsb",    kModulationInvalid },
     281   { "16psk",    kModulationInvalid },
     282   { "16-psk",   kModulationInvalid },
    275283   { NULL,       kModulationQAMAuto },
    276284};
    277285
    const char *DTVModulation::dbStr[DTVModulation::kDBStrCnt] = 
    286294    "auto",    ///< kModulationQAMAuto
    287295    "8vsb",    ///< kModulation8VSB
    288296    "16vsb",   ///< kModulation16VSB
    289     "2vsb",    ///< kModulation2VSB
    290     "4vsb",    ///< kModulation4VSB
    291     "bpsk",    ///< kModulationBPSK
     297    "8psk",    ///< kModulation8PSK
    292298    "16apsk",  ///< kModulation16APSK
    293299    "32apsk",  ///< kModulation32APSK
    294     "8psk",    ///< kModulation8PSK
    295     "16psk",   ///< kModulation16PSK
     300    "dqpsk"    ///< kModulationDQPSK
    296301};
    297302
    298303const DTVParamHelperStruct DTVTransmitMode::confTable[] =
    const char *DTVPolarity::dbStr[DTVPolarity::kDBStrCnt] = 
    420425   "r", ///< kPolarityRight
    421426   "l"  ///< kPolarityLeft
    422427};
     428
     429const DTVParamHelperStruct DTVModulationSystem::confTable[] =
     430{
     431    { "SYS_UNDEFINED",     kModulationSystem_UNDEFINED     },
     432    { "SYS_DVBC_ANNEX_AC", kModulationSystem_DVBC_ANNEX_AC },
     433    { "SYS_DVBC_ANNEX_B",  kModulationSystem_DVBC_ANNEX_B  },
     434    { "SYS_DVBT",          kModulationSystem_DVBT          },
     435    { "SYS_DSS",           kModulationSystem_DSS           },
     436    { "SYS_DVBS",          kModulationSystem_DVBS          },
     437    { "SYS_DVBS2",         kModulationSystem_DVBS2         },
     438    { "SYS_DVBH",          kModulationSystem_DVBH          },
     439    { "SYS_ISDBT",         kModulationSystem_ISDBT         },
     440    { "SYS_ISDBS",         kModulationSystem_ISDBS         },
     441    { "SYS_ISDBC",         kModulationSystem_ISDBC         },
     442    { "SYS_ATSC",          kModulationSystem_ATSC          },
     443    { "SYS_ATSCMH",        kModulationSystem_ATSCMH        },
     444    { "SYS_DMBTH",         kModulationSystem_DMBTH         },
     445    { "SYS_CMMB",          kModulationSystem_CMMB          },
     446    { "SYS_DAB",           kModulationSystem_DAB           },
     447    { NULL,                kModulationSystem_UNDEFINED     },
     448};
     449
     450const DTVParamHelperStruct DTVModulationSystem::vdrTable[] =
     451{
     452    { "0",  kModulationSystem_DVBS      },
     453    { "1",  kModulationSystem_DVBS2     },
     454    { NULL, kModulationSystem_UNDEFINED },
     455};
     456
     457const DTVParamHelperStruct DTVModulationSystem::parseTable[] =
     458{
     459    { "UNDEFINED", kModulationSystem_UNDEFINED     },
     460    { "DVBC_AC",   kModulationSystem_DVBC_ANNEX_AC },
     461    { "DVBC_B",    kModulationSystem_DVBC_ANNEX_B  },
     462    { "DVBT",      kModulationSystem_DVBT          },
     463    { "DSS",       kModulationSystem_DSS           },
     464    { "DVB-S",     kModulationSystem_DVBS          },
     465    { "DVB-S2",    kModulationSystem_DVBS2         },
     466    { "DVBH",      kModulationSystem_DVBH          },
     467    { "ISDBT",     kModulationSystem_ISDBT         },
     468    { "ISDBS",     kModulationSystem_ISDBS         },
     469    { "ISDBC",     kModulationSystem_ISDBC         },
     470    { "ATSC",      kModulationSystem_ATSC          },
     471    { "ATSCMH",    kModulationSystem_ATSCMH        },
     472    { "DMBTH",     kModulationSystem_DMBTH         },
     473    { "CMMB",      kModulationSystem_CMMB          },
     474    { "DAB",       kModulationSystem_DAB           },
     475    { NULL,        kModulationSystem_UNDEFINED    },
     476};
     477
     478const char *DTVModulationSystem::dbStr[DTVModulationSystem::kDBStrCnt] =
     479{
     480    "UNDEFINED", ///< kModulationSystem_UNDEFINED
     481    "DVBCAC",    ///< kModulationSystem_DVBC_ANNEX_AC
     482    "DVBC_B",    ///< kModulationSystem_DVBC_ANNEX_B
     483    "DVBT",      ///< kModulationSystem_DVBT
     484    "DSS",       ///< kModulationSystem_DSS
     485    "DVB-S",     ///< kModulationSystem_DVBS
     486    "DVB-S2",    ///< kModulationSystem_DVBS2
     487    "DVBH",      ///< kModulationSystem_DVBH
     488    "ISDBT",     ///< kModulationSystem_ISDBT
     489    "ISDBS",     ///< kModulationSystem_ISDBS
     490    "ISDBC",     ///< kModulationSystem_ISDBC
     491    "ATSC",      ///< kModulationSystem_ATSC
     492    "ATSCMH",    ///< kModulationSystem_ATSCMH
     493    "DMBTH",     ///< kModulationSystem_DMBTH
     494    "CMMB",      ///< kModulationSystem_CMMB
     495    "DAB",       ///< kModulationSystem_DAB
     496};
     497
     498const DTVParamHelperStruct DTVRollOff::confTable[] =
     499{
     500   { "ROLLOFF_35",   kRollOff_35   },
     501   { "ROLLOFF_20",   kRollOff_20   },
     502   { "ROLLOFF_25",   kRollOff_25   },
     503   { "ROLLOFF_AUTO", kRollOff_Auto },
     504   { NULL,           kRollOff_35 },
     505};
     506
     507const DTVParamHelperStruct DTVRollOff::vdrTable[] =
     508{
     509   { "35",   kRollOff_35   },
     510   { "20",   kRollOff_20   },
     511   { "25",   kRollOff_25   },
     512   { "0",    kRollOff_Auto },
     513   { NULL,   kRollOff_35   },
     514};
     515const DTVParamHelperStruct DTVRollOff::parseTable[] =
     516{
     517   { "0.35", kRollOff_35   },
     518   { "0.20", kRollOff_20   },
     519   { "0.25", kRollOff_25   },
     520   { "auto", kRollOff_Auto },
     521   { NULL,   kRollOff_35   },
     522};
     523
     524const char *DTVRollOff::dbStr[DTVRollOff::kDBStrCnt] =
     525{
     526   "0.35",   ///< kRollOff_35
     527   "0.20",   ///< kRollOff_20
     528   "0.25",   ///< kRollOff_25
     529   "auto", ///< kRollOff_Auto
     530};
  • mythtv/libs/libmythtv/dtvconfparserhelpers.h

    diff --git a/mythtv/libs/libmythtv/dtvconfparserhelpers.h b/mythtv/libs/libmythtv/dtvconfparserhelpers.h
    index c9f3a1c..1b7c79a 100644
    a b class DTVTunerType : public DTVParamHelper 
    7878        kTunerTypeQAM     = 1,
    7979        kTunerTypeOFDM    = 2,
    8080        kTunerTypeATSC    = 3,
    81         kTunerTypeDVB_S   = (1 << 2), // same as QPSK but for new API
    82         kTunerTypeDVB_C   = (1 << 3), // same as QAM  but for new API
    83         kTunerTypeDVB_T   = (1 << 4), // same as OFDM but for new API
    8481        kTunerTypeDVB_S2  = (1 << 5),
    8582        kTunerTypeUnknown = (1 << 31),
    8683    };
    class DTVTunerType : public DTVParamHelper 
    9592    {
    9693        return ((kTunerTypeQPSK   == value) ||
    9794                (kTunerTypeQAM    == value) ||
    98                 (kTunerTypeDVB_S  == value) ||
    99                 (kTunerTypeDVB_C  == value) ||
    10095                (kTunerTypeDVB_S2 == value));
    10196    }
    10297
    class DTVCodeRate : public DTVParamHelper 
    201196    static const DTVParamHelperStruct confTable[];
    202197    static const DTVParamHelperStruct vdrTable[];
    203198    static const DTVParamHelperStruct parseTable[];
    204     static const uint kDBStrCnt = 10;
     199    static const uint kDBStrCnt = 12;
    205200    static const char *dbStr[kDBStrCnt];
    206201
    207202  public:
    class DTVCodeRate : public DTVParamHelper 
    217212        kFEC_7_8,
    218213        kFEC_8_9,
    219214        kFECAuto,
     215        kFEC_3_5,
     216        kFEC_9_10,
    220217    };
    221218
    222219    DTVCodeRate(int _default = kFECAuto) : DTVParamHelper(_default) { }
    class DTVModulation : public DTVParamHelper 
    245242    static const DTVParamHelperStruct confTable[];
    246243    static const DTVParamHelperStruct vdrTable[];
    247244    static const DTVParamHelperStruct parseTable[];
    248     static const uint kDBStrCnt = 17;
     245    static const uint kDBStrCnt = 13;
    249246    static const char *dbStr[kDBStrCnt];
    250247
    251248  public:
    252249    enum
    253250    {
    254         kModulationQPSK    = 0,
    255         kModulationQAM16   = 1,
    256         kModulationQAM32   = 2,
    257         kModulationQAM64   = 3,
    258         kModulationQAM128  = 4,
    259         kModulationQAM256  = 5,
    260         kModulationQAMAuto = 6,
    261         kModulation8VSB    = 7,
    262         kModulation16VSB   = 8,
    263         kModulation2VSB    = 9,
    264         kModulation4VSB    = 10,
    265         kModulationBPSK    = 11,
    266         kModulation16APSK  = 12,
    267         kModulation32APSK  = 13,
    268         kModulation8PSK    = 14,
    269         kModulation16PSK   = 15,
    270         kModulationAnalog  = 16, /* for analog channel scanner */
     251        kModulationQPSK,
     252        kModulationQAM16,
     253        kModulationQAM32,
     254        kModulationQAM64,
     255        kModulationQAM128,
     256        kModulationQAM256,
     257        kModulationQAMAuto,
     258        kModulation8VSB,
     259        kModulation16VSB,
     260        kModulation8PSK,
     261        kModulation16APSK,
     262        kModulation32APSK,
     263        kModulationDQPSK,
     264        kModulationInvalid = 0x100, /* for removed modulations */
     265        kModulationAnalog  = 0x200, /* for analog channel scanner */
    271266    };
    272267
    273268    DTVModulation(int _default = kModulationQAMAuto)
    class DTVPolarity : public DTVParamHelper 
    449444        { return DTVParamHelper::toString(dbStr, _value, kDBStrCnt); }
    450445};
    451446
     447class DTVModulationSystem : public DTVParamHelper
     448{
     449  protected:
     450    static const DTVParamHelperStruct confTable[];
     451    static const DTVParamHelperStruct vdrTable[];
     452    static const DTVParamHelperStruct parseTable[];
     453    static const uint kDBStrCnt = 16;
     454    static const char *dbStr[kDBStrCnt];
     455
     456  public:
     457    enum
     458    {
     459        kModulationSystem_UNDEFINED,
     460        kModulationSystem_DVBC_ANNEX_AC,
     461        kModulationSystem_DVBC_ANNEX_B,
     462        kModulationSystem_DVBT,
     463        kModulationSystem_DSS,
     464        kModulationSystem_DVBS,
     465        kModulationSystem_DVBS2,
     466        kModulationSystem_DVBH,
     467        kModulationSystem_ISDBT,
     468        kModulationSystem_ISDBS,
     469        kModulationSystem_ISDBC,
     470        kModulationSystem_ATSC,
     471        kModulationSystem_ATSCMH,
     472        kModulationSystem_DMBTH,
     473        kModulationSystem_CMMB,
     474        kModulationSystem_DAB,
     475    };
     476
     477    DTVModulationSystem(int _default = kModulationSystem_UNDEFINED)
     478        : DTVParamHelper(_default) { }
     479
     480    bool ParseConf(const QString &_value)
     481       { return ParseParam(_value, value, confTable); }
     482    bool ParseVDR(const QString &_value)
     483       { return ParseParam(_value, value, vdrTable); }
     484    bool Parse(const QString &_value)
     485       { return ParseParam(_value, value, parseTable); }
     486
     487    QString toString() const { return toString(value); }
     488
     489    static QString toString(int _value)
     490        { return DTVParamHelper::toString(dbStr, _value, kDBStrCnt); }
     491};
     492
     493class DTVRollOff : public DTVParamHelper
     494{
     495  protected:
     496    static const DTVParamHelperStruct confTable[];
     497    static const DTVParamHelperStruct vdrTable[];
     498    static const DTVParamHelperStruct parseTable[];
     499    static const uint kDBStrCnt = 4;
     500    static const char *dbStr[kDBStrCnt];
     501
     502  public:
     503    enum
     504    {
     505        kRollOff_35,
     506        kRollOff_20,
     507        kRollOff_25,
     508        kRollOff_Auto,
     509    };
     510
     511    DTVRollOff(int _default = kRollOff_35)
     512        : DTVParamHelper(_default) { }
     513
     514    bool IsCompatible(const DTVRollOff &other) const
     515        { return value == other.value || value == kRollOff_Auto ||
     516                other.value == kRollOff_Auto;
     517        }
     518
     519    bool ParseConf(const QString &_value)
     520       { return ParseParam(_value, value, confTable); }
     521    bool ParseVDR(const QString &_value)
     522       { return ParseParam(_value, value, vdrTable); }
     523    bool Parse(const QString &_value)
     524       { return ParseParam(_value, value, parseTable); }
     525
     526    QString toString() const { return toString(value); }
     527
     528    static QString toString(int _value)
     529        { return DTVParamHelper::toString(dbStr, _value, kDBStrCnt); }
     530};
     531
    452532#endif // _DTVCONFPARSERHELPERS_H_
  • mythtv/libs/libmythtv/dtvmultiplex.cpp

    diff --git a/mythtv/libs/libmythtv/dtvmultiplex.cpp b/mythtv/libs/libmythtv/dtvmultiplex.cpp
    index cd1dc81..9ca2310 100644
    a b DTVMultiplex &DTVMultiplex::operator=(const DTVMultiplex &other) 
    2222    hierarchy      = other.hierarchy;
    2323    polarity       = other.polarity;
    2424    fec            = other.fec;
     25    mod_sys        = other.mod_sys;
     26    rolloff        = other.rolloff;
    2527    mplex          = other.mplex;
    2628    sistandard     = other.sistandard;
    2729    sistandard.detach();
    bool DTVMultiplex::operator==(const DTVMultiplex &m) const 
    3941            (trans_mode == m.trans_mode) &&
    4042            (guard_interval == m.guard_interval) &&
    4143            (fec == m.fec) &&
     44            (mod_sys  == m.mod_sys)  &&
     45            (rolloff  == m.rolloff)  &&
    4246            (polarity == m.polarity) &&
    4347            (hierarchy == m.hierarchy));
    4448}
    QString DTVMultiplex::toString() const 
    5660        .arg(bandwidth.toString()).arg(trans_mode.toString())
    5761        .arg(guard_interval.toString()).arg(hierarchy.toString())
    5862        .arg(polarity.toString());
     63    ret += QString(" msys: %1 rolloff: %2")
     64        .arg(mod_sys.toString()).arg(rolloff.toString());
    5965
    6066    return ret;
    6167}
    bool DTVMultiplex::IsEqual(DTVTunerType type, const DTVMultiplex &other, 
    117123    if ((DTVTunerType::kTunerTypeDVB_S2 == type) ||
    118124        (DTVTunerType::kTunerTypeQPSK   == type))
    119125    {
     126        bool ret =
     127            (symbolrate == other.symbolrate)        &&
     128            (polarity   == other.polarity)          &&
     129            (mod_sys    == other.mod_sys);
     130
    120131        if (fuzzy)
    121             return
     132            return ret &&
    122133                inversion.IsCompatible(other.inversion) &&
    123                 (symbolrate == other.symbolrate)        &&
    124                 (polarity   == other.polarity)          &&
    125                 fec.IsCompatible(other.fec);
    126         return
     134                fec.IsCompatible(other.fec)             &&
     135                rolloff.IsCompatible(other.rolloff);
     136        return ret &&
    127137            (inversion  == other.inversion)  &&
    128             (symbolrate == other.symbolrate) &&
    129             (polarity   == other.polarity)   &&
    130             (fec        == other.fec);
     138            (fec        == other.fec)        &&
     139            (rolloff    == other.rolloff);
    131140    }
    132141
    133142    return false;
    bool DTVMultiplex::ParseDVB_S_and_C( 
    220229    return ok;
    221230}
    222231
     232bool DTVMultiplex::ParseDVB_S2(
     233    const QString &_frequency,   const QString &_inversion,
     234    const QString &_symbol_rate, const QString &_fec_inner,
     235    const QString &_modulation,  const QString &_polarity,
     236    const QString &_mod_sys,     const QString &_rolloff)
     237{
     238    bool ok = ParseDVB_S_and_C(_frequency, _inversion, _symbol_rate,
     239                               _fec_inner, _modulation, _polarity);
     240
     241    if (!mod_sys.Parse(_mod_sys))
     242    {
     243        VERBOSE(VB_IMPORTANT, LOC_ERR + "Invalid S2 modulation system " +
     244                QString("parameter '%1', aborting.").arg(_mod_sys));
     245        return false;
     246    }
     247
     248    if (!_rolloff.isEmpty())
     249        ok &= rolloff.Parse(_rolloff);
     250
     251    return ok;
     252}
     253
    223254bool DTVMultiplex::ParseTuningParams(
    224255    DTVTunerType type,
    225256    QString _frequency,    QString _inversion,      QString _symbolrate,
    226257    QString _fec,          QString _polarity,
    227258    QString _hp_code_rate, QString _lp_code_rate,   QString _ofdm_modulation,
    228259    QString _trans_mode,   QString _guard_interval, QString _hierarchy,
    229     QString _modulation,   QString _bandwidth)
     260    QString _modulation,   QString _bandwidth,
     261    QString _mod_sys,      QString _rolloff)
    230262{
    231263    if (DTVTunerType::kTunerTypeOFDM == type)
    232264    {
    bool DTVMultiplex::ParseTuningParams( 
    237269    }
    238270
    239271    if ((DTVTunerType::kTunerTypeQPSK   == type) ||
    240         (DTVTunerType::kTunerTypeDVB_S2 == type) ||
    241272        (DTVTunerType::kTunerTypeQAM    == type))
    242273    {
    243274        return ParseDVB_S_and_C(
    bool DTVMultiplex::ParseTuningParams( 
    245276            _fec,             _modulation,    _polarity);
    246277    }
    247278
     279    if (DTVTunerType::kTunerTypeDVB_S2 == type)
     280        return ParseDVB_S2(
     281            _frequency,       _inversion,     _symbolrate,
     282            _fec,             _modulation,    _polarity,
     283            _mod_sys,         _rolloff);
     284
    248285    if (DTVTunerType::kTunerTypeATSC == type)
    249286        return ParseATSC(_frequency, _modulation);
    250287
    bool DTVMultiplex::FillFromDB(DTVTunerType type, uint mplexid) 
    263300        "       fec,               polarity, "
    264301        "       hp_code_rate,      lp_code_rate,   constellation, "
    265302        "       transmission_mode, guard_interval, hierarchy, "
    266         "       modulation,        bandwidth,      sistandard "
     303        "       modulation,        bandwidth,      sistandard, "
     304        "       mod_sys,           rolloff "
    267305        "FROM dtv_multiplex "
    268306        "WHERE dtv_multiplex.mplexid = :MPLEXID");
    269307    query.bindValue(":MPLEXID", mplexid);
    bool DTVMultiplex::FillFromDB(DTVTunerType type, uint mplexid) 
    296334        query.value(6).toString(),  query.value(7).toString(),
    297335        query.value(8).toString(),  query.value(9).toString(),
    298336        query.value(10).toString(), query.value(11).toString(),
    299         query.value(12).toString());
     337        query.value(12).toString(), query.value(14).toString(),
     338        query.value(15).toString());
    300339}
    301340
    302341////////////////////////////////////////////////////////////////////////////
    uint ScanDTVTransport::SaveScan(uint scanid) const 
    364403        "    symbolrate,         fec,             polarity,   "
    365404        "    hp_code_rate,       lp_code_rate,    modulation, "
    366405        "    transmission_mode,  guard_interval,  hierarchy,  "
     406        "    mod_sys,            rolloff,                     "
    367407        "    bandwidth,          sistandard,      tuner_type  "
    368408        " ) "
    369409        "VALUES "
    uint ScanDTVTransport::SaveScan(uint scanid) const 
    372412        "   :SYMBOLRATE,        :FEC,            :POLARITY,   "
    373413        "   :HP_CODE_RATE,      :LP_CODE_RATE,   :MODULATION, "
    374414        "   :TRANSMISSION_MODE, :GUARD_INTERVAL, :HIERARCHY,  "
     415        "   :MOD_SYS,           :ROLLOFF,                     "
    375416        "   :BANDWIDTH,         :SISTANDARD,     :TUNER_TYPE  "
    376417        " );");
    377418
    uint ScanDTVTransport::SaveScan(uint scanid) const 
    388429    query.bindValue(":TRANSMISSION_MODE", trans_mode.toString());
    389430    query.bindValue(":GUARD_INTERVAL", guard_interval.toString());
    390431    query.bindValue(":HIERARCHY", hierarchy.toString());
     432    query.bindValue(":MOD_SYS", mod_sys.toString());
     433    query.bindValue(":ROLLOFF", rolloff.toString());
    391434    query.bindValue(":BANDWIDTH", bandwidth.toString());
    392435    query.bindValue(":SISTANDARD", sistandard);
    393436    query.bindValue(":TUNER_TYPE", (uint)tuner_type);
    bool ScanDTVTransport::ParseTuningParams( 
    419462    QString _fec,          QString _polarity,
    420463    QString _hp_code_rate, QString _lp_code_rate,   QString _ofdm_modulation,
    421464    QString _trans_mode,   QString _guard_interval, QString _hierarchy,
    422     QString _modulation,   QString _bandwidth)
     465    QString _modulation,   QString _bandwidth,      QString _mod_sys,
     466    QString _rolloff)
    423467{
    424468    tuner_type = type;
    425469
    bool ScanDTVTransport::ParseTuningParams( 
    429473        _fec,           _polarity,
    430474        _hp_code_rate,  _lp_code_rate,    _ofdm_modulation,
    431475        _trans_mode,    _guard_interval,  _hierarchy,
    432         _modulation,    _bandwidth);
     476        _modulation,    _bandwidth,       _mod_sys,
     477        _rolloff);
    433478}
    434479
    435480
  • mythtv/libs/libmythtv/dtvmultiplex.h

    diff --git a/mythtv/libs/libmythtv/dtvmultiplex.h b/mythtv/libs/libmythtv/dtvmultiplex.h
    index 0f1d076..db5bcd9 100644
    a b class DTVMultiplex 
    4949        const QString &symbol_rate,  const QString &fec_inner,
    5050        const QString &modulation,   const QString &polarity);
    5151
     52    bool ParseDVB_S2(
     53        const QString &frequency,    const QString &inversion,
     54        const QString &symbol_rate,  const QString &fec_inner,
     55        const QString &modulation,   const QString &polarity,
     56        const QString &mod_sys,      const QString &rolloff);
     57
    5258    bool ParseTuningParams(
    5359        DTVTunerType type,
    5460        QString frequency,    QString inversion,      QString symbolrate,
    5561        QString fec,          QString polarity,
    5662        QString hp_code_rate, QString lp_code_rate,   QString constellation,
    5763        QString trans_mode,   QString guard_interval, QString hierarchy,
    58         QString modulation,   QString bandwidth);
     64        QString modulation,   QString bandwidth,      QString mod_sys,
     65        QString rolloff);
    5966
    6067    QString toString() const;
    6168
    class DTVMultiplex 
    7481    DTVHierarchy     hierarchy;
    7582    DTVPolarity      polarity;
    7683    DTVCodeRate      fec; ///< Inner Forward Error Correction rate
     84    DTVModulationSystem mod_sys; ///< modulation system (only DVB-S or DVB-S2 atm)
     85    DTVRollOff       rolloff;
    7786
    7887    // Optional additional info
    7988    uint             mplex;
    class ScanDTVTransport : public DTVMultiplex 
    99108        QString fec,          QString polarity,
    100109        QString hp_code_rate, QString lp_code_rate,   QString constellation,
    101110        QString trans_mode,   QString guard_interval, QString hierarchy,
    102         QString modulation,   QString bandwidth);
     111        QString modulation,   QString bandwidth,
     112        QString mod_sys,      QString rolloff);
    103113
    104114  public:
    105115    DTVTunerType          tuner_type;
  • mythtv/libs/libmythtv/dvbchannel.cpp

    diff --git a/mythtv/libs/libmythtv/dvbchannel.cpp b/mythtv/libs/libmythtv/dvbchannel.cpp
    index 5ed8f60..5da4f6d 100644
    a b  
    4040#include <sys/types.h>
    4141
    4242// MythTV headers
     43#include "mythconfig.h"
    4344#include "mythdb.h"
    4445#include "cardutil.h"
    4546#include "channelutil.h"
     
    4950
    5051static void drain_dvb_events(int fd);
    5152static bool wait_for_backend(int fd, int timeout_ms);
    52 static struct dvb_fe_params dtvmultiplex_to_dvbparams(
    53     DTVTunerType, const DTVMultiplex&);
     53static struct dvb_frontend_parameters dtvmultiplex_to_dvbparams(
     54    DTVTunerType, const DTVMultiplex&, int intermediate_freq, bool can_fec_auto);
    5455static DTVMultiplex dvbparams_to_dtvmultiplex(
    55     DTVTunerType, const dvb_fe_params&);
     56    DTVTunerType, const dvb_frontend_parameters&);
    5657
    5758#define LOC QString("DVBChan(%1:%2): ").arg(GetCardID()).arg(device)
    5859#define LOC_WARN QString("DVBChan(%1:%2) Warning: ") \
    bool DVBChannel::Open(DVBChannel *who) 
    210211        return false;
    211212    }
    212213
    213 #ifdef FE_GET_EXTENDED_INFO
    214     if (info.caps & FE_HAS_EXTENDED_INFO)
    215     {
    216         bool ok = true;
    217         dvb_fe_caps_extended extinfo;
    218         bzero(&extinfo, sizeof(extinfo));
    219         if (ioctl(fd_frontend, FE_GET_EXTENDED_INFO, &extinfo) < 0)
    220         {
    221             VERBOSE(VB_IMPORTANT, LOC_ERR +
    222                     "Failed to get frontend extended information." + ENO);
    223 
    224             ok = false;
    225         }
    226 
    227         if (ok && (extinfo.modulations & MOD_8PSK))
    228         {
    229             if (ioctl(fd_frontend, FE_SET_STANDARD, FE_DVB_S2) < 0)
    230             {
    231                 VERBOSE(VB_IMPORTANT, LOC_ERR +
    232                         "Failed to set frontend standard to DVB-S2." + ENO);
    233 
    234                 ok = false;
    235             }
    236             else if (ioctl(fd_frontend, FE_GET_INFO, &info) < 0)
    237             {
    238                 VERBOSE(VB_IMPORTANT, LOC_ERR +
    239                         "Failed to get frontend information." + ENO);
    240 
    241                 ok = false;
    242             }
    243         }
    244 
    245         if (!ok)
    246         {
    247             close(fd_frontend);
    248             fd_frontend = -1;
    249             return false;
    250         }
    251 
    252         ext_modulations   = extinfo.modulations;
    253     }
    254 #endif
    255 
    256214    frontend_name       = info.name;
    257215    card_type           = info.type;
     216#if HAVE_FE_CAN_2G_MODULATION
     217    if (card_type == DTVTunerType::kTunerTypeQPSK &&
     218        (info.caps & FE_CAN_2G_MODULATION))
     219        card_type = DTVTunerType::kTunerTypeDVB_S2;
     220#endif // HAVE_FE_CAN_2G_MODULATION
    258221    capabilities        = info.caps;
    259222    frequency_minimum   = info.frequency_min;
    260223    frequency_maximum   = info.frequency_max;
    bool DVBChannel::CheckModulation(DTVModulation modulation) const 
    596559    const DTVModulation m = modulation;
    597560    const uint64_t      c = capabilities;
    598561
    599 #ifdef FE_GET_EXTENDED_INFO
    600     if ((c & FE_HAS_EXTENDED_INFO)            &&
    601         (DTVModulation::kModulation8PSK == m) &&
    602         (ext_modulations & DTVModulation::kModulation8PSK))
    603     {
    604         return true;
    605     }
    606 #endif // FE_GET_EXTENDED_INFO
    607 
    608562    return
    609563        ((DTVModulation::kModulationQPSK    == m) && (c & FE_CAN_QPSK))     ||
     564#if HAVE_FE_CAN_2G_MODULATION
     565        ((DTVModulation::kModulation8PSK    == m) && (c & FE_CAN_2G_MODULATION)) ||
     566#endif //HAVE_FE_CAN_2G_MODULATION
    610567        ((DTVModulation::kModulationQAM16   == m) && (c & FE_CAN_QAM_16))   ||
    611568        ((DTVModulation::kModulationQAM32   == m) && (c & FE_CAN_QAM_32))   ||
    612569        ((DTVModulation::kModulationQAM64   == m) && (c & FE_CAN_QAM_64))   ||
    bool DVBChannel::Tune(const DTVMultiplex &tuning, QString inputname) 
    649606    return Tune(tuning, inputid, false, false);
    650607}
    651608
     609#if DVB_API_VERSION >= 5
     610static struct dtv_properties *dtvmultiplex_to_dtvproperties(
     611    DTVTunerType tuner_type, const DTVMultiplex &tuning, int intermediate_freq,
     612    bool can_fec_auto, bool do_tune = true)
     613{
     614    uint c = 0;
     615    struct dtv_properties *cmdseq;
     616
     617    if (tuner_type != DTVTunerType::kTunerTypeDVB_S2 &&
     618        tuner_type != DTVTunerType::kTunerTypeOFDM   &&
     619        tuner_type != DTVTunerType::kTunerTypeQAM    &&
     620        tuner_type != DTVTunerType::kTunerTypeQPSK)
     621    {
     622        VERBOSE(VB_IMPORTANT, "Unsupported tuner type " + tuner_type.toString());
     623        return NULL;
     624    }
     625
     626    cmdseq = (struct dtv_properties*) calloc(1, sizeof(*cmdseq));
     627    if (!cmdseq)
     628        return NULL;
     629
     630    cmdseq->props = (struct dtv_property*) calloc(11, sizeof(*(cmdseq->props)));
     631    if (!(cmdseq->props))
     632    {
     633        free(cmdseq);
     634        return NULL;
     635    }
     636
     637    if (tuner_type == DTVTunerType::kTunerTypeDVB_S2)
     638    {
     639        cmdseq->props[c].cmd      = DTV_DELIVERY_SYSTEM;
     640        cmdseq->props[c++].u.data = tuning.mod_sys;
     641    }
     642
     643    cmdseq->props[c].cmd      = DTV_FREQUENCY;
     644    cmdseq->props[c++].u.data = intermediate_freq ? intermediate_freq : tuning.frequency;
     645    cmdseq->props[c].cmd      = DTV_MODULATION;
     646    cmdseq->props[c++].u.data = tuning.modulation;
     647    cmdseq->props[c].cmd      = DTV_INVERSION;
     648    cmdseq->props[c++].u.data = tuning.inversion;
     649
     650    if (tuner_type == DTVTunerType::kTunerTypeQPSK   ||
     651        tuner_type == DTVTunerType::kTunerTypeDVB_S2 ||
     652        tuner_type == DTVTunerType::kTunerTypeQAM)
     653    {
     654        cmdseq->props[c].cmd      = DTV_SYMBOL_RATE;
     655        cmdseq->props[c++].u.data = tuning.symbolrate;
     656    }
     657
     658    if (tuner_type.IsFECVariable())
     659    {
     660        cmdseq->props[c].cmd      = DTV_INNER_FEC;
     661        cmdseq->props[c++].u.data = can_fec_auto ? FEC_AUTO : tuning.fec;
     662    }
     663
     664    if (tuner_type == DTVTunerType::kTunerTypeOFDM)
     665    {
     666        cmdseq->props[c].cmd      = DTV_BANDWIDTH_HZ;
     667        cmdseq->props[c++].u.data = (8-tuning.bandwidth) * 1000000;
     668        cmdseq->props[c].cmd      = DTV_CODE_RATE_HP;
     669        cmdseq->props[c++].u.data = tuning.hp_code_rate;
     670        cmdseq->props[c].cmd      = DTV_CODE_RATE_LP;
     671        cmdseq->props[c++].u.data = tuning.lp_code_rate;
     672        cmdseq->props[c].cmd      = DTV_TRANSMISSION_MODE;
     673        cmdseq->props[c++].u.data = tuning.trans_mode;
     674        cmdseq->props[c].cmd      = DTV_GUARD_INTERVAL;
     675        cmdseq->props[c++].u.data = tuning.guard_interval;
     676        cmdseq->props[c].cmd      = DTV_HIERARCHY;
     677        cmdseq->props[c++].u.data = tuning.hierarchy;
     678    }
     679
     680    if (tuning.mod_sys == DTVModulationSystem::kModulationSystem_DVBS2)
     681    {
     682        cmdseq->props[c].cmd      = DTV_PILOT;
     683        cmdseq->props[c++].u.data = PILOT_AUTO;
     684        cmdseq->props[c].cmd      = DTV_ROLLOFF;
     685        cmdseq->props[c++].u.data = tuning.rolloff;
     686    }
     687
     688    if (do_tune)
     689        cmdseq->props[c++].cmd    = DTV_TUNE;
     690
     691    cmdseq->num = c;
     692
     693    return cmdseq;
     694}
     695#endif
     696
     697
    652698/*****************************************************************************
    653699           Tuning functions for each of the four types of cards.
    654700 *****************************************************************************/
    bool DVBChannel::Tune(const DTVMultiplex &tuning, 
    679725        return master->Tune(tuning, inputid, force_reset, false);
    680726    }
    681727
     728    int intermediate_freq = 0;
     729    bool can_fec_auto = false;
    682730    bool reset = (force_reset || first_tune);
    683     struct dvb_fe_params params = dtvmultiplex_to_dvbparams(card_type, tuning);
    684731
    685732    bool is_dvbs = (DTVTunerType::kTunerTypeQPSK   == card_type ||
    686733                    DTVTunerType::kTunerTypeDVB_S2 == card_type);
    bool DVBChannel::Tune(const DTVMultiplex &tuning, 
    738785            reset = first_tune = true;
    739786        }
    740787       
    741         params.frequency = lnb->GetIntermediateFrequency(
     788        intermediate_freq = lnb->GetIntermediateFrequency(
    742789            diseqc_settings, tuning);
    743790
    744791        // if card can auto-FEC, use it -- sometimes NITs are inaccurate
    745792        if (capabilities & FE_CAN_FEC_AUTO)
    746             params.u.qpsk.fec_inner = FEC_AUTO;
     793            can_fec_auto = true;
    747794    }
    748795
    749796    VERBOSE(VB_CHANNEL, LOC + "Old Params: " +
    bool DVBChannel::Tune(const DTVMultiplex &tuning, 
    758805    if (reset || !prev_tuning.IsEqual(card_type, tuning, 500 * freq_mult))
    759806    {
    760807        VERBOSE(VB_CHANNEL, LOC + QString("Tune(): Tuning to %1%2")
    761                 .arg(params.frequency).arg(suffix));
     808                .arg(intermediate_freq ? intermediate_freq : tuning.frequency)
     809                .arg(suffix));
    762810
    763 #ifdef FE_GET_EXTENDED_INFO
    764         if (card_type == DTVTunerType::kTunerTypeDVB_S2)
     811#if DVB_API_VERSION >=5
     812        if (DTVTunerType::kTunerTypeDVB_S2 == card_type)
    765813        {
    766             if (ioctl(fd_frontend, FE_SET_FRONTEND2, &params) < 0)
     814            struct dtv_property p_clear;
     815            struct dtv_properties cmdseq_clear;
     816
     817            p_clear.cmd        = DTV_CLEAR;
     818            cmdseq_clear.num   = 1;
     819            cmdseq_clear.props = &p_clear;
     820
     821            if ((ioctl(fd_frontend, FE_SET_PROPERTY, &cmdseq_clear)) < 0)
     822            {
     823                VERBOSE(VB_IMPORTANT, LOC_ERR + "Tune(): " +
     824                        "Clearing DTV properties cache failed." + ENO);
     825                return false;
     826            }
     827
     828            struct dtv_properties *cmds = dtvmultiplex_to_dtvproperties(
     829                card_type, tuning, intermediate_freq, can_fec_auto);
     830
     831            if (!cmds) {
     832                VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to convert "
     833                        "DTVMultiplex to DTV_PROPERTY sequence");
     834                return false;
     835            }
     836
     837            if (print_verbose_messages & (VB_CHANNEL | VB_EXTRA) == (VB_CHANNEL | VB_EXTRA))
     838            {
     839                for (int i = 0; i < cmds->num; i++)
     840                {
     841                    VERBOSE(VB_CHANNEL, QString("prop %1: cmd = %2, data %3")
     842                            .arg(i).arg(cmds->props[i].cmd)
     843                            .arg(cmds->props[i].u.data));
     844                }
     845            }
     846
     847            int res = ioctl(fd_frontend, FE_SET_PROPERTY, cmds);
     848
     849            free(cmds->props);
     850            free(cmds);
     851
     852            if (res < 0)
    767853            {
    768854                VERBOSE(VB_IMPORTANT, LOC_ERR + "Tune(): " +
    769                         "Setting Frontend(2) tuning parameters failed." + ENO);
     855                        "Setting Frontend tuning parameters failed." + ENO);
    770856                return false;
    771857            }
    772858        }
    773859        else
    774 #endif // FE_GET_EXTENDED_INFO
     860#endif
    775861        {
     862            struct dvb_frontend_parameters params = dtvmultiplex_to_dvbparams(card_type, tuning,
     863                                                                              intermediate_freq,
     864                                                                              can_fec_auto);
     865
    776866            if (ioctl(fd_frontend, FE_SET_FRONTEND, &params) < 0)
    777867            {
    778868                VERBOSE(VB_IMPORTANT, LOC_ERR + "Tune(): " +
    bool DVBChannel::IsTuningParamsProbeSupported(void) const 
    835925        return false;
    836926    }
    837927
    838     dvb_fe_params params;
     928    dvb_frontend_parameters params;
    839929    return ioctl(fd_frontend, FE_GET_FRONTEND, &params) >= 0;
    840930}
    841931
    bool DVBChannel::ProbeTuningParams(DTVMultiplex &tuning) const 
    868958        return false;
    869959    }
    870960
    871     dvb_fe_params params;
     961    if (card_type == DTVTunerType::kTunerTypeDVB_S2)
     962    {
     963        // TODO implement probing of tuning parameters with FE_GET_PROPERTY
     964        return false;
     965    }
     966
     967    dvb_frontend_parameters params;
    872968    if (ioctl(fd_frontend, FE_GET_FRONTEND, &params) < 0)
    873969    {
    874970        VERBOSE(VB_IMPORTANT, LOC_ERR +
    static bool wait_for_backend(int fd, int timeout_ms) 
    10941190    return true;
    10951191}
    10961192
    1097 static struct dvb_fe_params dtvmultiplex_to_dvbparams(
    1098     DTVTunerType tuner_type, const DTVMultiplex &tuning)
     1193static struct dvb_frontend_parameters dtvmultiplex_to_dvbparams(
     1194    DTVTunerType tuner_type, const DTVMultiplex &tuning,
     1195    int intermediate_freq, bool can_fec_auto)
    10991196{
    1100     dvb_fe_params params;
     1197    dvb_frontend_parameters params;
    11011198    bzero(&params, sizeof(params));
    11021199
    11031200    params.frequency = tuning.frequency;
    static struct dvb_fe_params dtvmultiplex_to_dvbparams( 
    11051202
    11061203    if (DTVTunerType::kTunerTypeQPSK == tuner_type)
    11071204    {
     1205        if (tuning.mod_sys == DTVModulationSystem::kModulationSystem_DVBS2)
     1206            VERBOSE(VB_IMPORTANT, "DVBChan Error, Tuning of a DVB-S2 transport "
     1207                    "with a DVB-S card will fail.");
     1208
     1209        params.frequency = intermediate_freq;
    11081210        params.u.qpsk.symbol_rate = tuning.symbolrate;
    1109         params.u.qpsk.fec_inner   = (fe_code_rate_t) (int) tuning.fec;
     1211        params.u.qpsk.fec_inner   = can_fec_auto ? FEC_AUTO
     1212            : (fe_code_rate_t) (int) tuning.fec;
    11101213    }
    11111214
    11121215    if (DTVTunerType::kTunerTypeDVB_S2 == tuner_type)
    11131216    {
    1114 #ifdef FE_GET_EXTENDED_INFO
    1115         params.u.qpsk2.symbol_rate = tuning.symbolrate;
    1116         params.u.qpsk2.fec_inner   = (fe_code_rate_t) (int) tuning.fec;
    1117         params.u.qpsk2.modulation  = (fe_modulation_t) (int) tuning.modulation;
    1118 #else // if !FE_GET_EXTENDED_INFO
    11191217        VERBOSE(VB_IMPORTANT, "DVBChan Error, MythTV was compiled without "
    11201218                "DVB-S2 headers being present so DVB-S2 tuning will fail.");
    1121 #endif // !FE_GET_EXTENDED_INFO
    11221219    }
    11231220
    11241221    if (DTVTunerType::kTunerTypeQAM  == tuner_type)
    static struct dvb_fe_params dtvmultiplex_to_dvbparams( 
    11481245
    11491246    if (DTVTunerType::kTunerTypeATSC == tuner_type)
    11501247    {
    1151 #ifdef USE_ATSC
    11521248        params.u.vsb.modulation   =
    11531249            (fe_modulation_t) (int) tuning.modulation;
    1154 #endif // USE_ATSC
    11551250    }
    11561251
    11571252    return params;
    11581253}
    11591254
    11601255static DTVMultiplex dvbparams_to_dtvmultiplex(
    1161     DTVTunerType tuner_type, const dvb_fe_params &params)
     1256    DTVTunerType tuner_type, const dvb_frontend_parameters &params)
    11621257{
    11631258    DTVMultiplex tuning;
    11641259
    static DTVMultiplex dvbparams_to_dtvmultiplex( 
    11921287
    11931288    if (DTVTunerType::kTunerTypeATSC == tuner_type)
    11941289    {
    1195 #ifdef USE_ATSC
    11961290        tuning.modulation     = params.u.vsb.modulation;
    1197 #endif // USE_ATSC
    11981291    }
    11991292
    12001293    return tuning;
  • mythtv/libs/libmythtv/dvbtypes.h

    diff --git a/mythtv/libs/libmythtv/dvbtypes.h b/mythtv/libs/libmythtv/dvbtypes.h
    index bc15a22..94a8882 100644
    a b  
    1919#include <linux/dvb/frontend.h>
    2020#include <linux/dvb/dmx.h>
    2121
    22 #if (DVB_API_VERSION != 3 && DVB_API_VERSION != 5)
    23 #    error "DVB driver includes with API version 3 not found!"
    24 #endif
    25 
    2622#ifndef DVB_API_VERSION_MINOR
    27 #    define DVB_API_VERSION_MINOR 0
    28 #endif
    29 
    30 #if ((DVB_API_VERSION == 3 && DVB_API_VERSION_MINOR >= 1) || (DVB_API_VERSION > 3))
    31 #    define USE_ATSC
    32 #else
    33 #warning DVB API version < 3.1
    34 #warning ATSC will not be supported using the Linux DVB drivers
    35 #    define FE_ATSC       (FE_OFDM+1)
    36 #    define FE_CAN_8VSB   0x200000
    37 #    define FE_CAN_16VSB  0x400000
    38 #    define VSB_8         (fe_modulation)(QAM_AUTO+1)
    39 #    define VSB_16        (fe_modulation)(QAM_AUTO+2)
     23#define DVB_API_VERSION_MINOR 0
    4024#endif
    4125
    42 #ifdef FE_GET_EXTENDED_INFO
    43   #define dvb_fe_params dvb_frontend_parameters_new
    44 #else
    45   #define dvb_fe_params dvb_frontend_parameters
     26#if !(DVB_API_VERSION == 3 && DVB_API_VERSION_MINOR >= 1) && DVB_API_VERSION != 5
     27#    error "DVB driver includes with API version 3.1 or later not found!"
    4628#endif
    4729
    4830class QString;
  • mythtv/libs/libmythtv/frequencytables.cpp

    diff --git a/mythtv/libs/libmythtv/frequencytables.cpp b/mythtv/libs/libmythtv/frequencytables.cpp
    index 22a9bfe..5ebb654 100644
    a b TransportScanItem::TransportScanItem(uint _sourceid, 
    7272        _tuning.lp_code_rate.toString(),     _tuning.modulation.toString(),
    7373        _tuning.trans_mode.toString(),       _tuning.guard_interval.toString(),
    7474        _tuning.hierarchy.toString(),        _tuning.modulation.toString(),
    75         _tuning.bandwidth.toString());
     75        _tuning.bandwidth.toString(),        _tuning.mod_sys.toString(),
     76        _tuning.rolloff.toString());
    7677}
    7778
    7879TransportScanItem::TransportScanItem(uint sourceid,
  • mythtv/libs/libmythtv/mpeg/dvbdescriptors.h

    diff --git a/mythtv/libs/libmythtv/mpeg/dvbdescriptors.h b/mythtv/libs/libmythtv/mpeg/dvbdescriptors.h
    index 64a802d..e8fb9e5 100644
    a b class SatelliteDeliverySystemDescriptor : public MPEGDescriptor 
    770770    bool IsLinearPolarization()   const { return !((_data[8]>>6)&0x1); }
    771771    bool IsHorizontalLeftPolarization() const { return (_data[8]>>5)&0x1; }
    772772    bool IsVerticalRightPolarization() const { return !((_data[8]>>5)&0x1); }
    773     // modulation               5   8.3
     773    // roll off                 2   8.3
     774    enum
     775    {
     776        kRollOff_35,
     777        kRollOff_20,
     778        kRollOff_25,
     779        kRollOff_Auto,
     780    };
     781    uint RollOff() const { return (_data[8]>>3)&0x3; }
     782    QString RollOffString() const
     783    {
     784        static QString ro[] = { "0.35", "0.20", "0.25", "auto" };
     785        return ro[RollOff()];
     786    }
     787    // modulation system        1   8.5
     788    uint ModulationSystem() const { return (_data[8]>>2)&0x1; }
     789    QString ModulationSystemString() const
     790    {
     791        return ModulationSystem() ? "DVB-S2" : "DVB-S";
     792    }
     793    // modulation               2   8.6
    774794    enum
    775795    {
    776796        kModulationQPSK_NS = 0x0, // Non standard QPSK for Bell ExpressVu
     797        // should be "auto" according to DVB SI standard
    777798        kModulationQPSK   = 0x1,
    778799        kModulation8PSK   = 0x2,
    779800        kModulationQAM16  = 0x3,
    780801    };
    781     uint Modulation() const { return _data[8]&0x1f; }
     802    uint Modulation() const { return _data[8]&0x03; }
    782803    QString ModulationString() const
    783804    {
    784805        static QString ms[] = { "qpsk", "qpsk", "8psk", "qam_16" };
    785         return (Modulation() <= kModulationQAM16) ? ms[Modulation()] : "auto";
     806        return ms[Modulation()];
    786807    }
    787808    // symbol_rate             28   9.0
    788809    uint SymbolRate() const
  • mythtv/libs/libmythtv/scanwizard.cpp

    diff --git a/mythtv/libs/libmythtv/scanwizard.cpp b/mythtv/libs/libmythtv/scanwizard.cpp
    index b619988..4ca4996 100644
    a b void ScanWizard::SetPage(const QString &pageTitle) 
    100100        start_chan = configPane->GetStartChan();
    101101        parse_type = DTVTunerType::kTunerTypeQPSK;
    102102    }
     103    else if (scantype == ScanTypeSetting::NITAddScan_DVBS2)
     104    {
     105        start_chan = configPane->GetStartChan();
     106        parse_type = DTVTunerType::kTunerTypeDVB_S2;
     107    }
    103108    else if (scantype == ScanTypeSetting::NITAddScan_DVBC)
    104109    {
    105110        start_chan = configPane->GetStartChan();
    void ScanWizard::SetPage(const QString &pageTitle) 
    163168            start_chan["coderate_hp"],    start_chan["coderate_lp"],
    164169            start_chan["constellation"],  start_chan["trans_mode"],
    165170            start_chan["guard_interval"], start_chan["hierarchy"],
    166             start_chan["modulation"],     start_chan["bandwidth"]))
     171            start_chan["modulation"],     start_chan["bandwidth"],
     172            start_chan["mod_sys"],        start_chan["rolloff"]))
    167173    {
    168174        MythPopupBox::showOkPopup(
    169175            gContext->GetMainWindow(), tr("ScanWizard"),
  • mythtv/libs/libmythtv/videosource.cpp

    diff --git a/mythtv/libs/libmythtv/videosource.cpp b/mythtv/libs/libmythtv/videosource.cpp
    index bc10656..9b4f3a8 100644
    a b void DVBConfigurationGroup::probeCard(const QString &videodevice) 
    33413341            signal_timeout->setValue(60000);
    33423342            channel_timeout->setValue(62500);
    33433343            break;
     3344        case CardUtil::DVBS2:
     3345            cardtype->setValue("DVB-S2");
     3346            cardname->setValue(frontend_name);
     3347            signal_timeout->setValue(60000);
     3348            channel_timeout->setValue(62500);
     3349            break;
    33443350        case CardUtil::QAM:
    33453351            cardtype->setValue("DVB-C");
    33463352            cardname->setValue(frontend_name);