commit 3a4b9c5d76cfc42ab45170a96ce4f4192a2a9758
Author: David Matthews <dm@prolingua.co.uk>
Date:   Sat Aug 13 16:02:32 2011 +0100

    Fix problem with MHEG in recordings.
    
    Now uses the sourceid rather than cardid when looking up channel
    entries.  If the look-up does not work properly BBC recordings may
    pop up periodic messages about service errors.

diff --git a/mythtv/libs/libmythtv/interactivetv.cpp b/mythtv/libs/libmythtv/interactivetv.cpp
index d7a48a8..2cdbea0 100644
--- a/mythtv/libs/libmythtv/interactivetv.cpp
+++ b/mythtv/libs/libmythtv/interactivetv.cpp
@@ -33,9 +33,9 @@ InteractiveTV::~InteractiveTV()
 }
 
 // Start or restart the MHEG engine.
-void InteractiveTV::Restart(uint chanid, uint cardid, bool isLive)
+void InteractiveTV::Restart(uint chanid, uint sourceid, bool isLive)
 {
-    m_context->Restart(chanid, cardid, isLive);
+    m_context->Restart(chanid, sourceid, isLive);
 }
 
 // Called by the video player to see if the image needs to be updated
diff --git a/mythtv/libs/libmythtv/interactivetv.h b/mythtv/libs/libmythtv/interactivetv.h
index 0739390..c8e00e6 100644
--- a/mythtv/libs/libmythtv/interactivetv.h
+++ b/mythtv/libs/libmythtv/interactivetv.h
@@ -17,7 +17,7 @@ class InteractiveTV
     InteractiveTV(MythPlayer *nvp);
     virtual ~InteractiveTV();
 
-    void Restart(uint chanid, uint cardid, bool isLive);
+    void Restart(uint chanid, uint sourceid, bool isLive);
     // Process an incoming DSMCC packet.
     void ProcessDSMCCSection(unsigned char *data, int length,
                              int componentTag, unsigned carouselId,
diff --git a/mythtv/libs/libmythtv/mhi.cpp b/mythtv/libs/libmythtv/mhi.cpp
index f4777c7..1631495 100644
--- a/mythtv/libs/libmythtv/mhi.cpp
+++ b/mythtv/libs/libmythtv/mhi.cpp
@@ -56,7 +56,7 @@ MHIContext::MHIContext(InteractiveTV *parent)
       m_updated(false),
       m_displayWidth(StdDisplayWidth), m_displayHeight(StdDisplayHeight),
       m_face_loaded(false), m_engineThread(NULL), m_currentChannel(-1),
-      m_currentStream(-1),  m_isLive(false),      m_currentCard(0),
+      m_currentStream(-1),  m_isLive(false),      m_currentSource(-1),
       m_audioTag(-1),       m_videoTag(-1),
       m_lastNbiVersion(NBI_VERSION_UNSET),
       m_videoRect(0, 0, StdDisplayWidth, StdDisplayHeight),
@@ -156,14 +156,14 @@ void MHIContext::StopEngine(void)
 
 
 // Start or restart the MHEG engine.
-void MHIContext::Restart(uint chanid, uint cardid, bool isLive)
+void MHIContext::Restart(uint chanid, uint sourceid, bool isLive)
 {
     int tuneinfo = m_tuneinfo.isEmpty() ? 0 : m_tuneinfo.takeFirst();
 
-    LOG(VB_MHEG, LOG_INFO, QString("[mhi] Restart ch=%1 card=%2 live=%3 tuneinfo=0x%4")
-        .arg((int)chanid).arg((int)cardid).arg(isLive).arg(tuneinfo,0,16));
+    LOG(VB_MHEG, LOG_INFO, QString("[mhi] Restart ch=%1 source=%2 live=%3 tuneinfo=0x%4")
+        .arg((int)chanid).arg((int)sourceid).arg(isLive).arg(tuneinfo,0,16));
 
-    m_currentCard = cardid;
+    m_currentSource = sourceid;
     m_currentStream = (chanid) ? (int)chanid : -1;
     if (!(tuneinfo & kTuneKeepChnl))
         m_currentChannel = m_currentStream;
@@ -650,18 +650,16 @@ int MHIContext::GetChannelIndex(const QString &str)
         int serviceID = list[2].toInt(&ok, 16);
         if (!ok)
             break;
-        // We only return channels that match the current capture card.
+        // We only return channels that match the current capture source.
         if (list[1].isEmpty()) // TransportID is not specified
         {
             query.prepare(
                 "SELECT chanid "
-                "FROM channel, dtv_multiplex, cardinput, capturecard "
+                "FROM channel, dtv_multiplex "
                 "WHERE networkid        = :NETID AND"
                 "      channel.mplexid  = dtv_multiplex.mplexid AND "
                 "      serviceid        = :SERVICEID AND "
-                "      channel.sourceid = cardinput.sourceid AND "
-                "      cardinput.cardid = capturecard.cardid AND "
-                "      cardinput.cardid = :CARDID");
+                "      channel.sourceid = :SOURCEID");
         }
         else
         {
@@ -670,19 +668,17 @@ int MHIContext::GetChannelIndex(const QString &str)
                 break;
             query.prepare(
                 "SELECT chanid "
-                "FROM channel, dtv_multiplex, cardinput, capturecard "
+                "FROM channel, dtv_multiplex "
                 "WHERE networkid        = :NETID AND"
                 "      channel.mplexid  = dtv_multiplex.mplexid AND "
                 "      serviceid        = :SERVICEID AND "
                 "      transportid      = :TRANSID AND "
-                "      channel.sourceid = cardinput.sourceid AND "
-                "      cardinput.cardid = capturecard.cardid AND "
-                "      cardinput.cardid = :CARDID");
+                "      channel.sourceid = :SOURCEID");
             query.bindValue(":TRANSID", transportID);
         }
         query.bindValue(":NETID", netID);
         query.bindValue(":SERVICEID", serviceID);
