[mythtv] [PATCH] Cycle between different recorders(cards) in LiveTV

mian mythtv at mian.net.au
Sun Feb 1 23:23:51 EST 2004


This patch adds a Y (TOGGLERECORDERS) key to LiveTV allowing you to cycle
through different recorders (cards) on the backend.  This is required for
some people who may have different networks providing different channels,
eg: digital free to air on one card and pay tv via a receiver through v4l.
 It currently does NOT switch cards when using the tv guide.  It shouldn't
interfere with any of the recording processes as it only deals with free
recorders but i'm new to the myth source so let me know if something is
done wrong.

--
mian
-------------- next part --------------
--- work/mythtv/programs/mythbackend/mainserver.h	2004-02-02 12:28:05.765867432 +1030
+++ work-togglerecorders/mythtv/programs/mythbackend/mainserver.h	2004-02-02 14:15:57.489015968 +1030
@@ -66,6 +66,7 @@
     void HandleGetScheduledRecordings(PlaybackSock *pbs);
     void HandleGetConflictingRecordings(QStringList &slist, QString purge, 
                                         PlaybackSock *pbs);
+    void HandleGetNextFreeRecorder(QStringList &slist, PlaybackSock *pbs);
     void HandleGetFreeRecorder(PlaybackSock *pbs);
     void HandleRecorderQuery(QStringList &slist, QStringList &commands,
                              PlaybackSock *pbs);
--- work/mythtv/programs/mythbackend/mainserver.cpp	2004-02-02 12:28:05.762867888 +1030
+++ work-togglerecorders/mythtv/programs/mythbackend/mainserver.cpp	2004-02-02 14:42:41.371188816 +1030
@@ -280,6 +280,10 @@
     {
         HandleGetFreeRecorder(pbs);
     }
+    else if (command == "GET_NEXT_FREE_RECORDER")
+    {
+        HandleGetNextFreeRecorder(listline, pbs);
+    }
     else if (command == "QUERY_RECORDER")
     {
         if (tokens.size() != 2)
@@ -1518,6 +1522,96 @@
     SendResponse(pbssock, strlist);
 }
 
+void MainServer::HandleGetNextFreeRecorder(QStringList &slist, PlaybackSock *pbs)
+{
+    QSocket *pbssock = pbs->getSocket();
+    QString pbshost = pbs->getHostname();
+
+    QStringList strlist;
+    int retval = -1;
+    int currrec = slist[1].toInt();
+
+    EncoderLink *encoder = NULL;
+    QString enchost;
+
+    VERBOSE(VB_ALL, QString("Getting next free recorder : %1").arg(currrec));
+
+    // find current recorder
+    QMap<int, EncoderLink *>::Iterator iter, curr = encoderList->find(currrec);
+    if (curr != encoderList->end())
+    {
+        // cycle through all recorders
+        for (iter = curr;;)
+        {
+            EncoderLink *elink;
+
+            // last item? go back
+            if (++iter == encoderList->end())
+            {
+                iter = encoderList->begin();
+            }
+
+            elink = iter.data();
+
+            if (elink->isLocal())
+                enchost = gContext->GetHostName();
+            else
+                enchost = elink->getHostname();
+
+            if ((enchost == pbshost) &&
+                (elink->isConnected()) &&
+                (!elink->IsBusy()) &&
+                (!elink->isTunerLocked()))
+            {
+                encoder = elink;
+                retval = iter.key(); 
+                break;
+            }
+            if ((retval == -1) &&
+                (elink->isConnected()) &&
+                (!elink->IsBusy()) &&
+                (!elink->isTunerLocked()))
+            {
+                encoder = elink;
+                retval = iter.key();
+            }
+
+            // cycled right through? no more available recorders
+            if (iter == curr) break;
+        }
+    } else {
+        HandleGetFreeRecorder(pbs);
+        return;
+    }
+
+
+    strlist << QString::number(retval);
+        
+    if (encoder)
+    {
+        if (encoder->isLocal())
+        {
+            strlist << gContext->GetSetting("BackendServerIP");
+            strlist << gContext->GetSetting("BackendServerPort");
+        }
+        else
+        {
+            strlist << gContext->GetSettingOnHost("BackendServerIP", 
+                                                  encoder->getHostname(),
+                                                  "nohostname");
+            strlist << gContext->GetSettingOnHost("BackendServerPort", 
+                                                  encoder->getHostname(), "-1");
+        }
+    }
+    else
+    {
+        strlist << "nohost";
+        strlist << "-1";
+    }
+
+    SendResponse(pbssock, strlist);
+}
+
 void MainServer::HandleRecorderQuery(QStringList &slist, QStringList &commands,
                                      PlaybackSock *pbs)
 {
--- work/mythtv/programs/mythfrontend/main.cpp	2004-02-02 12:28:05.937841288 +1030
+++ work-togglerecorders/mythtv/programs/mythfrontend/main.cpp	2004-02-02 14:33:30.410947504 +1030
@@ -261,7 +261,7 @@
             qApp->lock();
         }
 
