diff --git a/mythtv/bindings/perl/MythTV.pm b/mythtv/bindings/perl/MythTV.pm index f07de2d..ebaecaf 100644 --- a/mythtv/bindings/perl/MythTV.pm +++ b/mythtv/bindings/perl/MythTV.pm @@ -114,7 +114,7 @@ package MythTV; # schema version supported in the main code. We need to check that the schema # version in the database is as expected by the bindings, which are expected # to be kept in sync with the main code. - our $SCHEMA_VERSION = "1273"; + our $SCHEMA_VERSION = "1274"; # NUMPROGRAMLINES is defined in mythtv/libs/libmythtv/programinfo.h and is # the number of items in a ProgramInfo QStringList group used by diff --git a/mythtv/bindings/python/MythTV/static.py b/mythtv/bindings/python/MythTV/static.py index ff5fabf..a090431 100644 --- a/mythtv/bindings/python/MythTV/static.py +++ b/mythtv/bindings/python/MythTV/static.py @@ -5,7 +5,7 @@ Contains any static and global variables for MythTV Python Bindings """ OWN_VERSION = (0,25,-1,2) -SCHEMA_VERSION = 1273 +SCHEMA_VERSION = 1274 NVSCHEMA_VERSION = 1007 MUSICSCHEMA_VERSION = 1018 PROTO_VERSION = '65' diff --git a/mythtv/libs/libmythtv/dbcheck.cpp b/mythtv/libs/libmythtv/dbcheck.cpp index e0d17c5..be8a380 100644 --- a/mythtv/libs/libmythtv/dbcheck.cpp +++ b/mythtv/libs/libmythtv/dbcheck.cpp @@ -21,7 +21,7 @@ using namespace std; mythtv/bindings/perl/MythTV.pm */ /// This is the DB schema version expected by the running MythTV instance. -const QString currentDatabaseVersion = "1273"; +const QString currentDatabaseVersion = "1274"; static bool UpdateDBVersionNumber(const QString &newnumber, QString &dbver); static bool performActualUpdate( @@ -5648,6 +5648,43 @@ NULL return false; } + if (dbver == "1273") + { + const char *updates[] = { +"UPDATE cardinput SET tunechan=NULL" +" WHERE inputname='DVBInput' OR inputname='MPEG2TS';" +"UPDATE dtv_multiplex SET symbolrate = NULL" +" WHERE SUBSTR(modulation,1,2)='t' OR modulation LIKE '%t';", +"UPDATE dtv_multiplex SET symbolrate = NULL" +" WHERE SUBSTR(modulation,1,2)='t' OR modulation LIKE '%t';", +"UPDATE dtv_multiplex" +" SET bandwidth=SUBSTR(modulation,2,1)" +" WHERE SUBSTR(modulation,3,3)='qam' OR" +" SUBSTR(modulation,3,4)='qpsk';", +"UPDATE dtv_multiplex" +" SET bandwidth=SUBSTR(modulation,5,1)" +" WHERE SUBSTR(modulation,1,4)='auto' AND" +" LENGTH(modulation)=6;", +"UPDATE dtv_multiplex SET modulation='auto'" +" WHERE modulation LIKE 'auto%';", +"UPDATE dtv_multiplex SET modulation='qam_16'" +" WHERE modulation LIKE '%qam16%';", +"UPDATE dtv_multiplex SET modulation='qam_32'" +" WHERE modulation LIKE '%qam32%';", +"UPDATE dtv_multiplex SET modulation='qam_64'" +" WHERE modulation LIKE '%qam64%';", +"UPDATE dtv_multiplex SET modulation='qam_128'" +" WHERE modulation LIKE '%qam128%';", +"UPDATE dtv_multiplex SET modulation='qam_256'" +" WHERE modulation LIKE '%qam256%';", +NULL +}; + if (!performActualUpdate(updates, "1274", dbver)) + return false; + } + + + return true; } diff --git a/mythtv/libs/libmythtv/dtvconfparserhelpers.cpp b/mythtv/libs/libmythtv/dtvconfparserhelpers.cpp index d6fcaca..e9d2f7d 100644 --- a/mythtv/libs/libmythtv/dtvconfparserhelpers.cpp +++ b/mythtv/libs/libmythtv/dtvconfparserhelpers.cpp @@ -44,6 +44,7 @@ const int DTVTunerType::kTunerTypeDVBC = 0x0001; const int DTVTunerType::kTunerTypeDVBT = 0x0002; const int DTVTunerType::kTunerTypeATSC = 0x0003; const int DTVTunerType::kTunerTypeASI = 0x1000; +const int DTVTunerType::kTunerTypeOCUR = 0x2000; const int DTVTunerType::kTunerTypeUnknown = 0x80000000; static QMutex dtv_tt_canonical_str_lock; @@ -57,6 +58,7 @@ void DTVTunerType::initStr(void) dtv_tt_canonical_str[kTunerTypeDVBS1] = "QPSK"; dtv_tt_canonical_str[kTunerTypeDVBS2] = "DVB_S2"; dtv_tt_canonical_str[kTunerTypeASI] = "ASI"; + dtv_tt_canonical_str[kTunerTypeOCUR] = "OCUR"; dtv_tt_canonical_str[kTunerTypeUnknown] = "UNKNOWN"; } @@ -77,6 +79,7 @@ const DTVParamHelperStruct DTVTunerType::parseTable[] = { "ATSC", kTunerTypeATSC }, { "DVB_S2", kTunerTypeDVBS2 }, { "ASI", kTunerTypeASI }, + { "OCUR", kTunerTypeOCUR }, { "UNKNOWN", kTunerTypeUnknown }, { NULL, kTunerTypeUnknown }, }; diff --git a/mythtv/libs/libmythtv/dtvconfparserhelpers.h b/mythtv/libs/libmythtv/dtvconfparserhelpers.h index e6aa1d2..d89a93a 100644 --- a/mythtv/libs/libmythtv/dtvconfparserhelpers.h +++ b/mythtv/libs/libmythtv/dtvconfparserhelpers.h @@ -92,6 +92,7 @@ class DTVTunerType : public DTVParamHelper static const int kTunerTypeATSC; // 8-VSB, 16-VSB, // QAM-16, QAM-64, QAM-256, QPSK static const int kTunerTypeASI; // baseband + static const int kTunerTypeOCUR; // Virtual Channel tuning of QAM-64/256 static const int kTunerTypeUnknown; // Note: Just because some cards sold in different regions support the same diff --git a/mythtv/libs/libmythtv/hdhrchannel.cpp b/mythtv/libs/libmythtv/hdhrchannel.cpp index d18be4f..1533c75 100644 --- a/mythtv/libs/libmythtv/hdhrchannel.cpp +++ b/mythtv/libs/libmythtv/hdhrchannel.cpp @@ -92,15 +92,82 @@ bool HDHRChannel::IsOpen(void) const return _stream_handler; } +/// This is used when the tuner type is kTunerTypeOCUR bool HDHRChannel::Tune(const QString &freqid, int /*finetune*/) { return _stream_handler->TuneVChannel(freqid); } +// Note: For DVB-T and DVB-C we end up always using 'auto' +// because _tuner_types will always contain both when it +// contains one or the other. We do try to handle all the +// cases here though since we will at some point insert +// the DTVTunerType into the dtv_multiplex at some point +// and then we'll have this information. +QString get_tune_spec(const vector &tuner_types, + const DTVMultiplex &tuning) +{ + QString spec; + + if (DTVModulation::kModulationQAM256 == tuning.modulation) + spec = "qam256"; + else if (DTVModulation::kModulationQAM128 == tuning.modulation) + spec = "qam128"; + else if (DTVModulation::kModulationQAM64 == tuning.modulation) + spec = "qam64"; + else if (DTVModulation::kModulationQAM16 == tuning.modulation) + spec = "qam16"; + else if (DTVModulation::kModulationDQPSK == tuning.modulation) + spec = "qpsk"; + else if (DTVModulation::kModulation8VSB == tuning.modulation) + spec = "8vsb"; + else + spec = "auto"; + + if (find(tuner_types.begin(), tuner_types.end(), + DTVTunerType::kTunerTypeDVBC) != tuner_types.end()) + { + const QChar b = tuning.bandwidth.toChar(); + if ((QChar('a') == b) || (spec == "auto")) + spec = "auto"; // uses bandwidth from channel map + else if ((QChar('a') != b) && (tuning.symbolrate > 0)) + spec = QString("a%1%2-%3") + .arg(b).arg(spec).arg(tuning.symbolrate/1000); + else + spec = QString("auto%1c").arg(b); + } + + if (find(tuner_types.begin(), tuner_types.end(), + DTVTunerType::kTunerTypeDVBT) != tuner_types.end()) + { + const QChar b = tuning.bandwidth.toChar(); + if ((QChar('a') == b) || spec == "auto") + spec = "auto"; // uses bandwidth from channel map + else if (QChar('a') != b) + spec = QString("a%1%2").arg(b).arg(spec); + else + spec = QString("auto%1t").arg(b); + } + + if (find(tuner_types.begin(), tuner_types.end(), + DTVTunerType::kTunerTypeATSC) != tuner_types.end()) + { + // older firmware does no recognize "auto" + spec = (spec == "auto") ? "qam" : spec; + } + + // if the device supports multiple tuners and we're doing + // any kind of auto tuning, do full autotuning. + if ((tuner_types.size() > 1) && (spec.left(4) == "auto")) + spec = "auto"; + + return spec; +} + bool HDHRChannel::Tune(const DTVMultiplex &tuning, QString /*inputname*/) { - QString chan = tuning.modulation.toString() + ':' + - QString::number(tuning.frequency); + QString chan = QString("%1:%2") + .arg(get_tune_spec(_tuner_types, tuning)).arg(tuning.frequency); VERBOSE(VB_CHANNEL, LOC + "Tuning to " + chan); diff --git a/mythtv/libs/libmythtv/hdhrstreamhandler.cpp b/mythtv/libs/libmythtv/hdhrstreamhandler.cpp index 95462a8..9a95957 100644 --- a/mythtv/libs/libmythtv/hdhrstreamhandler.cpp +++ b/mythtv/libs/libmythtv/hdhrstreamhandler.cpp @@ -260,7 +260,11 @@ bool HDHRStreamHandler::Open(void) { const char *model = hdhomerun_device_get_model_str(_hdhomerun_device); _tuner_types.clear(); - if (QString(model).toLower().contains("dvb")) + if (QString(model).toLower().contains("cablecard")) + { + _tuner_types.push_back(DTVTunerType::kTunerTypeOCUR); + } + else if (QString(model).toLower().contains("dvb")) { _tuner_types.push_back(DTVTunerType::kTunerTypeDVBT); _tuner_types.push_back(DTVTunerType::kTunerTypeDVBC); @@ -386,18 +390,6 @@ QString HDHRStreamHandler::TunerSet( return QString::null; } - // Database modulation strings and HDHR use different syntax. - // HACK!! Caller should be doing this. (e.g. auto in HDHRChannel::Tune()) - // - if (error && name == QString("channel") && val.contains("qam_")) - { - QString newval = val; - newval.replace("qam_256", "qam"); - newval.replace("qam_64", "qam"); - VERBOSE(VB_CHANNEL, "HDHRSH::TunerSet() Failed. Trying " + newval); - return TunerSet(name, newval, report_error_return, print_error); - } - if (report_error_return && error) { if (print_error)