Ticket #3326: multirecmjl-v2.patch

File multirecmjl-v2.patch, 5.0 KB (added by danielk, 12 years ago)

Cleaned up version of martin's patch, I don't like this approach so it's unlikely that we'll use it but I cleaned it up when reviewing it...

  • scheduler.h

     
    102102
    103103    bool IsSameProgram(const ProgramInfo *a, const ProgramInfo *b) const;
    104104
    105     bool FindNextConflict(const RecList &cardlist,
     105    int FindNextConflict(const RecList &cardlist,
    106106                          const ProgramInfo *p, RecConstIter &iter,
    107107                          bool openEnd = false) const;
    108     const ProgramInfo *FindConflict(const QMap<int, RecList> &reclists,
    109                                     const ProgramInfo *p, bool openEnd = false) const;
     108    const ProgramInfo *FindConflict(
     109        const QMap<int, RecList> &reclists, const ProgramInfo *p,
     110        bool openEnd = false, int *preference = NULL) const;
     111
    110112    void MarkOtherShowings(ProgramInfo *p);
    111113    void MarkShowingsList(RecList &showinglist, ProgramInfo *p);
    112114    void BackupRecStatus(void);
  • scheduler.cpp

     
    278278            return a->recstartts < b->recstartts;
    279279    }
    280280
     281    if (a->title != b->title)
     282        return a->title < b->title;
     283
    281284    if (a->inputid != b->inputid)
    282285        return a->inputid < b->inputid;
    283286
     
    793796    return cache_is_same_program[X] = a->IsSameProgram(*b);
    794797}
    795798
    796 bool Scheduler::FindNextConflict(
     799int Scheduler::FindNextConflict(
    797800    const RecList     &cardlist,
    798801    const ProgramInfo *p,
    799802    RecConstIter      &j,
    800803    bool               openEnd) const
    801804{
     805    bool found_ideal = false;
    802806    bool is_conflict_dbg = false;
    803807
    804808    for ( ; j != cardlist.end(); j++)
     
    855859            GetSharedInputGroup(p->inputid, q->inputid) &&
    856860            p->GetMplexID() && (p->GetMplexID() == q->GetMplexID()))
    857861        {
     862            found_ideal = true;
    858863            continue;
    859864        }
    860865
    861866        if (is_conflict_dbg)
    862867            cout << "\n  Found conflict" << endl;
    863868
    864         return true;
     869        return -1;
    865870    }
    866871
    867872    if (is_conflict_dbg)
    868873        cout << "\n  No conflict" << endl;
    869874
    870     return false;
     875    // Actually... give multiplex/inputgroup overlaps a priority.
     876    return (found_ideal) ? 1 : 0;
    871877}
    872878
    873879const ProgramInfo *Scheduler::FindConflict(
    874880    const QMap<int, RecList> &reclists,
    875881    const ProgramInfo        *p,
    876     bool openend) const
     882    bool openend, int *preference) const
    877883{
    878884    bool is_conflict_dbg = false;
    879885
     
    888894
    889895        const RecList &cardlist = *it;
    890896        RecConstIter k = cardlist.begin();
    891         if (FindNextConflict(cardlist, p, k, openend))
    892         {
     897        int result = FindNextConflict(cardlist, p, k, openend);
     898        if (result < 0)
    893899            return *k;
    894         }
     900
     901        // The more group overlaps the better.
     902        if (preference)
     903            *preference += result;
    895904    }
    896905
    897906    return NULL;
     
    10671076
    10681077    bool openEnd = (bool)gContext->GetNumSetting("SchedOpenEnd", 0);
    10691078
     1079    int bestpreference = -1;
     1080    ProgramInfo *best_program = NULL;
     1081
    10701082    RecIter i = worklist.begin();
    10711083    while (i != worklist.end())
    10721084    {
     
    10751087            MarkOtherShowings(p);
    10761088        else if (p->recstatus == rsUnknown)
    10771089        {
    1078             const ProgramInfo *conflict = FindConflict(cardlistmap, p, openEnd);
     1090            int preference = 0;
     1091            const ProgramInfo *conflict = FindConflict(
     1092                cardlistmap, p, openEnd, &preference);
    10791093            if (!conflict)
    10801094            {
     1095                // Decide if this is the best choice,
     1096                // but don't set it stone yet.
     1097                if (preference > bestpreference)
     1098                {
     1099                    bestpreference = preference;
     1100                    best_program = p;
     1101                }
     1102            }
     1103            else
     1104            {
     1105                retrylist.push_front(p);
     1106                PrintRec(p, "  #");
     1107                PrintRec(conflict, "     !");
     1108            }
     1109        }
     1110
     1111        int lastpri = p->recpriority;
     1112        QDateTime lastrecstart = p->recstartts;
     1113        const QString &lastchanid = p->chanid;
     1114        i++;
     1115
     1116        // If we've moved on to a different program, or the end,
     1117        // save the best showing.
     1118        if (i == worklist.end() || lastrecstart != (*i)->recstartts ||
     1119            lastchanid != (*i)->chanid)
     1120        {
     1121            p = best_program;
     1122            if (bestpreference > -1)
     1123            {
    10811124                p->recstatus = rsWillRecord;
    10821125
    10831126                if (p->recstartts < schedTime.addSecs(90))
     
    10931136                MarkOtherShowings(p);
    10941137                PrintRec(p, "  +");
    10951138            }
    1096             else
    1097             {
    1098                 retrylist.push_front(p);
    1099                 PrintRec(p, "  #");
    1100                 PrintRec(conflict, "     !");
    1101             }
     1139            bestpreference = -1;
    11021140        }
    11031141
    1104         int lastpri = p->recpriority;
    1105         i++;
    11061142        if (i == worklist.end() || lastpri != (*i)->recpriority)
    11071143        {
    11081144            MoveHigherRecords();