-        query.bindValue(":CARDID", m_currentCard);
+        query.bindValue(":SOURCEID", m_currentSource);
         if (query.exec() && query.isActive() && query.next())
             nResult = query.value(0).toInt();
     }
@@ -695,13 +691,11 @@ int MHIContext::GetChannelIndex(const QString &str)
             break;
         MSqlQuery query(MSqlQuery::InitCon());
         query.prepare("SELECT chanid "
-                      "FROM channel, cardinput, capturecard "
+                      "FROM channel "
                       "WHERE channum = :CHAN AND "
-                      "      channel.sourceid = cardinput.sourceid AND "
-                      "      cardinput.cardid = capturecard.cardid AND "
-                      "      cardinput.cardid = :CARDID");
+                      "      channel.sourceid = :SOURCEID");
         query.bindValue(":CHAN", channelNo);
-        query.bindValue(":CARDID", m_currentCard);
+        query.bindValue(":SOURCEID", m_currentSource);
         if (query.exec() && query.isActive() && query.next())
             nResult = query.value(0).toInt();
     }
diff --git a/mythtv/libs/libmythtv/mhi.h b/mythtv/libs/libmythtv/mhi.h
index 0071c4c..2b10c8b 100644
--- a/mythtv/libs/libmythtv/mhi.h
+++ b/mythtv/libs/libmythtv/mhi.h
@@ -50,7 +50,7 @@ class MHIContext : public MHContext, public QRunnable
     // A NetworkBootInfo sub-descriptor is present in the PMT.
     void SetNetBootInfo(const unsigned char *data, uint length);
     /// Restart the MHEG engine.
-    void Restart(uint chanid, uint cardid, bool isLive);
+    void Restart(uint chanid, uint sourceid, bool isLive);
     // Offer a key press.  Returns true if it accepts it.
     // This will depend on the current profile.
     bool OfferKey(QString key);
@@ -176,7 +176,7 @@ class MHIContext : public MHContext, public QRunnable
     int              m_currentChannel;
     int              m_currentStream;
     bool             m_isLive;
-    int              m_currentCard;
+    int              m_currentSource;
 
     int              m_audioTag;
     int              m_videoTag;
diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
index 623a6a8..7ab94da 100644
--- a/mythtv/libs/libmythtv/tv_play.cpp
+++ b/mythtv/libs/libmythtv/tv_play.cpp
@@ -11326,22 +11326,23 @@ void TV::UnpauseLiveTV(PlayerContext *ctx, bool bQuietly /*=false*/)
  */
 void TV::ITVRestart(PlayerContext *ctx, bool isLive)
 {
-    uint chanid = 0;
-    uint cardid = 0;
+    uint chanid = -1;
+    uint sourceid = -1;
 
     if (ContextIsPaused(ctx, __FILE__, __LINE__))
         return;
 
     ctx->LockPlayingInfo(__FILE__, __LINE__);
     if (ctx->playingInfo)
+    {
         chanid = ctx->playingInfo->GetChanID();
+        sourceid = ChannelUtil::GetSourceIDForChannel(chanid);
+    }
     ctx->UnlockPlayingInfo(__FILE__, __LINE__);
 
-    cardid = ctx->GetCardID();
-
     ctx->LockDeletePlayer(__FILE__, __LINE__);
     if (ctx->player)
-        ctx->player->ITVRestart(chanid, cardid, isLive);
+        ctx->player->ITVRestart(chanid, sourceid, isLive);
     ctx->UnlockDeletePlayer(__FILE__, __LINE__);
 }
 
