Ticket #981: 981-v1.patch

File 981-v1.patch, 11.5 KB (added by danielk, 16 years ago)

Preliminary fix for cross recorder channel switching

  • libs/libmythtv/tv_play.cpp

     
    33153315    if (!chan.isEmpty() && do_smart)
    33163316    {
    33173317        // Look for channel in line-up
    3318         bool unique = false;
    3319         bool ok = activerecorder->CheckChannelPrefix(chan, unique);
     3318        QString mod = chan;
     3319        bool unique = false, other_rec = false;
     3320        bool ok = activerecorder->CheckChannelPrefix(chan, unique, other_rec);
    33203321
    3321         // If pure channel not in line-up, try adding a spacer
    3322         QString mod = chan;
    3323         for (uint i=0; (spacers[i] != NULL) && !ok; ++i)
     3322        VERBOSE(VB_IMPORTANT, "channum("<<chan<<") unique("<<unique
     3323                <<") other_rec("<<other_rec<<")");
     3324
     3325        // If channel not in line-up on this card, try adding a spacer
     3326        bool xok = false;
     3327        for (uint i=0; (spacers[i] != NULL) && !xok && !other_rec; ++i)
    33243328        {
    33253329            mod = chan.left(chan.length()-1) + spacers[i] + chan.right(1);
    3326             ok = activerecorder->CheckChannelPrefix(mod, unique);
     3330            xok = activerecorder->CheckChannelPrefix(mod, unique, other_rec);
    33273331        }
    33283332
     3333        // If channel with spacer not in line-up on this card,
     3334        // try other recorders
     3335        mod = chan;
     3336        for (uint i=0; (spacers[i] != NULL) && !xok; ++i)
     3337        {
     3338            mod = chan.left(chan.length()-1) + spacers[i] + chan.right(1);
     3339            xok = activerecorder->CheckChannelPrefix(mod, unique, other_rec);
     3340        }
     3341        if (!xok)
     3342            mod = chan;
     3343
     3344        VERBOSE(VB_IMPORTANT, "ChanNum("<<chan<<") Unique("<<unique
     3345                <<") Other_Rec("<<other_rec<<")");
     3346
    33293347        // Use valid channel if it is there, otherwise reset...
    33303348        queuedChanNum = (ok) ? mod : chan.right(1);
    33313349        do_smart &= unique;
     
    33913409            if (activenvp == nvp && GetOSD())
    33923410                GetOSD()->HideSet("channel_number");
    33933411        }
    3394         else if (GetQueuedChanID() ||
    3395                  (!channum.isEmpty() && activerecorder->CheckChannel(channum)))
     3412        else if (GetQueuedChanID() || !channum.isEmpty())
    33963413            ChangeChannel(GetQueuedChanID(), channum);
    3397         else if (!GetQueuedInput().isEmpty())
    3398             ChangeChannel(GetQueuedChanID(), GetQueuedInput());
    33993414    }
    34003415
    34013416    ClearInputQueues(true);
     
    34063421    VERBOSE(VB_PLAYBACK, LOC + QString("ChangeChannel(%1, '%2') ")
    34073422            .arg(chanid).arg(channum));
    34083423
     3424    if (!chanid && channum.isEmpty())
     3425        return;
     3426
    34093427    QStringList reclist;
    34103428    bool muted = false;
    34113429
    34123430    if (activerecorder)
    34133431    {
    3414         bool getit = false, unique = false;
     3432        bool getit = false, unique = false, other_rec = false;
    34153433        if (chanid)
    34163434            getit = activerecorder->ShouldSwitchToAnotherCard(
    34173435                QString::number(chanid));
    34183436        else
    3419             getit = !activerecorder->CheckChannelPrefix(channum, unique);
     3437            getit = !activerecorder->CheckChannelPrefix(
     3438                channum, unique, other_rec);
    34203439
    3421         if (getit)
     3440        if (getit || (unique && other_rec))
    34223441            reclist = GetValidRecorderList(chanid, channum);
    34233442    }
    34243443
  • libs/libmythtv/remoteencoder.h

     
    5050    int SetSignalMonitoringRate(int msec, bool notifyFrontend = true);
    5151    bool CheckChannel(QString channel);
    5252    bool ShouldSwitchToAnotherCard(QString channelid);
    53     bool CheckChannelPrefix(QString channel, bool &unique);
     53    bool CheckChannelPrefix(QString channel, bool &unique, bool &other_rec);
    5454    void GetNextProgram(int direction,
    5555                        QString &title, QString &subtitle, QString &desc,
    5656                        QString &category, QString &starttime, QString &endtime,
  • libs/libmythtv/remoteencoder.cpp

     
    503503    return retval;
    504504}
    505505
    506 bool RemoteEncoder::CheckChannelPrefix(QString channel, bool &unique)
     506bool RemoteEncoder::CheckChannelPrefix(
     507    QString channel, bool &unique, bool &other_rec)
    507508{
    508509    QStringList strlist = QString("QUERY_RECORDER %1").arg(recordernum);
    509510    strlist << "CHECK_CHANNEL_PREFIX";
     
    512513    SendReceiveStringList(strlist);
    513514
    514515    bool retval = strlist[0].toInt();
    515     unique = strlist[1].toInt();
     516    unique      = strlist[1].toInt();
     517    other_rec   = strlist[2].toInt();
    516518
    517519    return retval;
    518520}
  • libs/libmythtv/tv_rec.cpp

     
    19731973    return ret;
    19741974}
    19751975
    1976 /** \fn TVRec::CheckChannelPrefix(QString name, bool &unique)
     1976/** \fn TVRec::CheckChannelPrefix(QString, bool&, bool&)
    19771977 *  \brief Returns true if the numbers in prefix_num match the first digits
    19781978 *         of any channel, if it unquely identifies a channel the unique
    19791979 *         parameter is set.
     
    19891989 *  \param prefix_num Channel number prefix to check
    19901990 *  \param unique     This is set to true if prefix uniquely identifies
    19911991 *                    channel, false otherwise.
     1992 *  \param other_rec  This channel is on another recorder
    19921993 *  \return true if the prefix matches any channels.
    19931994 *
    19941995 */
    1995 bool TVRec::CheckChannelPrefix(QString name, bool &unique)
     1996bool TVRec::CheckChannelPrefix(QString name, bool &unique, bool &other_rec)
    19961997{
    19971998    if (!channel)
    19981999        return false;
    19992000
    20002001    bool ret = false;
    20012002    unique = false;
     2003    other_rec = false;
    20022004
    20032005    QString channelinput = channel->GetCurrentInput();
    20042006
     
    20072009    if (!query.isConnected())
    20082010        return true;
    20092011
    2010     QString querystr = QString(
    2011         "SELECT channel.chanid "
     2012    QString basequery = QString(
     2013        "SELECT channel.chanid, channel.channum "
    20122014        "FROM channel, capturecard, cardinput "
    20132015        "WHERE channel.channum LIKE '%1%%'               AND "
    20142016        "      channel.sourceid     = cardinput.sourceid AND "
    2015         "      cardinput.cardid     = capturecard.cardid AND "
    2016         "      capturecard.cardid   = '%2'               AND "
    2017         "      capturecard.hostname = '%3'")
    2018         .arg(name)
    2019         .arg(cardid)
    2020         .arg(gContext->GetHostName());
     2017        "      cardinput.cardid     = capturecard.cardid").arg(name);
    20212018
    2022     query.prepare(querystr);
     2019    QString cardquery = QString(" AND capturecard.cardid = '%2'").arg(cardid);
    20232020
     2021    // Check for any input on this card..
     2022    VERBOSE(VB_IMPORTANT, "QUERY: "<<basequery + cardquery);
     2023    query.prepare(basequery + cardquery);
     2024
    20242025    if (!query.exec() || !query.isActive())
    20252026    {
    20262027        MythContext::DBError("checkchannel", query);
    20272028    }
    2028     else if (query.size() > 0)
     2029    else if (query.size() && query.next())
    20292030    {
    2030         if (query.size() == 1)
     2031        unique = ((query.size() == 1) &&
     2032                  (query.value(1).toString() == name));
     2033        return true;
     2034    }
     2035    else
     2036    {
     2037        // Check any card..
     2038        VERBOSE(VB_IMPORTANT, "QUERY2: "<<basequery);
     2039        query.prepare(basequery);
     2040        if (!query.exec() || !query.isActive())
     2041            MythContext::DBError("checkchannel -- any rec", query);
     2042        else if (query.size() && query.next())
    20312043        {
    2032             unique = CheckChannel(name);
     2044            unique = ((query.size() == 1) &&
     2045                      (query.value(1).toString() == name));
     2046            VERBOSE(VB_IMPORTANT, "val(1): '"<<query.value(1).toString()
     2047                    <<"'  name: '"<<name<<"'");
     2048            other_rec = true;
     2049            return true;
    20332050        }
    2034         return true;
    20352051    }
    20362052
     2053    // No idea what this is for -- dtk 1/2006
    20372054    query.prepare("SELECT NULL FROM channel");
    20382055    query.exec();
    20392056
    20402057    if (query.size() == 0)
    20412058    {
     2059        VERBOSE(VB_IMPORTANT, "null query returned nothing");
    20422060        unique = true;
    20432061        ret = true;
    20442062    }
  • libs/libmythtv/tv_rec.h

     
    200200    int ChangeHue(bool direction);
    201201    bool CheckChannel(QString name);
    202202    bool ShouldSwitchToAnotherCard(QString chanid);
    203     bool CheckChannelPrefix(QString name, bool &unique);
     203    bool CheckChannelPrefix(QString name, bool &unique, bool &other_rec);
    204204    void GetNextProgram(int direction,
    205205                        QString &title,       QString &subtitle,
    206206                        QString &desc,        QString &category,
  • programs/mythbackend/encoderlink.h

     
    8585    int ChangeHue(bool direction);
    8686    bool CheckChannel(const QString &name);
    8787    bool ShouldSwitchToAnotherCard(const QString &channelid);
    88     bool CheckChannelPrefix(const QString &name, bool &unique);
     88    bool CheckChannelPrefix(const QString &name, bool &unique, bool &other);
    8989    void GetNextProgram(int direction,
    9090                        QString &title, QString &subtitle, QString &desc,
    9191                        QString &category, QString &starttime,
  • programs/mythbackend/mainserver.cpp

     
    25352535    }
    25362536    else if (command == "CHECK_CHANNEL_PREFIX")
    25372537    {
    2538         bool unique;
     2538        bool unique, other_rec;
    25392539        QString name = slist[2];
    2540         retlist << QString::number((int)(enc->CheckChannelPrefix(name,
    2541                                                                  unique)));
     2540        bool match = enc->CheckChannelPrefix(name, unique, other_rec);
     2541        retlist << QString::number((int)match);
    25422542        retlist << QString::number((int)unique);
     2543        retlist << QString::number((int)other_rec);
    25432544    }
    25442545    else if (command == "GET_NEXT_PROGRAM_INFO")
    25452546    {
  • programs/mythbackend/encoderlink.cpp

     
    814814    return false;
    815815}
    816816
    817 /** \fn EncoderLink::CheckChannelPrefix(const QString&,bool&)
     817/** \fn EncoderLink::CheckChannelPrefix(const QString&,bool&,bool&)
    818818 *  \brief Returns true if the numbers in prefix_num match the first digits
    819819 *         of any channel, if it unquely identifies a channel the unique
    820820 *         parameter is set.
     
    823823 *  \param prefix_num Channel number prefix to check
    824824 *  \param unique     This is set to true if prefix uniquely identifies
    825825 *                    channel, false otherwise.
     826 *  \param other_rec  This channel is on another recorder
    826827 *  \return true if the prefix matches any channels.
    827828 */
    828 bool EncoderLink::CheckChannelPrefix(const QString &prefix_num, bool &unique)
     829bool EncoderLink::CheckChannelPrefix(const QString &prefix_num,
     830                                     bool &unique, bool &other_rec)
    829831{
    830832    if (local)
    831         return tv->CheckChannelPrefix(prefix_num, unique);
     833        return tv->CheckChannelPrefix(prefix_num, unique, other_rec);
    832834
    833835    VERBOSE(VB_IMPORTANT, "Should be local only query: CheckChannelPrefix");
    834836    unique = false;