[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