-        if (tv->WantsToQuit())
+        if (tv->WantsToQuit() && !tv->IsTogglingCards())
             quitAll = true;
         else
         {
--- work/mythtv/libs/libmythtv/tv_play.h	2004-02-02 12:28:05.303937656 +1030
+++ work-togglerecorders/mythtv/libs/libmythtv/tv_play.h	2004-02-02 14:34:03.862862040 +1030
@@ -54,6 +54,7 @@
     bool IsPlaying(void) { return StateIsPlaying(GetState()); }
     bool IsRecording(void) { return StateIsRecording(GetState()); }
     bool IsMenuRunning(void) { return menurunning; }
+    bool IsTogglingCards(void) { return toggleCards; }
 
     void GetNextProgram(RemoteEncoder *enc, int direction,
                         QMap<QString, QString> &infoMap);
@@ -127,6 +128,7 @@
     void ChannelCommit(void);
 
     void ToggleInputs(void); 
+    void ToggleCards(void);
 
     void DoInfo(void);
     void DoPause(void);
@@ -188,6 +190,7 @@
 
     TVState internalState;
 
+    bool toggleCards;
     bool runMainLoop;
     bool exitPlayer;
     bool paused;
--- work/mythtv/libs/libmythtv/tv_play.cpp	2004-02-02 12:28:05.300938112 +1030
+++ work-togglerecorders/mythtv/libs/libmythtv/tv_play.cpp	2004-02-02 14:25:56.684924344 +1030
@@ -91,6 +91,7 @@
     REG_KEY("TV Playback", "RWNDSTICKY", "Rewind (Sticky) or Rewind one frame "
             "while paused", ",,<");
     REG_KEY("TV Playback", "TOGGLEINPUTS", "Toggle Inputs", "C");
+    REG_KEY("TV Playback", "TOGGLECARDS", "Toggle Cards", "Y");
     REG_KEY("TV Playback", "SKIPCOMMERCIAL", "Skip Commercial", "Z,End");
     REG_KEY("TV Playback", "SKIPCOMMBACK", "Skip Commercial (Reverse)",
             "Q,Home");
@@ -147,6 +148,7 @@
 {
     m_db = db;
 
+    toggleCards = false;
     dialogname = "";
     playbackinfo = NULL;
     editmode = false;
@@ -291,7 +293,7 @@
 {
     if (internalState == kState_None)
     {
-        RemoteEncoder *testrec = RemoteRequestRecorder();
+        RemoteEncoder *testrec = RemoteRequestNextFreeRecorder(lastRecorderNum);
 
         if (!testrec)
             return 0;
@@ -322,6 +324,7 @@
         lastRecorderNum = recorder->GetRecorderNumber();
         nextState = kState_WatchingLiveTV;
         changeState = true;
+        toggleCards = false;
     }
 
     return 1;
@@ -844,6 +847,7 @@
 
     ChannelClear();
 
+    toggleCards = false;
     runMainLoop = true;
     exitPlayer = false;
 
@@ -1390,6 +1394,8 @@
                 ToggleChannelFavorite();
             else if (action == "TOGGLEINPUTS")
                 ToggleInputs();
+            else if (action == "TOGGLECARDS")
+                ToggleCards();
             else if (action == "SELECT")
                 ChannelCommit();
             else if (action == "MENU")
@@ -1888,6 +1894,16 @@
         muteTimer->start(kMuteTimeout, true);
 }
 
+void TV::ToggleCards(void)
+{
+    if (internalState == kState_WatchingLiveTV)
+    {
+        toggleCards = true;
+        nextState = kState_None;
+        changeState = true;
+    }
+}
+
 void TV::ToggleInputs(void)
 {
     if (activenvp == nvp)
--- work/mythtv/libs/libmythtv/remoteutil.h	2004-02-02 12:28:05.262943888 +1030
+++ work-togglerecorders/mythtv/libs/libmythtv/remoteutil.h	2004-02-02 14:24:41.867298352 +1030
@@ -19,6 +19,7 @@
                                              bool removenonplaying);
 void RemoteSendMessage(const QString &message);
 RemoteEncoder *RemoteRequestRecorder(void);
+RemoteEncoder *RemoteRequestNextFreeRecorder(int curr);
 RemoteEncoder *RemoteGetExistingRecorder(ProgramInfo *pginfo);
 RemoteEncoder *RemoteGetExistingRecorder(int recordernum);
 void RemoteGeneratePreviewPixmap(ProgramInfo *pginfo);
--- work/mythtv/libs/libmythtv/remoteutil.cpp	2004-02-02 12:28:05.260944192 +1030
+++ work-togglerecorders/mythtv/libs/libmythtv/remoteutil.cpp	2004-02-02 14:25:27.501360920 +1030
@@ -199,6 +199,21 @@
     return retlist;
 }
 
+RemoteEncoder *RemoteRequestNextFreeRecorder(int curr)
+{
+    QStringList strlist = "GET_NEXT_FREE_RECORDER";
+    strlist << QString("%1").arg(curr);
+
+    if (!gContext->SendReceiveStringList(strlist, true))
+        return NULL;
+
+    int num = strlist[0].toInt();
+    QString hostname = strlist[1];
+    int port = strlist[2].toInt();
+
+    return new RemoteEncoder(num, hostname, port);
+}
+
 RemoteEncoder *RemoteRequestRecorder(void)
 {
     QStringList strlist = "GET_FREE_RECORDER";


More information about the mythtv-dev mailing list