diff --git a/mythtv/libs/libmyth/remoteutil.cpp b/mythtv/libs/libmyth/remoteutil.cpp index a326c5ec855..ca376301c51 100644 --- a/mythtv/libs/libmyth/remoteutil.cpp +++ b/mythtv/libs/libmyth/remoteutil.cpp @@ -208,22 +208,6 @@ vector *RemoteGetConflictList(const ProgramInfo *pginfo) return retlist; } -vector RemoteRequestFreeRecorderList(void) -{ - vector list; - - QStringList strlist("GET_FREE_RECORDER_LIST"); - - if (!gCoreContext->SendReceiveStringList(strlist, true)) - return list; - - QStringList::const_iterator it = strlist.begin(); - for (; it != strlist.end(); ++it) - list.push_back((*it).toUInt()); - - return list; -} - QDateTime RemoteGetPreviewLastModified(const ProgramInfo *pginfo) { QDateTime retdatetime; diff --git a/mythtv/libs/libmyth/remoteutil.h b/mythtv/libs/libmyth/remoteutil.h index affd4ece1d0..7acff6a4988 100644 --- a/mythtv/libs/libmyth/remoteutil.h +++ b/mythtv/libs/libmyth/remoteutil.h @@ -31,7 +31,6 @@ void RemoteGetAllExpiringRecordings(vector &expiringlist); MPUBLIC uint RemoteGetRecordingList(vector &reclist, QStringList &strList); MPUBLIC vector *RemoteGetConflictList(const ProgramInfo *pginfo); -MPUBLIC vector RemoteRequestFreeRecorderList(void); MPUBLIC QDateTime RemoteGetPreviewLastModified(const ProgramInfo *pginfo); MPUBLIC QDateTime RemoteGetPreviewIfModified( const ProgramInfo &pginfo, const QString &cachefile); diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp index ee164567a99..295fa1c931b 100644 --- a/mythtv/libs/libmythtv/tv_play.cpp +++ b/mythtv/libs/libmythtv/tv_play.cpp @@ -2174,7 +2174,9 @@ void TV::HandleStateChange(PlayerContext *mctx, PlayerContext *ctx) if (reclist.size()) { RemoteEncoder *testrec = NULL; - testrec = RemoteRequestFreeRecorderFromList(reclist); + vector excluded_cardids; + testrec = RemoteRequestFreeRecorderFromList(reclist, + excluded_cardids); if (testrec && testrec->IsValidRecorder()) { ctx->SetRecorder(testrec); @@ -6410,13 +6412,11 @@ void TV::DoSkipCommercials(PlayerContext *ctx, int direction) void TV::SwitchSource(PlayerContext *ctx, uint source_direction) { QMap sources; - vector cardids = RemoteRequestFreeRecorderList(); uint cardid = ctx->GetCardID(); - cardids.push_back(cardid); - stable_sort(cardids.begin(), cardids.end()); - vector excluded_cardids; excluded_cardids.push_back(cardid); + vector cardids = RemoteRequestFreeRecorderList(excluded_cardids); + stable_sort(cardids.begin(), cardids.end()); InfoMap info; ctx->recorder->GetChannelInfo(info); @@ -6535,7 +6535,11 @@ void TV::SwitchCards(PlayerContext *ctx, } if (!reclist.empty()) - testrec = RemoteRequestFreeRecorderFromList(reclist); + { + vector excluded_cardids; + excluded_cardids.push_back(ctx->GetCardID()); + testrec = RemoteRequestFreeRecorderFromList(reclist, excluded_cardids); + } if (testrec && testrec->IsValidRecorder()) { @@ -7172,7 +7176,9 @@ void TV::ChangeChannel(PlayerContext *ctx, uint chanid, const QString &chan) if (reclist.size()) { RemoteEncoder *testrec = NULL; - testrec = RemoteRequestFreeRecorderFromList(reclist); + vector excluded_cardids; + excluded_cardids.push_back(ctx->GetCardID()); + testrec = RemoteRequestFreeRecorderFromList(reclist, excluded_cardids); if (!testrec || !testrec->IsValidRecorder()) { ClearInputQueues(ctx, true); @@ -7883,7 +7889,7 @@ QSet TV::IsTunableOn( excluded_cards.push_back(ctx->GetCardID()); uint sourceid = ChannelUtil::GetSourceIDForChannel(chanid); - vector connected = RemoteRequestFreeRecorderList(); + vector connected = RemoteRequestFreeRecorderList(excluded_cards); vector interesting = CardUtil::GetCardIDs(sourceid); // filter disconnected cards diff --git a/mythtv/libs/libmythtv/tvremoteutil.cpp b/mythtv/libs/libmythtv/tvremoteutil.cpp index d348d645740..81a1842ce97 100644 --- a/mythtv/libs/libmythtv/tvremoteutil.cpp +++ b/mythtv/libs/libmythtv/tvremoteutil.cpp @@ -147,9 +147,46 @@ RemoteEncoder *RemoteRequestNextFreeRecorder(int curr) /** * Given a list of recorder numbers, return the first available. */ -RemoteEncoder *RemoteRequestFreeRecorderFromList( - const QStringList &qualifiedRecorders) +vector RemoteRequestFreeRecorderList(const vector &excluded_cardids) { +#if 0 + vector list; + + QStringList strlist("GET_FREE_RECORDER_LIST"); + + if (!gCoreContext->SendReceiveStringList(strlist, true)) + return list; + + QStringList::const_iterator it = strlist.begin(); + for (; it != strlist.end(); ++it) + list.push_back((*it).toUInt()); + + return list; +#endif + QVector result; + vector cards = CardUtil::GetCardList(); + for (uint i = 0; i < cards.size(); i++) + { + vector inputs = + RemoteRequestFreeInputList(cards[i], excluded_cardids); + for (uint j = 0; j < inputs.size(); j++) + { + if (!result.contains(inputs[j].cardid)) + result.push_back(inputs[j].cardid); + } + } + QString msg("RemoteRequestFreeRecorderList returned {"); + for (int k = 0; k < result.size(); k++) + msg += QString(" %1").arg(result[k]); + msg += "}"; + LOG(VB_CHANNEL, LOG_INFO, msg); + return result.toStdVector(); +} + +RemoteEncoder *RemoteRequestFreeRecorderFromList +(const QStringList &qualifiedRecorders, const vector &excluded_cardids) +{ +#if 0 QStringList strlist( "GET_FREE_RECORDER_LIST" ); if (!gCoreContext->SendReceiveStringList(strlist, true)) @@ -169,6 +206,18 @@ RemoteEncoder *RemoteRequestFreeRecorderFromList( } // didn't find anything. just return NULL. return NULL; +#endif + vector freeRecorders = + RemoteRequestFreeRecorderList(excluded_cardids); + for (QStringList::const_iterator recIter = qualifiedRecorders.begin(); + recIter != qualifiedRecorders.end(); ++recIter) + { + if (find(freeRecorders.begin(), + freeRecorders.end(), + (*recIter).toUInt()) != freeRecorders.end()) + return RemoteGetExistingRecorder((*recIter).toInt()); + } + return NULL; } RemoteEncoder *RemoteRequestRecorder(void) diff --git a/mythtv/libs/libmythtv/tvremoteutil.h b/mythtv/libs/libmythtv/tvremoteutil.h index b982e559498..1a4af1132ab 100644 --- a/mythtv/libs/libmythtv/tvremoteutil.h +++ b/mythtv/libs/libmythtv/tvremoteutil.h @@ -37,11 +37,12 @@ MTV_PUBLIC void RemoteStopRecording(const ProgramInfo *pginfo); MTV_PUBLIC void RemoteCancelNextRecording(uint cardid, bool cancel); MTV_PUBLIC RemoteEncoder *RemoteRequestRecorder(void); MTV_PUBLIC RemoteEncoder *RemoteRequestNextFreeRecorder(int curr); -MTV_PUBLIC -RemoteEncoder *RemoteRequestFreeRecorderFromList( - const QStringList &qualifiedRecorders); +MTV_PUBLIC RemoteEncoder *RemoteRequestFreeRecorderFromList +(const QStringList &qualifiedRecorders, const vector &excluded_cardids); MTV_PUBLIC RemoteEncoder *RemoteGetExistingRecorder(const ProgramInfo *pginfo); MTV_PUBLIC RemoteEncoder *RemoteGetExistingRecorder(int recordernum); +MTV_PUBLIC vector +RemoteRequestFreeRecorderList(const vector &excluded_cardids); MTV_PUBLIC vector RemoteRequestFreeInputList( uint cardid, const vector &excluded_cardids); MTV_PUBLIC InputInfo RemoteRequestBusyInputID(uint cardid);