Ticket #1133: 1133-v7.patch

File 1133-v7.patch, 28.0 KB (added by danielk, 15 years ago)

updated patch

  • libs/libmythtv/cardutil.h

     
    7070
    7171    static int          GetCardID(const QString &videodevice,
    7272                                  QString hostname = QString::null);
     73    static uint         GetChildCardID(uint cardid);
     74    static uint         GetParentCardID(uint cardid);
    7375
    7476    static bool         IsCardTypePresent(const QString &strType);
    7577
     
    8183    static bool         GetVideoDevice(uint cardid, QString& device,
    8284                                       QString& vbi);
    8385    static QString      GetVideoDevice(uint cardid);
     86    static QString      GetVideoDevice(uint cardid, uint sourceid);
    8487
    8588    static QString      GetDefaultInput(uint cardid);
    8689    static QString      GetInputName(uint cardid, uint sourceid);
     
    9699                                      QString             device,
    97100                                      QString             cardtype,
    98101                                      QStringList        &inputLabels,
    99                                       vector<CardInput*> &cardInputs);
     102                                      vector<CardInput*> &cardInputs,
     103                                      int                 parentid = 0);
    100104    // DTV info
    101105    static bool         GetTimeouts(uint cardid,
    102106                                    uint &signal_timeout,
     
    119123  private:
    120124    static QStringList  probeV4LInputs(QString device);
    121125    static QStringList  probeDVBInputs(QString device, int diseqctype = -1);
     126    static QStringList  probeChildInputs(QString device);
    122127
    123128    static QStringList  fillDVBInputs(int dvb_diseqc_type);
    124129    static DiSEqCList   fillDVBInputsDiSEqC(int dvb_diseqc_type);
  • libs/libmythtv/videosource.h

     
    262262    DVBCardType        *cardtype;
    263263    SignalTimeout      *signal_timeout;
    264264    ChannelTimeout     *channel_timeout;
     265    TransButtonSetting *buttonAnalog;
    265266};
    266267
    267268class CaptureCardGroup: public VerticalConfigurationGroup,
     
    277278class CaptureCard: public ConfigurationWizard {
    278279    Q_OBJECT
    279280public:
    280     CaptureCard();
     281    CaptureCard(bool use_card_group = true);
    281282
    282283    int  getCardID(void) const { return id->intValue(); }
    283284
    284285    void loadByID(int id);
     286    void setParentID(int id);
    285287
    286288    static void fillSelections(SelectSetting* setting);
     289    static void fillSelections(SelectSetting* setting, bool no_children);
    287290
    288291    void load() {
    289292        ConfigurationWizard::load();
     
    291294
    292295public slots:
    293296    void DiSEqCPanel();
     297    void analogPanel();
    294298    void recorderOptionsPanel();
    295299
    296300private:
     
    306310        };
    307311    };
    308312
     313    class ParentID: public CCSetting
     314    {
     315      public:
     316        ParentID(const CaptureCard &parent) : CCSetting(parent, "parentid")
     317        {
     318            setValue("0");
     319            setVisible(false);
     320        }
     321    };
     322
    309323    class Hostname: public HostnameSetting, public CCSetting {
    310324    public:
    311325        Hostname(const CaptureCard& parent): CCSetting(parent, "hostname") {};
     
    313327
    314328private:
    315329    ID       *id;
     330    ParentID *parentid;
    316331};
    317332
    318333class CardInput;
     
    414429};
    415430
    416431class CardID;
     432class ChildID;
    417433class InputName;
    418434class SourceID;
    419435class DVBLNBChooser;
     
    436452    QString getSourceName(void) const;
    437453
    438454    void fillDiseqcSettingsInput(QString _pos, QString _port);
     455    void SetChildCardID(uint);
    439456
    440457    virtual void save();
    441458    virtual void save(QString /*destination*/) { save(); }
     
    465482
    466483    ID              *id;
    467484    CardID          *cardid;
     485    ChildID         *childid;
    468486    InputName       *inputname;
    469487    SourceID        *sourceid;
    470488    DVBLNBChooser   *lnbsettings;
  • libs/libmythtv/cardutil.cpp

     
    216216    return QString::null;
    217217}
    218218
     219QString CardUtil::GetVideoDevice(uint cardid, uint sourceid)
     220{
     221    QString device = QString::null;
     222
     223    MSqlQuery query(MSqlQuery::InitCon());
     224    query.prepare("SELECT videodevice "
     225                  "FROM capturecard, cardinput "
     226                  "WHERE sourceid         = :SOURCEID AND "
     227                  "      cardinput.cardid = :CARDID   AND "
     228                  "      ( ( cardinput.childcardid != '0' AND "
     229                  "          cardinput.childcardid  = capturecard.cardid ) OR "
     230                  "        ( cardinput.childcardid  = '0' AND "
     231                  "          cardinput.cardid       = capturecard.cardid ) )");
     232    query.bindValue(":CARDID", cardid);
     233    query.bindValue(":SOURCEID", sourceid);
     234
     235    if (!query.exec() || !query.isActive())
     236        MythContext::DBError("CardUtil::GetVideoDevice() 2", query);
     237    else if (query.next())
     238        device = query.value(0).toString();
     239
     240    return device;   
     241}
     242
    219243/** \fn CardUtil::GetCardID(const QString&, QString)
    220244 *  \brief Returns the cardid of the card that uses the specified
    221245 *         videodevice, and optionally a non-local hostname.
     
    244268    return -1;
    245269}
    246270
     271uint CardUtil::GetChildCardID(uint cardid)
     272{
     273    // check if child card definition does exist
     274    MSqlQuery query(MSqlQuery::InitCon());
     275    query.prepare(
     276        "SELECT cardid "
     277        "FROM capturecard "
     278        "WHERE parentid = :CARDID");
     279    query.bindValue(":CARDID", cardid);
     280
     281    int ret = 0;
     282    if (!query.exec() || !query.isActive())
     283        MythContext::DBError("CaptureCard::GetChildCardID()", query);
     284    else if (query.next())
     285        ret = query.value(0).toInt();
     286
     287    return ret;
     288}
     289
     290uint CardUtil::GetParentCardID(uint cardid)
     291{
     292    // check if child card definition does exists
     293    MSqlQuery query(MSqlQuery::InitCon());
     294    query.prepare(
     295        "SELECT parentid "
     296        "FROM capturecard "
     297        "WHERE cardid = :CARDID");
     298    query.bindValue(":CARDID", cardid);
     299
     300    int ret = 0;
     301    if (!query.exec() || !query.isActive())
     302        MythContext::DBError("CaptureCard::GetParentCardID()", query);
     303    else if (query.next())
     304        ret = query.value(0).toInt();
     305
     306    return ret;
     307}
     308
    247309/** \fn CardUtil::GetVideoDevice(uint, QString&, QString&)
    248310 *  \brief Returns the the video device associated with the card id
    249311 *  \param nCardID card id to check
     
    510572    else
    511573        ret += probeV4LInputs(device);
    512574
     575    ret += probeChildInputs(device);
     576
    513577    return ret;
    514578}
    515579
     
    567631    return ret;
    568632}
    569633
     634QStringList CardUtil::probeChildInputs(QString device)
     635{
     636    QStringList ret;
     637
     638    int cardid = CardUtil::GetCardID(device);
     639    if (cardid <= 0)
     640        return ret;
     641
     642    MSqlQuery query(MSqlQuery::InitCon());
     643    query.prepare("SELECT videodevice, cardtype "
     644                  "FROM capturecard "
     645                  "WHERE parentid = :CARDID");
     646    query.bindValue(":CARDID", cardid);
     647
     648    if (!query.exec() || !query.isActive())
     649        return ret;
     650
     651    while (query.next())
     652        ret += probeInputs(query.value(0).toString(),
     653                           query.value(1).toString());
     654
     655    return ret;
     656}
     657
    570658QValueList<DVBDiSEqCInput>
    571659CardUtil::fillDVBInputsDiSEqC(int dvb_diseqc_type)
    572660{
     
    677765    QString             device,
    678766    QString             cardtype,
    679767    QStringList        &inputLabels,
    680     vector<CardInput*> &cardInputs)
     768    vector<CardInput*> &cardInputs,
     769    int                 parentid)
    681770{
    682     int rcardid = cardid;
     771    int rcardid = (parentid) ? parentid : cardid;
    683772    QStringList inputs;
    684773
    685774    if (("FIREWIRE" == cardtype) || ("DBOX2" == cardtype))
     
    687776    else if ("DVB" != cardtype)
    688777        inputs += probeV4LInputs(device);
    689778
    690     QString dev_label = GetDeviceLabel(cardid, cardtype, device);
     779    QString dev_label = (parentid) ? " -> " : "";
     780    dev_label += GetDeviceLabel(cardid, cardtype, device);
    691781
    692782    QStringList::iterator it = inputs.begin();
    693783    for (; it != inputs.end(); ++it)
    694784    {
    695785        CardInput* cardinput = new CardInput(true);
    696786        cardinput->loadByInput(rcardid, (*it));
     787        cardinput->SetChildCardID((parentid) ? cardid : 0);
    697788        inputLabels.push_back(
    698789            dev_label + QString(" (%1) -> %2")
    699790            .arg(*it).arg(cardinput->getSourceName()));
     
    711802            CardInput* cardinput = new CardInput(true);
    712803            cardinput->loadByInput(rcardid, (*it).input);
    713804            cardinput->fillDiseqcSettingsInput((*it).position,(*it).port);
     805            cardinput->SetChildCardID((parentid) ? cardid : 0);
    714806            inputLabels.push_back(
    715807                dev_label + QString(" (%1) -> %2")
    716808                .arg((*it).input).arg(cardinput->getSourceName()));
    717809            cardInputs.push_back(cardinput);           
    718810        }
    719811    }
     812
     813    if (parentid)
     814        return;
     815
     816    MSqlQuery query(MSqlQuery::InitCon());
     817    query.prepare("SELECT cardid, videodevice, cardtype "
     818                  "FROM capturecard "
     819                  "WHERE parentid = :CARDID");
     820    query.bindValue(":CARDID", cardid);
     821
     822    if (!query.exec() || !query.isActive())
     823        return;
     824
     825    while (query.next())
     826    {
     827        GetCardInputs(query.value(0).toUInt(),
     828                      query.value(1).toString(),
     829                      query.value(2).toString(),
     830                      inputLabels, cardInputs, cardid);
     831    }
    720832}
  • libs/libmythtv/videosource.cpp

     
    10121012    TriggeredConfigurationGroup::triggerChanged(own);
    10131013}
    10141014
    1015 CaptureCard::CaptureCard()
     1015CaptureCard::CaptureCard(bool use_card_group)
    10161016{
    10171017    // must be first
    10181018    addChild(id = new ID());
    1019     addChild(new CaptureCardGroup(*this));
     1019    addChild(parentid = new ParentID(*this));
     1020    if (use_card_group)
     1021        addChild(new CaptureCardGroup(*this));
    10201022    addChild(new Hostname(*this));
    10211023}
    10221024
     1025void CaptureCard::setParentID(int id)
     1026{
     1027    parentid->setValue(QString::number(id));
     1028}
     1029
    10231030void CaptureCard::fillSelections(SelectSetting* setting)
    10241031{
     1032    CaptureCard::fillSelections(setting, false);
     1033}
     1034
     1035void CaptureCard::fillSelections(SelectSetting* setting, bool no_children)
     1036{
    10251037    MSqlQuery query(MSqlQuery::InitCon());
    1026     query.prepare(
     1038    QString qstr =
    10271039        "SELECT cardtype, videodevice, cardid, "
    10281040        "       firewire_port, firewire_node, "
    10291041        "       dbox2_port, dbox2_host, dbox2_httpport "
    10301042        "FROM capturecard "
    1031         "WHERE hostname = :HOSTNAME");
     1043        "WHERE hostname = :HOSTNAME";
     1044    if (no_children)
     1045        qstr += " AND parentid='0'";
     1046
     1047    query.prepare(qstr);
    10321048    query.bindValue(":HOSTNAME", gContext->GetHostName());
    10331049
    10341050    if (query.exec() && query.isActive() && query.size() > 0)
     
    11171133    };
    11181134};
    11191135
     1136class ChildID: public CISetting
     1137{
     1138  public:
     1139    ChildID(const CardInput &parent) : CISetting(parent, "childcardid")
     1140    {
     1141        setValue("0");
     1142        setVisible(false);
     1143    }
     1144};
     1145
    11201146class InputDisplayName: public LineEditSetting, public CISetting
    11211147{
    11221148  public:
     
    14251451
    14261452    addChild(group);
    14271453
     1454    childid = new ChildID(*this);
     1455    addChild(childid);
     1456
    14281457    setName("CardInput");
    14291458    connect(scan,     SIGNAL(pressed()), SLOT(channelScanner()));
    14301459    connect(srcfetch, SIGNAL(pressed()), SLOT(sourceFetch()));
     
    14371466    return sourceid->getSelectionLabel();
    14381467}
    14391468
     1469void CardInput::SetChildCardID(uint ccid)
     1470{
     1471    childid->setValue(QString::number(ccid));
     1472}
     1473
    14401474void CardInput::channelScanner(void)
    14411475{
    14421476    uint srcid = sourceid->getValue().toUInt();
     
    15951629    clearSelections();
    15961630    addSelection(QObject::tr("(New capture card)"), "0");
    15971631    addSelection(QObject::tr("(Delete all capture cards)"), "-1");
    1598     CaptureCard::fillSelections(this);
     1632    CaptureCard::fillSelections(this, true);
    15991633}
    16001634
    16011635MythDialog* CaptureCardEditor::dialogWidget(MythMainWindow* parent,
     
    18131847    query.prepare(
    18141848        "SELECT cardid, videodevice, cardtype "
    18151849        "FROM capturecard "
    1816         "WHERE hostname = :HOSTNAME");
     1850        "WHERE hostname = :HOSTNAME AND "
     1851        "      parentid = '0'");
    18171852    query.bindValue(":HOSTNAME", gContext->GetHostName());
    18181853
    18191854    if (!query.exec() || !query.isActive() || !query.size())
     
    18941929            cardname->setValue(name);
    18951930            signal_timeout->setValue(500);
    18961931            channel_timeout->setValue(3000);
     1932
     1933            if (name.left(6) == "pcHDTV")
     1934                buttonAnalog->setVisible(true);
     1935
    18971936            break;
    18981937        default:
    18991938            fEnable = false;
     
    19792018    TransButtonSetting *buttonDiSEqC = new TransButtonSetting();
    19802019    buttonDiSEqC->setLabel(tr("DiSEqC"));
    19812020
     2021    buttonAnalog = new TransButtonSetting();
     2022    buttonAnalog->setLabel(tr("Analog Options"));
     2023    buttonAnalog->setVisible(false);
     2024
    19822025    TransButtonSetting *buttonRecOpt = new TransButtonSetting();
    19832026    buttonRecOpt->setLabel(tr("Recording Options"));   
    19842027
    19852028    HorizontalConfigurationGroup *advcfg =
    19862029        new HorizontalConfigurationGroup(false, false, true, true);
    19872030    advcfg->addChild(buttonDiSEqC);
     2031    advcfg->addChild(buttonAnalog);
    19882032    advcfg->addChild(buttonRecOpt);
    19892033    addChild(advcfg);
    19902034
     
    20002044            this,         SLOT(  probeCard   (const QString&)));
    20012045    connect(buttonDiSEqC, SIGNAL(pressed()),
    20022046            &parent,      SLOT(  DiSEqCPanel()));
     2047    connect(buttonAnalog, SIGNAL(pressed()),
     2048            &parent,      SLOT(  analogPanel()));
    20032049    connect(buttonRecOpt, SIGNAL(pressed()),
    20042050            &parent,      SLOT(  recorderOptionsPanel()));
    20052051    connect(diseqctype,   SIGNAL(valueChanged(const QString&)),
     
    20182064    }
    20192065}
    20202066
     2067void CaptureCard::analogPanel()
     2068{
     2069    reload();
     2070
     2071    uint    cardid       = getCardID();
     2072    uint    child_cardid = CardUtil::GetChildCardID(cardid);
     2073    QString devname = "Unknown";
     2074    QString dev = CardUtil::GetVideoDevice(cardid);
     2075    if (!dev.isEmpty())
     2076        devname = QString("[ DVB : %1 ]").arg(devname);
     2077
     2078    CaptureCard *card = new CaptureCard(false);
     2079    card->addChild(new V4LConfigurationGroup(*card));
     2080    if (child_cardid)
     2081        card->loadByID(child_cardid);
     2082    else
     2083        card->setParentID(cardid);
     2084    card->setLabel(tr("Analog Options for ") + devname);
     2085    card->exec();
     2086    delete card;
     2087}
     2088
    20212089void CaptureCard::recorderOptionsPanel()
    20222090{
    20232091    reload();
  • libs/libmythtv/scanwizardhelpers.h

     
    204204  public:
    205205    enum Type
    206206    {
    207         Error_Open,
     207        Error_Open = 0,
    208208        Error_Probe,
    209209        FullScan_Analog,
    210210        FullScan_ATSC,
  • libs/libmythtv/scanwizard.cpp

     
    307307{
    308308    uint signal_timeout  = 1000;
    309309    uint channel_timeout = 40000;
    310     int  cardid  = parent->captureCard();
     310    int  ccardid = parent->captureCard();
     311    int  pcardid = CardUtil::GetParentCardID(ccardid);
     312    int  cardid  = (pcardid) ? pcardid : ccardid;
    311313    nScanType    = parent->scanType();
    312314    nVideoSource = parent->videoSource();
    313315    tunerthread_running = false;
     
    316318            QString("type(%1) src(%2) cardid(%3)")
    317319            .arg(nScanType).arg(nVideoSource).arg(cardid));
    318320
    319     CardUtil::GetTimeouts(cardid, signal_timeout, channel_timeout);
     321    CardUtil::GetTimeouts(ccardid, signal_timeout, channel_timeout);
    320322 
    321323    if (nScanType == ScanTypeSetting::FullScan_Analog)
    322324    {
     
    392394    {
    393395        nMultiplexToTuneTo = parent->paneSingle->GetMultiplex();
    394396
    395         QString device = CardUtil::GetVideoDevice(cardid);
     397        QString device = CardUtil::GetVideoDevice(cardid, nVideoSource);
    396398        if (device.isEmpty())
    397399            return;
    398400
    399401        QString cn, card_type;
    400         int nCardType = CardUtil::GetCardType(cardid, cn, card_type);
     402        int nCardType = CardUtil::GetCardType(ccardid, cn, card_type);
    401403        (void) nCardType;
    402404#ifdef USING_DVB
    403405        if (CardUtil::IsDVB(cardid))
  • libs/libmythtv/dbcheck.cpp

     
    1010#include "mythdbcon.h"
    1111
    1212/// This is the DB schema version expected by the running MythTV instance.
    13 const QString currentDatabaseVersion = "1124";
     13const QString currentDatabaseVersion = "1125";
    1414
    1515static bool UpdateDBVersionNumber(const QString &newnumber);
    1616static bool performActualUpdate(const QString updates[], QString version,
     
    20162016            return false;
    20172017    }
    20182018
     2019    if (dbver == "1124")
     2020    {
     2021        const QString updates[] = {
     2022"ALTER TABLE capturecard ADD parentid int(10) NOT NULL DEFAULT 0;",
     2023"ALTER TABLE cardinput ADD childcardid int(10) NOT NULL DEFAULT 0;",
     2024""
     2025};
     2026        if (!performActualUpdate(updates, "1125", dbver))
     2027            return false;
     2028    }
     2029
    20192030// Drop xvmc_buffer_settings table in 0.20
    20202031// Drop dvb_dmx_buf_size and dvb_pkt_buf_size columns of channel in 0.20
    20212032
  • libs/libmythtv/tv_rec.cpp

     
    33663366 */
    33673367void TVRec::TuningShutdowns(const TuningRequest &request)
    33683368{
     3369    uint curCardID = 0, newCardID = 0;
     3370    if (channel && !request.input.isEmpty())
     3371    {
     3372        int current_input = channel->GetCurrentInputNum();
     3373        int new_input     = channel->GetInputByName(request.input);
     3374        curCardID = channel->GetInputCardID(current_input);
     3375        newCardID = channel->GetInputCardID(new_input);
     3376        VERBOSE(VB_IMPORTANT, LOC +
     3377                "Real Tuner: <"<<curCardID<<":"<<newCardID<<">");
     3378    }
     3379    bool force_teardown = curCardID != newCardID;
     3380
    33693381#ifdef USING_DVB_EIT
    33703382    if (!(request.flags & kFlagEITScan) && HasFlags(kFlagEITScannerRunning))
    33713383    {
     
    33943406
    33953407    // At this point any waits are canceled.
    33963408
    3397     if ((request.flags & kFlagNoRec))
     3409    if ((request.flags & kFlagNoRec) || force_teardown)
    33983410    {
    33993411        if (HasFlags(kFlagDummyRecorderRunning))
    34003412        {
     
    34193431        CloseChannel();
    34203432        // At this point the channel is shut down
    34213433    }
     3434   
     3435    if (force_teardown)
     3436    {
     3437        VERBOSE(VB_IMPORTANT, "Recreating channel...");
     3438        channel->Close();
     3439        delete channel;
     3440        channel = NULL;
     3441        GetDevices(newCardID, genOpt, dvbOpt, fwOpt, dboxOpt);
     3442        genOpt.defaultinput = request.input;
     3443        QString startchannum = request.channel;
     3444        if (startchannum.isEmpty())
     3445            startchannum = GetStartChannel(newCardID, request.input);
     3446        CreateChannel(startchannum);
    34223447
     3448        if (!(request.flags & kFlagNoRec))
     3449            channel->Open();
     3450    }
     3451
    34233452    if (ringBuffer && (request.flags & kFlagKillRingBuffer))
    34243453    {
    34253454        VERBOSE(VB_RECORD, LOC + "Tearing down RingBuffer");
     
    37353764            SetFlags(kFlagRingBufferReady);
    37363765        }
    37373766        else
    3738             ok = SwitchLiveTVRingBuffer(true, !had_dummyrec);
     3767            ok = SwitchLiveTVRingBuffer(true, !had_dummyrec && recorder);
    37393768        if (!ok)
    37403769        {
    37413770            VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to create RingBuffer 2");
     
    38263855    if (GetV4LChannel())
    38273856        channel->SetFd(recorder->GetVideoFd());
    38283857
    3829     SetFlags(kFlagRecorderRunning);
     3858    SetFlags(kFlagRecorderRunning | kFlagRingBufferReady);
    38303859
    38313860    if (!tvchain)
    38323861        autoRunJobs = init_jobs(rec, profile, runJobOnHostOnly,
  • libs/libmythtv/channelbase.h

     
    2525    InputBase() :
    2626        name(QString::null),            startChanNum(QString::null),
    2727        tuneToChannel(QString::null),   externalChanger(QString::null),
    28         sourceid(0),
     28        sourceid(0),                    cardid(0),
    2929        inputNumV4L(-1),
    3030        videoModeV4L1(0),               videoModeV4L2(0) {}
    3131
    3232    InputBase(QString _name,            QString _startChanNum,
    3333              QString _tuneToChannel,   QString _externalChanger,
    34               uint    _sourceid) :
     34              uint    _sourceid,        uint    _cardid) :
    3535        name(_name),                    startChanNum(_startChanNum),
    3636        tuneToChannel(_tuneToChannel),  externalChanger(_externalChanger),
    37         sourceid(_sourceid),
     37        sourceid(_sourceid),            cardid(_cardid),
    3838        inputNumV4L(-1),
    3939        videoModeV4L1(0),               videoModeV4L2(0) {}
    4040
     
    4646    QString tuneToChannel;   // for using a cable box & S-Video/Composite
    4747    QString externalChanger; // for using a cable box...
    4848    uint    sourceid;        // associated channel listings source
     49    uint    cardid;          // input card id
    4950    int     inputNumV4L;
    5051    int     videoModeV4L1;
    5152    int     videoModeV4L2;
     
    9596        { return inputs[GetNextInputNum()]->name; }
    9697    virtual QString GetNextInputStartChan(void)
    9798        { return inputs[GetNextInputNum()]->startChanNum; }
    98     virtual QStringList GetConnectedInputs(void) const;
     99    virtual uint GetInputCardID(int inputNum) const;
    99100    virtual QString GetOrdering(void) const
    100101        { return channelorder; }
     102    virtual QStringList GetConnectedInputs(void) const;
    101103    /// \brief Returns true iff commercial detection is not required
    102104    //         on current channel, for BBC, CBC, etc.
    103105    bool IsCommercialFree(void) const { return commfree; }
  • libs/libmythtv/scanwizardhelpers.cpp

     
    218218    clearSelections();
    219219
    220220    MSqlQuery query(MSqlQuery::InitCon());
    221 
    222     QString thequery = QString(
     221    query.prepare(
    223222        "SELECT DISTINCT cardtype, videodevice, capturecard.cardid "
    224223        "FROM capturecard, videosource, cardinput "
    225         "WHERE videosource.sourceid = %1 AND "
     224        "WHERE videosource.sourceid = :SOURCEID            AND "
    226225        "      cardinput.sourceid   = videosource.sourceid AND "
    227         "      cardinput.cardid     = capturecard.cardid AND "
    228         "      capturecard.cardtype in " CARDTYPES " AND "
    229         "      capturecard.hostname = '%2';")
    230         .arg(nSourceID).arg(gContext->GetHostName());
    231     query.prepare(thequery);
     226        "      capturecard.cardtype in " CARDTYPES "       AND "
     227        "      capturecard.hostname = :HOSTNAME            AND "
     228        "      ( ( cardinput.childcardid != '0' AND "
     229        "          cardinput.childcardid  = capturecard.cardid ) OR "
     230        "        ( cardinput.childcardid  = '0' AND "
     231        "          cardinput.cardid       = capturecard.cardid ) "
     232        "      )");
     233    query.bindValue(":SOURCEID", nSourceID);
     234    query.bindValue(":HOSTNAME", gContext->GetHostName());
    232235
    233     if (query.exec() && query.isActive() && query.size() > 0)
     236    if (!query.exec() || !query.isActive())
    234237    {
    235         while (query.next())
    236             addSelection("[ " + query.value(0).toString() + " : " +
    237                          query.value(1).toString() + " ]",
    238                          query.value(2).toString());
     238        MythContext::DBError("CaptureCardSetting::refresh()", query);
     239        return;
    239240    }
     241
     242    while (query.next())
     243    {
     244        addSelection("[ " + query.value(0).toString() + " : " +
     245                     query.value(1).toString() + " ]",
     246                     query.value(2).toString());
     247    }
    240248}
    241249
    242250void CaptureCardSetting::sourceID(const QString& str)
  • libs/libmythtv/channelbase.cpp

     
    169169    return ok;
    170170}
    171171
     172uint ChannelBase::GetInputCardID(int inputNum) const
     173{
     174    InputMap::const_iterator it = inputs.find(inputNum);
     175    if (it != inputs.end())
     176        return (*it)->cardid;
     177    return 0;   
     178}
     179
    172180bool ChannelBase::ChangeExternalChannel(const QString &channum)
    173181{
    174182    InputMap::const_iterator it = inputs.find(currentInputID);
     
    387395    if (GetDevice().isEmpty())
    388396        return -1;
    389397
    390     return CardUtil::GetCardID(GetDevice());
     398    int tmpcardid = CardUtil::GetCardID(GetDevice());
     399    if (tmpcardid > 0)
     400    {
     401        uint pcardid = CardUtil::GetParentCardID(tmpcardid);
     402        tmpcardid = (pcardid) ? pcardid : tmpcardid;
     403    }
     404    return tmpcardid;
    391405}
    392406
    393407/** \fn DVBChannel::InitializeInputs(void)
     
    410424        "SELECT cardinputid, "
    411425        "       inputname,   startchan, "
    412426        "       tunechan,    externalcommand, "
    413         "       sourceid "
     427        "       sourceid,    childcardid "
    414428        "FROM cardinput "
    415429        "WHERE cardid = :CARDID");
    416430    query.bindValue(":CARDID", cardid);
     
    431445
    432446    while (query.next())
    433447    {
     448        // If there is a childcardid use it instead of cardid
     449        uint inputcardid = query.value(6).toUInt();
     450        inputcardid = (inputcardid) ? inputcardid : cardid;
     451
    434452        inputs[query.value(0).toUInt()] = new InputBase(
    435453            query.value(1).toString(), query.value(2).toString(),
    436454            query.value(3).toString(), query.value(4).toString(),
    437             query.value(5).toUInt());
     455            query.value(5).toUInt(),   inputcardid);
    438456    }
    439457
    440458    // Set initial input to first connected input
     
    446464    for (it = inputs.begin(); it != inputs.end(); ++it)
    447465    {
    448466        VERBOSE(VB_CHANNEL, LOC + QString("Input #%1: '%2' schan(%3) "
    449                                           "sourceid(%4)")
     467                                          "sourceid(%4) ccid(%5)")
    450468                .arg(it.key()).arg((*it)->name).arg((*it)->startChanNum)
    451                 .arg((*it)->sourceid));
     469                .arg((*it)->sourceid).arg((*it)->cardid));
    452470    }
    453471    VERBOSE(VB_CHANNEL, LOC + QString("Current Input #%1: '%2'")
    454472            .arg(GetCurrentInputNum()).arg(GetCurrentInput()));
  • libs/libmythtv/analogscan.cpp

     
    8181    struct CHANLIST *flist   = NULL;
    8282    uint count               = 0;
    8383
    84     QString device = CardUtil::GetVideoDevice(cardid);
     84    QString device = CardUtil::GetVideoDevice(cardid, sourceid);
    8585    QString input  = CardUtil::GetInputName(cardid, sourceid);
    8686    if (device.isEmpty() || input.isEmpty())
    8787        goto do_scan_end;
  • programs/mythfrontend/statusbox.cpp

     
    739739    MSqlQuery query(MSqlQuery::InitCon());
    740740    query.prepare(
    741741        "SELECT cardid, cardtype, videodevice "
    742         "FROM capturecard ");
     742        "FROM capturecard "
     743        "WHERE parentid='0'");
     744
    743745    if (!query.exec() || !query.isActive())
    744746    {
    745747        MythContext::DBError("StatusBox::doTunerStatus()", query);
  • programs/mythbackend/main.cpp

     
    108108        }
    109109    }
    110110
    111     query.exec("SELECT cardid,hostname FROM capturecard ORDER BY cardid;");
     111    query.exec("SELECT cardid, hostname "
     112               "FROM capturecard "
     113               "WHERE parentid = '0' "
     114               "ORDER BY cardid");
    112115
    113116    if (query.isActive() && query.size())
    114117    {