00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <vector>
00034 using namespace std;
00035
00036 #include "transporteditor.h"
00037 #include "videosource.h"
00038 #include "cardutil.h"
00039 #include "mythcontext.h"
00040 #include "mythdbcon.h"
00041
00042 #define LOC QString("DTVMux: ")
00043 #define LOC_ERR QString("DTVMux, Error: ")
00044
00045 class MultiplexID : public AutoIncrementDBSetting
00046 {
00047 public:
00048 MultiplexID() : AutoIncrementDBSetting("dtv_multiplex", "mplexid")
00049 {
00050 setVisible(false);
00051 setName("MPLEXID");
00052 }
00053
00054 public:
00055 QString getColumn(void) const { return DBStorage::getColumn(); }
00056 };
00057
00058 class TransportWizard : public ConfigurationWizard
00059 {
00060 public:
00061 TransportWizard(
00062 uint mplexid, uint sourceid, CardUtil::CARD_TYPES _cardtype);
00063
00064 private:
00065 MultiplexID *mplexid;
00066 };
00067
00068 static QString pp_modulation(QString mod)
00069 {
00070 if (mod.right(3) == "vsb")
00071 return mod.left(mod.length() - 3) + "-VSB";
00072
00073 if (mod.left(4) == "qam_")
00074 return "QAM-" + mod.mid(4, mod.length());
00075
00076 if (mod == "analog")
00077 return QObject::tr("Analog");
00078
00079 return mod.upper();
00080 }
00081
00082 void TransportList::fillSelections(void)
00083 {
00084
00085
00086 clearSelections();
00087 addSelection("(" + tr("New Transport") + ")", "0");
00088
00089 setHelpText(QObject::tr(
00090 "This section lists each transport that MythTV "
00091 "currently knows about. The display fields are "
00092 "video source, modulation, frequency, and when "
00093 "relevant symbol rate, network id, and transport id."));
00094
00095 if (!sourceid)
00096 return;
00097
00098 MSqlQuery query(MSqlQuery::InitCon());
00099 query.prepare(
00100 "SELECT mplexid, modulation, frequency, "
00101 " symbolrate, networkid, transportid, constellation "
00102 "FROM dtv_multiplex, videosource "
00103 "WHERE dtv_multiplex.sourceid = :SOURCEID AND "
00104 " dtv_multiplex.sourceid = videosource.sourceid "
00105 "ORDER by networkid, transportid, frequency, mplexid");
00106 query.bindValue(":SOURCEID", sourceid);
00107
00108 if (!query.exec() || !query.isActive())
00109 {
00110 MythContext::DBError("TransportList::fillSelections", query);
00111 return;
00112 }
00113
00114 while (query.next())
00115 {
00116 QString rawmod = (CardUtil::OFDM == cardtype) ?
00117 query.value(6).toString() : query.value(1).toString();
00118
00119 QString mod = pp_modulation(rawmod);
00120 while (mod.length() < 7)
00121 mod += " ";
00122
00123 QString rate = query.value(3).toString();
00124 rate = (rate == "0") ? "" : QString("rate %1").arg(rate);
00125
00126 QString netid = query.value(4).toUInt() ?
00127 QString("netid %1").arg(query.value(4).toUInt(), 5) : "";
00128
00129 QString tid = query.value(5).toUInt() ?
00130 QString("tid %1").arg(query.value(5).toUInt(), 5) : "";
00131
00132 QString hz = (CardUtil::QPSK == cardtype) ? "kHz" : "Hz";
00133
00134 QString type = "";
00135 if (CardUtil::OFDM == cardtype)
00136 type = "(DVB-T)";
00137 if (CardUtil::QPSK == cardtype)
00138 type = "(DVB-S)";
00139 if (CardUtil::QAM == cardtype)
00140 type = "(DVB-C)";
00141
00142 QString txt = QString("%1 %2 %3 %4 %5 %6 %7")
00143 .arg(mod).arg(query.value(2).toString())
00144 .arg(hz).arg(rate).arg(netid).arg(tid).arg(type);
00145
00146 addSelection(txt, query.value(0).toString());
00147 }
00148 }
00149
00150 static CardUtil::CARD_TYPES get_cardtype(uint sourceid)
00151 {
00152 vector<uint> cardids;
00153
00154
00155 MSqlQuery query(MSqlQuery::InitCon());
00156 query.prepare(
00157 "SELECT capturecard.cardid "
00158 "FROM cardinput, capturecard "
00159 "WHERE capturecard.cardid = cardinput.cardid AND "
00160 " cardinput.sourceid = :SOURCEID AND "
00161 " capturecard.hostname = :HOSTNAME");
00162 query.bindValue(":SOURCEID", sourceid);
00163 query.bindValue(":HOSTNAME", gContext->GetHostName());
00164
00165 if (!query.exec() || !query.isActive())
00166 {
00167 MythContext::DBError("TransportWizard()", query);
00168 return CardUtil::ERROR_PROBE;
00169 }
00170 else
00171 {
00172 while (query.next())
00173 cardids.push_back(query.value(0).toUInt());
00174 }
00175
00176 if (cardids.empty())
00177 {
00178 MythPopupBox::showOkPopup(
00179 gContext->GetMainWindow(),
00180 QObject::tr("Transport Editor"),
00181 QObject::tr(
00182 "Sorry, the Transport Editor can only be used to "
00183 "edit transports which are connected to a card input."));
00184
00185 return CardUtil::ERROR_PROBE;
00186 }
00187
00188 vector<CardUtil::CARD_TYPES> cardtypes;
00189
00190 vector<uint>::const_iterator it = cardids.begin();
00191 for (; it != cardids.end(); ++it)
00192 {
00193 CardUtil::CARD_TYPES nType = CardUtil::ERROR_PROBE;
00194 QString cardtype = CardUtil::GetRawCardType(*it);
00195 if (cardtype == "DVB")
00196 cardtype = CardUtil::ProbeSubTypeName(*it);
00197 nType = CardUtil::toCardType(cardtype);
00198
00199 if ((CardUtil::ERROR_OPEN == nType) ||
00200 (CardUtil::ERROR_UNKNOWN == nType) ||
00201 (CardUtil::ERROR_PROBE == nType))
00202 {
00203 MythPopupBox::showOkPopup(
00204 gContext->GetMainWindow(),
00205 QObject::tr("Transport Editor"),
00206 QObject::tr(
00207 "Failed to probe a capture card connected to this "
00208 "transport's video source. Please make sure the "
00209 "backend is not running."));
00210
00211 return CardUtil::ERROR_PROBE;
00212 }
00213
00214 cardtypes.push_back(nType);
00215 }
00216
00217
00218 if (cardtypes.empty())
00219 return CardUtil::ERROR_PROBE;
00220
00221 for (uint i = 1; i < cardtypes.size(); i++)
00222 {
00223 CardUtil::CARD_TYPES typeA = cardtypes[i - 1];
00224 typeA = (CardUtil::HDHOMERUN == typeA) ? CardUtil::ATSC : typeA;
00225 typeA = (CardUtil::MPEG == typeA) ? CardUtil::V4L : typeA;
00226
00227 CardUtil::CARD_TYPES typeB = cardtypes[i + 0];
00228 typeB = (CardUtil::HDHOMERUN == typeB) ? CardUtil::ATSC : typeB;
00229 typeB = (CardUtil::MPEG == typeB) ? CardUtil::V4L : typeB;
00230
00231 if (typeA == typeB)
00232 continue;
00233
00234 MythPopupBox::showOkPopup(
00235 gContext->GetMainWindow(),
00236 QObject::tr("Transport Editor"),
00237 QObject::tr(
00238 "The Video Sources to which this Transport is connected "
00239 "are incompatible, please create seperate video sources "
00240 "for these cards. "));
00241
00242 return CardUtil::ERROR_PROBE;
00243 }
00244
00245 return cardtypes[0];
00246 }
00247
00248 void TransportList::SetSourceID(uint _sourceid)
00249 {
00250
00251
00252 if (!_sourceid)
00253 {
00254 sourceid = 0;
00255 }
00256 else
00257 {
00258 cardtype = get_cardtype(_sourceid);
00259 sourceid = ((CardUtil::ERROR_OPEN == cardtype) ||
00260 (CardUtil::ERROR_UNKNOWN == cardtype) ||
00261 (CardUtil::ERROR_PROBE == cardtype)) ? 0 : _sourceid;
00262 }
00263
00264 fillSelections();
00265 }
00266
00267 TransportListEditor::TransportListEditor(uint sourceid) :
00268 m_videosource(new VideoSourceSelector(sourceid, QString::null, false)),
00269 m_list(new TransportList())
00270 {
00271 setLabel(tr("Multiplex Editor"));
00272
00273 m_list->SetSourceID(m_videosource->GetSourceID());
00274
00275 addChild(m_videosource);
00276 addChild(m_list);
00277
00278 connect(m_videosource, SIGNAL(valueChanged(const QString&)),
00279 m_list, SLOT( SetSourceID( const QString&)));
00280
00281 connect(m_list, SIGNAL(accepted(int)), this, SLOT(Edit()));
00282 connect(m_list, SIGNAL(menuButtonPressed(int)), this, SLOT(Menu()));
00283 connect(m_list, SIGNAL(editButtonPressed(int)), this, SLOT(Edit()));
00284 connect(m_list, SIGNAL(deleteButtonPressed(int)), this, SLOT(Delete()));
00285 }
00286
00287 DialogCode TransportListEditor::exec(void)
00288 {
00289 while (ConfigurationDialog::exec() == kDialogCodeAccepted);
00290
00291 return kDialogCodeRejected;
00292 }
00293
00294 void TransportListEditor::Edit(void)
00295 {
00296 uint sourceid = m_videosource->getValue().toUInt();
00297 CardUtil::CARD_TYPES cardtype = get_cardtype(sourceid);
00298
00299 if ((CardUtil::ERROR_OPEN != cardtype) &&
00300 (CardUtil::ERROR_UNKNOWN != cardtype) &&
00301 (CardUtil::ERROR_PROBE != cardtype))
00302 {
00303 uint mplexid = m_list->getValue().toUInt();
00304 TransportWizard wiz(mplexid, sourceid, cardtype);
00305 wiz.exec();
00306 m_list->fillSelections();
00307 }
00308 }
00309
00310 void TransportListEditor::Delete(void)
00311 {
00312 uint mplexid = m_list->getValue().toInt();
00313
00314 DialogCode val = MythPopupBox::Show2ButtonPopup(
00315 gContext->GetMainWindow(), "",
00316 tr("Are you sure you would like to delete this transport?"),
00317 tr("Yes, delete the transport"),
00318 tr("No, don't"), kDialogCodeButton1);
00319
00320 if (kDialogCodeButton0 != val)
00321 return;
00322
00323 MSqlQuery query(MSqlQuery::InitCon());
00324 query.prepare("DELETE FROM dtv_multiplex WHERE mplexid = :MPLEXID");
00325 query.bindValue(":MPLEXID", mplexid);
00326
00327 if (!query.exec() || !query.isActive())
00328 MythContext::DBError("TransportEditor -- delete multiplex", query);
00329
00330 query.prepare("DELETE FROM channel WHERE mplexid = :MPLEXID");
00331 query.bindValue(":MPLEXID", mplexid);
00332
00333 if (!query.exec() || !query.isActive())
00334 MythContext::DBError("TransportEditor -- delete channels", query);
00335
00336 m_list->fillSelections();
00337 }
00338
00339 void TransportListEditor::Menu(void)
00340 {
00341 uint mplexid = m_list->getValue().toInt();
00342
00343 if (!mplexid)
00344 {
00345 Edit();
00346 return;
00347 }
00348
00349 DialogCode val = MythPopupBox::Show2ButtonPopup(
00350 gContext->GetMainWindow(),
00351 "",
00352 tr("Transport Menu"),
00353 tr("Edit.."),
00354 tr("Delete.."), kDialogCodeButton0);
00355
00356 if (kDialogCodeButton0 == val)
00357 emit Edit();
00358 else if (kDialogCodeButton1 == val)
00359 emit Delete();
00360 else
00361 m_list->setFocus();
00362 }
00363
00364 class MuxDBStorage : public SimpleDBStorage
00365 {
00366 protected:
00367 MuxDBStorage(Setting *_setting, const MultiplexID *_id, QString _name) :
00368 SimpleDBStorage(_setting, "dtv_multiplex", _name), mplexid(_id)
00369 {
00370 _setting->setName(_name);
00371 }
00372
00373 virtual QString setClause(MSqlBindings &bindings);
00374 virtual QString whereClause(MSqlBindings &bindings);
00375
00376 const MultiplexID *mplexid;
00377 };
00378
00379 QString MuxDBStorage::whereClause(MSqlBindings &bindings)
00380 {
00381 QString muxTag = ":WHERE" + mplexid->getColumn().upper();
00382
00383 bindings.insert(muxTag, mplexid->getValue());
00384
00385
00386 return mplexid->getColumn() + " = " + muxTag;
00387 }
00388
00389 QString MuxDBStorage::setClause(MSqlBindings &bindings)
00390 {
00391 QString muxTag = ":SET" + mplexid->getColumn().upper();
00392 QString nameTag = ":SET" + setting->getName().upper();
00393
00394 bindings.insert(muxTag, mplexid->getValue());
00395 bindings.insert(nameTag, setting->getValue());
00396
00397
00398 return (mplexid->getColumn() + " = " + muxTag + ", " +
00399 setting->getName() + " = " + nameTag);
00400 }
00401
00402
00403 class VideoSourceID : public IntegerSetting, public MuxDBStorage
00404 {
00405 public:
00406 VideoSourceID(const MultiplexID *id, uint _sourceid) :
00407 IntegerSetting(this),
00408 MuxDBStorage(this, id, "sourceid")
00409 {
00410 setVisible(false);
00411 setValue(_sourceid);
00412 }
00413 };
00414
00415 class DTVStandard : public ComboBoxSetting, public MuxDBStorage
00416 {
00417 public:
00418 DTVStandard(const MultiplexID *id,
00419 bool is_dvb_country,
00420 bool is_atsc_country) :
00421 ComboBoxSetting(this), MuxDBStorage(this, id, "sistandard")
00422 {
00423 setLabel(QObject::tr("Digital TV Standard"));
00424 setHelpText(QObject::tr(
00425 "Guiding standard to use for making sense of the "
00426 "data streams after they have been demodulated, "
00427 "error corrected and demultiplexed."));
00428 if (is_dvb_country)
00429 addSelection(QObject::tr("DVB"), "dvb");
00430
00431 if (is_atsc_country)
00432 {
00433 addSelection(QObject::tr("ATSC"), "atsc");
00434 addSelection(QObject::tr("OpenCable"), "opencable");
00435 }
00436
00437 addSelection(QObject::tr("MPEG"), "mpeg");
00438 };
00439 };
00440
00441 class Frequency : public LineEditSetting, public MuxDBStorage
00442 {
00443 public:
00444 Frequency(const MultiplexID *id, bool in_kHz = false) :
00445 LineEditSetting(this), MuxDBStorage(this, id, "frequency")
00446 {
00447 QString hz = (in_kHz) ? "kHz" : "Hz";
00448 setLabel(QObject::tr("Frequency") + " (" + hz + ")");
00449 setHelpText(QObject::tr(
00450 "Frequency (Option has no default).\n"
00451 "The frequency for this channel in") + " " + hz + ".");
00452 };
00453 };
00454
00455 class DVBSymbolRate : public ComboBoxSetting, public MuxDBStorage
00456 {
00457 public:
00458 DVBSymbolRate(const MultiplexID *id) :
00459 ComboBoxSetting(this, true), MuxDBStorage(this, id, "symbolrate")
00460 {
00461 setLabel(QObject::tr("Symbol Rate"));
00462 setHelpText(
00463 QObject::tr(
00464 "Symbol Rate (symbols/second).\n"
00465 "Most dvb-s transponders transmit at 27.5 "
00466 "million symbols per second."));
00467 addSelection("3333000");
00468 addSelection("22000000");
00469 addSelection("27500000", "27500000", true);
00470 addSelection("28000000");
00471 addSelection("28500000");
00472 addSelection("29900000");
00473 };
00474 };
00475
00476 class SignalPolarity : public ComboBoxSetting, public MuxDBStorage
00477 {
00478 public:
00479 SignalPolarity(const MultiplexID *id) :
00480 ComboBoxSetting(this), MuxDBStorage(this, id, "polarity")
00481 {
00482 setLabel(QObject::tr("Polarity"));
00483 setHelpText(QObject::tr("Polarity (Option has no default)"));
00484 addSelection(QObject::tr("Horizontal"), "h");
00485 addSelection(QObject::tr("Vertical"), "v");
00486 addSelection(QObject::tr("Right Circular"), "r");
00487 addSelection(QObject::tr("Left Circular"), "l");
00488 };
00489 };
00490
00491 class Modulation : public ComboBoxSetting, public MuxDBStorage
00492 {
00493 public:
00494 Modulation(const MultiplexID *id, uint nType);
00495 };
00496
00497 Modulation::Modulation(const MultiplexID *id, uint nType) :
00498 ComboBoxSetting(this),
00499 MuxDBStorage(this, id, (CardUtil::OFDM == nType) ?
00500 "constellation" : "modulation")
00501 {
00502 setLabel(QObject::tr("Modulation"));
00503 setHelpText(QObject::tr("Modulation, aka Constellation"));
00504
00505 if (CardUtil::QPSK == nType)
00506 {
00507
00508 setVisible(false);
00509 }
00510 else if ((CardUtil::QAM == nType) || (CardUtil::OFDM == nType))
00511 {
00512 addSelection(QObject::tr("QAM Auto"), "auto");
00513 addSelection("QAM-16", "qam_16");
00514 addSelection("QAM-32", "qam_32");
00515 addSelection("QAM-64", "qam_64");
00516 addSelection("QAM-128", "qam_128");
00517 addSelection("QAM-256", "qam_256");
00518
00519 if (CardUtil::OFDM == nType)
00520 {
00521 addSelection("QPSK", "qpsk");
00522 }
00523 }
00524 else if ((CardUtil::ATSC == nType) ||
00525 (CardUtil::HDHOMERUN == nType))
00526 {
00527 addSelection("8-VSB", "8vsb");
00528 addSelection("QAM-64", "qam_64");
00529 addSelection("QAM-256", "qam_256");
00530 }
00531 else
00532 {
00533 addSelection(QObject::tr("Analog"), "analog");
00534 setVisible(false);
00535 }
00536 };
00537
00538 class DVBInversion : public ComboBoxSetting, public MuxDBStorage
00539 {
00540 public:
00541 DVBInversion(const MultiplexID *id) :
00542 ComboBoxSetting(this), MuxDBStorage(this, id, "inversion")
00543 {
00544 setLabel(QObject::tr("Inversion"));
00545 setHelpText(QObject::tr("Inversion (Default: Auto):\n"
00546 "Most cards can autodetect this now, so leave it at Auto"
00547 " unless it won't work."));
00548 addSelection(QObject::tr("Auto"), "a");
00549 addSelection(QObject::tr("On"), "1");
00550 addSelection(QObject::tr("Off"), "0");
00551 };
00552 };
00553
00554 class DVBTBandwidth : public ComboBoxSetting, public MuxDBStorage
00555 {
00556 public:
00557 DVBTBandwidth(const MultiplexID *id) :
00558 ComboBoxSetting(this), MuxDBStorage(this, id, "bandwidth")
00559 {
00560 setLabel(QObject::tr("Bandwidth"));
00561 setHelpText(QObject::tr("Bandwidth (Default: Auto)"));
00562 addSelection(QObject::tr("Auto"), "a");
00563 addSelection(QObject::tr("6 MHz"), "6");
00564 addSelection(QObject::tr("7 MHz"), "7");
00565 addSelection(QObject::tr("8 MHz"), "8");
00566 };
00567 };
00568
00569 class DVBForwardErrorCorrectionSelector : public ComboBoxSetting
00570 {
00571 public:
00572 DVBForwardErrorCorrectionSelector(Storage *_storage) :
00573 ComboBoxSetting(_storage)
00574 {
00575 addSelection(QObject::tr("Auto"), "auto");
00576 addSelection(QObject::tr("None"), "none");
00577 addSelection("1/2");
00578 addSelection("2/3");
00579 addSelection("3/4");
00580 addSelection("4/5");
00581 addSelection("5/6");
00582 addSelection("6/7");
00583 addSelection("7/8");
00584 addSelection("8/9");
00585 };
00586 };
00587
00588 class DVBForwardErrorCorrection :
00589 public DVBForwardErrorCorrectionSelector, public MuxDBStorage
00590 {
00591 public:
00592 DVBForwardErrorCorrection(const MultiplexID *id) :
00593 DVBForwardErrorCorrectionSelector(this),
00594 MuxDBStorage(this, id, "fec")
00595 {
00596 setLabel(QObject::tr("FEC"));
00597 setHelpText(QObject::tr("Forward Error Correction (Default: Auto)"));
00598 };
00599 };
00600
00601 class DVBTCoderateLP :
00602 public DVBForwardErrorCorrectionSelector, public MuxDBStorage
00603 {
00604 public:
00605 DVBTCoderateLP(const MultiplexID *id) :
00606 DVBForwardErrorCorrectionSelector(this),
00607 MuxDBStorage(this, id, "lp_code_rate")
00608 {
00609 setLabel(QObject::tr("LP Coderate"));
00610 setHelpText(QObject::tr("Low Priority Code Rate (Default: Auto)"));
00611 };
00612 };
00613
00614 class DVBTCoderateHP :
00615 public DVBForwardErrorCorrectionSelector, public MuxDBStorage
00616 {
00617 public:
00618 DVBTCoderateHP(const MultiplexID *id) :
00619 DVBForwardErrorCorrectionSelector(this),
00620 MuxDBStorage(this, id, "hp_code_rate")
00621 {
00622 setLabel(QObject::tr("HP Coderate"));
00623 setHelpText(QObject::tr("High Priority Code Rate (Default: Auto)"));
00624 };
00625 };
00626
00627 class DVBTGuardInterval : public ComboBoxSetting, public MuxDBStorage
00628 {
00629 public:
00630 DVBTGuardInterval(const MultiplexID *id) :
00631 ComboBoxSetting(this), MuxDBStorage(this, id, "guard_interval")
00632 {
00633 setLabel(QObject::tr("Guard Interval"));
00634 setHelpText(QObject::tr("Guard Interval (Default: Auto)"));
00635 addSelection(QObject::tr("Auto"), "auto");
00636 addSelection("1/4");
00637 addSelection("1/8");
00638 addSelection("1/16");
00639 addSelection("1/32");
00640 };
00641 };
00642
00643 class DVBTTransmissionMode : public ComboBoxSetting, public MuxDBStorage
00644 {
00645 public:
00646 DVBTTransmissionMode(const MultiplexID *id) :
00647 ComboBoxSetting(this), MuxDBStorage(this, id, "transmission_mode")
00648 {
00649 setLabel(QObject::tr("Trans. Mode"));
00650 setHelpText(QObject::tr("Transmission Mode (Default: Auto)"));
00651 addSelection(QObject::tr("Auto"), "a");
00652 addSelection("2K", "2");
00653 addSelection("8K", "8");
00654 };
00655 };
00656
00657 class DVBTHierarchy : public ComboBoxSetting, public MuxDBStorage
00658 {
00659 public:
00660 DVBTHierarchy(const MultiplexID *id) :
00661 ComboBoxSetting(this), MuxDBStorage(this, id, "hierarchy")
00662 {
00663 setLabel(QObject::tr("Hierarchy"));
00664 setHelpText(QObject::tr("Hierarchy (Default: Auto)"));
00665 addSelection(QObject::tr("Auto"), "a");
00666 addSelection(QObject::tr("None"), "n");
00667 addSelection("1");
00668 addSelection("2");
00669 addSelection("4");
00670 }
00671 };
00672
00673
00674 class TransportPage : public HorizontalConfigurationGroup
00675 {
00676 public:
00677 TransportPage(const MultiplexID *id, uint nType);
00678
00679 protected:
00680 const MultiplexID *id;
00681 };
00682
00683 TransportPage::TransportPage(const MultiplexID *_id, uint nType) :
00684 HorizontalConfigurationGroup(false, true, false, false), id(_id)
00685 {
00686 setLabel(QObject::tr("Transport Options"));
00687 setUseLabel(false);
00688
00689 VerticalConfigurationGroup *left = NULL, *right = NULL;
00690
00691 left = new VerticalConfigurationGroup(false, true, false, false);
00692
00693 if (CardUtil::OFDM == nType)
00694 {
00695 left->addChild(new DTVStandard(id, true, false));
00696 left->addChild(new Frequency(id));
00697 left->addChild(new DVBTBandwidth(id));
00698 left->addChild(new DVBInversion(id));
00699 left->addChild(new Modulation(id, nType));
00700
00701 right = new VerticalConfigurationGroup(false, true, false, false);
00702 right->addChild(new DVBTCoderateLP(id));
00703 right->addChild(new DVBTCoderateHP(id));
00704 right->addChild(new DVBTTransmissionMode(id));
00705 right->addChild(new DVBTGuardInterval(id));
00706 right->addChild(new DVBTHierarchy(id));
00707 }
00708 else if (CardUtil::QPSK == nType)
00709 {
00710 left->addChild(new DTVStandard(id, true, false));
00711 left->addChild(new Frequency(id, true));
00712 left->addChild(new DVBSymbolRate(id));
00713
00714 right = new VerticalConfigurationGroup(false, true, false, false);
00715 right->addChild(new DVBInversion(id));
00716 right->addChild(new DVBForwardErrorCorrection(id));
00717 right->addChild(new SignalPolarity(id));
00718 }
00719 else if (CardUtil::QAM == nType)
00720 {
00721 left->addChild(new DTVStandard(id, true, false));
00722 left->addChild(new Frequency(id));
00723 left->addChild(new DVBSymbolRate(id));
00724
00725 right = new VerticalConfigurationGroup(false, true, false, false);
00726 right->addChild(new Modulation(id, nType));
00727 right->addChild(new DVBInversion(id));
00728 right->addChild(new DVBForwardErrorCorrection(id));
00729 }
00730 else if (CardUtil::ATSC == nType ||
00731 CardUtil::HDHOMERUN == nType)
00732 {
00733 left->addChild(new DTVStandard(id, false, true));
00734 left->addChild(new Frequency(id));
00735 left->addChild(new Modulation(id, nType));
00736 }
00737 else if ((CardUtil::FIREWIRE == nType) ||
00738 (CardUtil::FREEBOX == nType))
00739 {
00740 left->addChild(new DTVStandard(id, true, true));
00741 }
00742 else if ((CardUtil::V4L == nType) ||
00743 (CardUtil::MPEG == nType))
00744 {
00745 left->addChild(new Frequency(id));
00746 left->addChild(new Modulation(id, nType));
00747 }
00748
00749 addChild(left);
00750
00751 if (right)
00752 addChild(right);
00753 };
00754
00755 TransportWizard::TransportWizard(
00756 uint _mplexid, uint _sourceid, CardUtil::CARD_TYPES _cardtype) :
00757 mplexid(new MultiplexID())
00758 {
00759 setLabel(QObject::tr("DVB Transport"));
00760
00761
00762 mplexid->setValue(_mplexid);
00763 addChild(mplexid);
00764 addChild(new VideoSourceID(mplexid, _sourceid));
00765 addChild(new TransportPage(mplexid, _cardtype));
00766 }