On Sat, 2005-06-18 at 12:30 +0200, Torbjörn Jansson wrote:
> After updateing to latest cvs i now get the following when starting the
> backend:
> Any idea why this happends now?
> Scanning seems to have the same problem, not a single transport is able to
> tune.
> It worked just fine yesterday before i updated.

I've attached two patches that may address your problem.

The first revert-GetChannelOptions.patch will revert to the old
GetChannelOptions code, in case the new code is broken. This is
less likely to be the problem, but should compile fairly quickly
so you can test it fairly quickly.

The second revert-GetTransportOptions will revert to the old
GetTransportOptions code. This reaches uses a private member of
dvbtypes.h so due to the needed dvbtypes change it takes a bit
longer to compile.

I'd still like that debug output w/wo the new DVBChannel code, but
you don't need to make logs w/wo these patches, I have a fairly good
idea of what they do.

-- Daniel

Index: libs/libmythtv/dvbchannel.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/dvbchannel.cpp,v
retrieving revision 1.38
diff -u -r1.38 dvbchannel.cpp
--- libs/libmythtv/dvbchannel.cpp       17 Jun 2005 21:27:10 -0000      1.38
+++ libs/libmythtv/dvbchannel.cpp       18 Jun 2005 14:39:20 -0000
@@ -273,29 +273,39 @@
  */
 bool DVBChannel::GetChannelOptions(const QString& channum)
 {
-    MSqlQuery query(MSqlQuery::InitCon());
 
-    QString thequery =
-        QString("SELECT chanid, serviceid, mplexid, atscsrcid "
-                "FROM channel, cardinput, capturecard "
-                "WHERE channel.channum='%1' AND "
-                "      cardinput.sourceid = channel.sourceid AND "
-                "      capturecard.cardid = cardinput.cardid AND "
-                "      capturecard.cardtype = 'DVB' AND ").arg(channum);
+    QString         thequery;
+    QString         inputName;
+
+// TODO: pParent doesn't exist when you create a DVBChannel from videosource
+//       but this is important (i think) for remote backends
+
+    MSqlQuery query(MSqlQuery::InitCon());
 
     if (pParent == NULL)
-        thequery += QString("cardinput.videodevice = '%1'").arg(cardnum);
+        thequery = QString("SELECT chanid, serviceid, mplexid "
+                       "FROM channel,cardinput,capturecard WHERE "
+                       "channel.channum='%1' AND "
+                       "cardinput.sourceid = channel.sourceid AND "
+                       "cardinput.videodevice = '%2' AND "
+                       "capturecard.cardid = cardinput.cardid AND "
+                       "capturecard.cardtype = 'DVB'")
+                       .arg(channum).arg(cardnum);
     else
-        thequery += QString("cardinput.cardid = '%1'")
-            .arg(pParent->GetCaptureCardNum());
+        thequery = QString("SELECT chanid, serviceid, mplexid "
+                       "FROM channel,cardinput,capturecard WHERE "
+                       "channel.channum='%1' AND "
+                       "cardinput.sourceid = channel.sourceid AND "
+                       "cardinput.cardid = '%2' AND "
+                       "capturecard.cardid = cardinput.cardid AND "
+                       "capturecard.cardtype = 'DVB'")
+                       .arg(channum).arg(pParent->GetCaptureCardNum());
 
     query.prepare(thequery);
 
     if (!query.exec() || !query.isActive())
-    {
         MythContext::DBError("GetChannelOptions - ChanID", query);
-        return false;
-    }
+
     if (query.size() <= 0)
     {
         ERROR("Unable to find channel in database.");
@@ -304,14 +314,7 @@
 
     query.next();
     // TODO: Fix structs to be more useful to new DB structure
-    currentProgramNum = chan_opts.serviceID = query.value(1).toInt();
-    currentATSCMajorChannel = query.value(3).toInt() >> 8;
-    currentATSCMinorChannel = query.value(3).toInt() & 0xff;
-    // HACK for broken atscsrcid values
-    if (currentATSCMinorChannel && !currentATSCMajorChannel)
-        currentATSCMajorChannel = -1;
-
-    VERBOSE(VB_CHANNEL, "atscsrcid: "<<query.value(3).toInt());
+    chan_opts.serviceID     = query.value(1).toInt();
 
     int mplexid = query.value(2).toInt();
 
Index: libs/libmythtv/dvbchannel.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/dvbchannel.cpp,v
retrieving revision 1.38
diff -u -r1.38 dvbchannel.cpp
--- libs/libmythtv/dvbchannel.cpp       17 Jun 2005 21:27:10 -0000      1.38
+++ libs/libmythtv/dvbchannel.cpp       18 Jun 2005 14:51:05 -0000
@@ -323,6 +323,67 @@
     return true;
 }
 
+bool ParseTransportQuery(dvb_channel_t &chan_opts, dvb_frontend_info &info,
+                         MSqlQuery& query)
+{
+    chan_opts.lock.lock();
+
+    switch(info.type)
+    {
+        case FE_QPSK:
+            if (!chan_opts.tuning.parseQPSK(query.value(0).toString(), 
+                          query.value(1).toString(),
+                          query.value(2).toString(), query.value(3).toString(),
+                          query.value(4).toString(), query.value(5).toString(),
+                          query.value(6).toString(), query.value(7).toString(),
+                          query.value(8).toString(), query.value(9).toString(),
+                          query.value(10).toString()))
+            {
+                chan_opts.lock.unlock();
+                return false;
+            }
+            chan_opts.sistandard = query.value(11).toString();
+            break;
+        case FE_QAM:
+            if (!chan_opts.tuning.parseQAM(query.value(0).toString(), 
+                        query.value(1).toString(), query.value(2).toString(),
+                        query.value(3).toString(), query.value(4).toString()))
+            {
+                chan_opts.lock.unlock();
+                return false;
+            }
+            chan_opts.sistandard = query.value(5).toString();
+            break;
+        case FE_OFDM:
+            if (!chan_opts.tuning.parseOFDM(query.value(0).toString(), 
+                        query.value(1).toString(), query.value(2).toString(),
+                        query.value(3).toString(), query.value(4).toString(),
+                        query.value(5).toString(), query.value(6).toString(),
+                        query.value(7).toString(), query.value(8).toString()))
+            {
+                chan_opts.lock.unlock();
+                return false;
+            }
+            chan_opts.sistandard = query.value(9).toString();
+            break;
+#if (DVB_API_VERSION_MINOR == 1)
+        case FE_ATSC:
+            if (!chan_opts.tuning.parseATSC(query.value(0).toString(), 
+                                            query.value(1).toString()))
+            {
+                chan_opts.lock.unlock();
+                return false;
+            }
+            chan_opts.sistandard = query.value(2).toString();
+            break;
+#endif
+    }
+
+    chan_opts.lock.unlock();
+
+    return true;
+}
+
 /** \fn DVBChannel::GetTransportOptions(int mplexid)
  *  \brief Initializes chan_opts.tuning from database using mplexid.
  *
@@ -333,68 +394,93 @@
 bool DVBChannel::GetTransportOptions(int mplexid)
 {
     MSqlQuery query(MSqlQuery::InitCon());
+    QString thequery;
 
+     // TODO: See previous comment about pParent
     int capturecardnumber;
-    if (pParent)
-        capturecardnumber = pParent->GetCaptureCardNum();
-    else
-    {
-        QString thequery =
-            QString("SELECT cardid FROM capturecard "
-                    "WHERE videodevice = '%1'").arg(cardnum);
-
+    if (pParent == NULL) {
+       thequery = QString("SELECT cardid FROM capturecard "
+                          " WHERE videodevice = %1;").arg(cardnum);
        query.prepare(thequery);
        if (!query.exec() || !query.isActive() || query.size() <= 0)
        {
            ERROR(QString("Could not find capture card for transport %1")
-                 .arg(mplexid));
+                      .arg(mplexid));
            return false;
        }
        query.next();
        capturecardnumber = query.value(0).toInt();
     }
+    else
+       capturecardnumber = pParent->GetCaptureCardNum();
 
-    // Query for our DVBTuning params
-    QString thequery(
-        "SELECT frequency,         inversion,      symbolrate, "
-        "       fec,               polarity,       dvb_diseqc_type, "
-        "       diseqc_port,       diseqc_pos,     lnb_lof_switch, "
-        "       lnb_lof_hi,        lnb_lof_lo,     sistandard, "
-        "       hp_code_rate,      lp_code_rate,   constellation, "
-        "       transmission_mode, guard_interval, hierarchy, "
-        "       modulation,        bandwidth "
-        "FROM dtv_multiplex, cardinput, capturecard "
-        "WHERE dtv_multiplex.sourceid = cardinput.sourceid AND ");
-
-    thequery += QString("mplexid = '%1' AND capturecard.cardid = '%2'")
-        .arg(mplexid).arg(capturecardnumber);
+    switch(info.type)
+    {
+        case FE_QPSK:
+            thequery = QString("SELECT frequency, inversion, symbolrate, "
+                               "fec, polarity, dvb_diseqc_type, diseqc_port, "
+                               "diseqc_pos, lnb_lof_switch, lnb_lof_hi, "
+                               "lnb_lof_lo,sistandard FROM 
dtv_multiplex,cardinput,"
+                               "capturecard WHERE mplexid=%1 AND "
+                               "dtv_multiplex.sourceid = cardinput.sourceid "
+                               "AND capturecard.cardid=%2")
+                               .arg(mplexid)
+                               .arg(capturecardnumber);
+            break;
+        case FE_QAM:
+            thequery = QString("SELECT frequency, inversion, symbolrate, "
+                               "fec, modulation, sistandard "
+                               "FROM dtv_multiplex,cardinput,"
+                               "capturecard WHERE mplexid=%1 AND "
+                               "dtv_multiplex.sourceid = cardinput.sourceid "
+                               "AND capturecard.cardid=%2")
+                               .arg(mplexid)
+                               .arg(capturecardnumber);
+            break;
+        case FE_OFDM:
+            thequery = QString("SELECT frequency, inversion, "
+                               "bandwidth, hp_code_rate, lp_code_rate, "
+                               "constellation, transmission_mode, "
+                               "guard_interval, hierarchy, sistandard "
+                               "FROM dtv_multiplex,cardinput,"
+                               "capturecard WHERE mplexid=%1 AND "
+                               "dtv_multiplex.sourceid = cardinput.sourceid "
+                               "AND capturecard.cardid=%2")
+                               .arg(mplexid)
+                               .arg(capturecardnumber);
+            break;
+#if (DVB_API_VERSION_MINOR == 1)
+        case FE_ATSC:
+            thequery = QString("SELECT frequency, modulation, sistandard "
+                               "FROM dtv_multiplex,cardinput,"
+                               "capturecard WHERE mplexid=%1 AND "
+                               "dtv_multiplex.sourceid = cardinput.sourceid "
+                               "AND capturecard.cardid=%2")
+                               .arg(mplexid)
+                               .arg(capturecardnumber);
+            break;
+#endif
+    }
 
     query.prepare(thequery);
+
     if (!query.exec() || !query.isActive())
-    {
         MythContext::DBError("GetChannelOptions - Options", query);
-        return false;
-    }
+
     if (query.size() <= 0)
     {
        ERROR(QString("Could not find dvb tuning parameters for transport %1")
                       .arg(mplexid));
        return false;
     }
+
     query.next();
 
-    // Parse the query into our DVBTuning class
-    return chan_opts.Parse(info.type,
-        query.value(0).toString(),  query.value(1).toString(),
-        query.value(2).toString(),  query.value(3).toString(),
-        query.value(4).toString(),  query.value(5).toString(),
-        query.value(6).toString(),  query.value(7).toString(),
-        query.value(8).toString(),  query.value(9).toString(),
-        query.value(10).toString(), query.value(11).toString(),
-        query.value(12).toString(), query.value(13).toString(),
-        query.value(14).toString(), query.value(15).toString(),
-        query.value(16).toString(), query.value(17).toString(),
-        query.value(18).toString(), query.value(19).toString());
+    if (!ParseTransportQuery(chan_opts, info, query))
+    {
+        return false;
+    }
+    return true;
 }
 
 /** \fn DVBChannel::CheckOptions()
Index: libs/libmythtv/dvbtypes.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/dvbtypes.h,v
retrieving revision 1.13
diff -u -r1.13 dvbtypes.h
--- libs/libmythtv/dvbtypes.h   17 Jun 2005 17:24:33 -0000      1.13
+++ libs/libmythtv/dvbtypes.h   18 Jun 2005 14:51:05 -0000
@@ -391,7 +391,7 @@
 
     QString         sistandard;
     uint8_t         version;
-  private:
+//  private:
     mutable QMutex  lock;
 };
 
_______________________________________________
mythtv-dev mailing list
[email protected]
http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-dev

Reply via email to