diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2006-01-14 15:52:40 +0100 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2006-01-14 15:52:40 +0100 |
commit | cd43adac926d60203754515b0eaf0bb3ac2d1399 (patch) | |
tree | 2c3e405e5e501ff1f62b1ddbbfa9dcfe52ca99c7 | |
parent | 0ef577f43a7671484aa1f40fcfb1386e4d0feef6 (diff) | |
download | vdr-cd43adac926d60203754515b0eaf0bb3ac2d1399.tar.gz vdr-cd43adac926d60203754515b0eaf0bb3ac2d1399.tar.bz2 |
Made the "What's on now/next?" menus a lot faster by storing a pointer to each channel's schedule in the cChannel data
-rw-r--r-- | HISTORY | 2 | ||||
-rw-r--r-- | channels.c | 9 | ||||
-rw-r--r-- | channels.h | 6 | ||||
-rw-r--r-- | eit.c | 8 | ||||
-rw-r--r-- | epg.c | 18 | ||||
-rw-r--r-- | epg.h | 3 | ||||
-rw-r--r-- | menu.c | 12 | ||||
-rw-r--r-- | svdrp.c | 4 | ||||
-rw-r--r-- | timers.c | 4 |
9 files changed, 46 insertions, 20 deletions
@@ -4170,3 +4170,5 @@ Video Disk Recorder Revision History names (thanks to Stefan Huelswitt). - Added a missing '-' to the example for viewing a grabbed image on a remote host (reported by Philippe Gramoullé). +- Made the "What's on now/next?" menus a lot faster by storing a pointer to each + channel's schedule in the cChannel data. @@ -4,13 +4,14 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: channels.c 1.47 2005/12/30 15:41:24 kls Exp $ + * $Id: channels.c 1.48 2006/01/14 15:51:02 kls Exp $ */ #include "channels.h" #include <linux/dvb/frontend.h> #include <ctype.h> #include "device.h" +#include "epg.h" // IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d' // format characters in order to allow any number of blanks after a numeric @@ -174,6 +175,7 @@ cChannel::cChannel(void) guard = GUARD_INTERVAL_AUTO; hierarchy = HIERARCHY_AUTO; modification = CHANNELMOD_NONE; + schedule = NULL; linkChannels = NULL; refChannel = NULL; } @@ -184,6 +186,7 @@ cChannel::cChannel(const cChannel &Channel) shortName = NULL; provider = NULL; portalName = NULL; + schedule = NULL; linkChannels = NULL; refChannel = NULL; *this = Channel; @@ -293,6 +296,7 @@ bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarizatio srate = Srate; coderateH = CoderateH; modulation = QPSK; + schedule = NULL; } return true; } @@ -310,6 +314,7 @@ bool cChannel::SetCableTransponderData(int Source, int Frequency, int Modulation modulation = Modulation; srate = Srate; coderateH = CoderateH; + schedule = NULL; } return true; } @@ -331,6 +336,7 @@ bool cChannel::SetTerrTransponderData(int Source, int Frequency, int Bandwidth, coderateL = CoderateL; guard = Guard; transmission = Transmission; + schedule = NULL; } return true; } @@ -350,6 +356,7 @@ void cChannel::SetId(int Nid, int Tid, int Sid, int Rid) rid = Rid; if (Number()) Channels.HashChannel(this); + schedule = NULL; } } @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: channels.h 1.37 2006/01/07 13:00:43 kls Exp $ + * $Id: channels.h 1.38 2006/01/14 15:51:26 kls Exp $ */ #ifndef __CHANNELS_H @@ -103,7 +103,10 @@ public: class cLinkChannels : public cList<cLinkChannel> { }; +class cSchedule; + class cChannel : public cListObject { + friend class cSchedules; friend class cMenuEditChannel; private: static cString ToText(const cChannel *Channel); @@ -142,6 +145,7 @@ private: int hierarchy; int __EndData__; int modification; + mutable const cSchedule *schedule; cLinkChannels *linkChannels; cChannel *refChannel; cString ParametersToString(void) const; @@ -8,7 +8,7 @@ * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. * Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>. * - * $Id: eit.c 1.113 2005/12/26 11:50:09 kls Exp $ + * $Id: eit.c 1.114 2006/01/14 15:41:21 kls Exp $ */ #include "eit.h" @@ -35,11 +35,7 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data) if (!channel) return; // only collect data for known channels - cSchedule *pSchedule = (cSchedule *)Schedules->GetSchedule(channelID); - if (!pSchedule) { - pSchedule = new cSchedule(channelID); - Schedules->Add(pSchedule); - } + cSchedule *pSchedule = (cSchedule *)Schedules->GetSchedule(channel, true); bool Empty = true; bool Modified = false; @@ -7,7 +7,7 @@ * Original version (as used in VDR before 1.3.0) written by * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. * - * $Id: epg.c 1.47 2005/12/30 15:41:59 kls Exp $ + * $Id: epg.c 1.48 2006/01/14 15:46:50 kls Exp $ */ #include "epg.h" @@ -997,3 +997,19 @@ const cSchedule *cSchedules::GetSchedule(tChannelID ChannelID) const return NULL; } +const cSchedule *cSchedules::GetSchedule(const cChannel *Channel, bool AddIfMissing) const +{ + // This is not very beautiful, but it dramatically speeds up the + // "What's on now/next?" menus. + static cSchedule DummySchedule(tChannelID::InvalidID); + if (!Channel->schedule) + Channel->schedule = GetSchedule(Channel->GetChannelID()); + if (!Channel->schedule) + Channel->schedule = &DummySchedule; + if (Channel->schedule == &DummySchedule && AddIfMissing) { + cSchedule *Schedule = new cSchedule(Channel->GetChannelID()); + ((cSchedules *)this)->Add(Schedule); + Channel->schedule = Schedule; + } + return Channel->schedule != &DummySchedule? Channel->schedule : NULL; +} @@ -7,7 +7,7 @@ * Original version (as used in VDR before 1.3.0) written by * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. * - * $Id: epg.h 1.28 2005/12/27 14:31:24 kls Exp $ + * $Id: epg.h 1.29 2006/01/14 15:45:24 kls Exp $ */ #ifndef __EPG_H @@ -179,6 +179,7 @@ public: static bool Read(FILE *f = NULL); cSchedule *AddSchedule(tChannelID ChannelID); const cSchedule *GetSchedule(tChannelID ChannelID) const; + const cSchedule *GetSchedule(const cChannel *Channel, bool AddIfMissing = false) const; }; void ReportEpgBugFixStats(bool Reset = false); @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.392 2006/01/13 15:17:53 kls Exp $ + * $Id: menu.c 1.393 2006/01/14 14:53:43 kls Exp $ */ #include "menu.h" @@ -1029,7 +1029,7 @@ cMenuWhatsOn::cMenuWhatsOn(const cSchedules *Schedules, bool Now, int CurrentCha helpKeys = -1; for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) { if (!Channel->GroupSep()) { - const cSchedule *Schedule = Schedules->GetSchedule(Channel->GetChannelID()); + const cSchedule *Schedule = Schedules->GetSchedule(Channel); if (Schedule) { const cEvent *Event = Now ? Schedule->GetPresentEvent() : Schedule->GetFollowingEvent(); if (Event) @@ -1202,7 +1202,7 @@ void cMenuSchedule::PrepareSchedule(cChannel *Channel) SetTitle(buffer); free(buffer); if (schedules) { - const cSchedule *Schedule = schedules->GetSchedule(Channel->GetChannelID()); + const cSchedule *Schedule = schedules->GetSchedule(Channel); if (Schedule) { const cEvent *PresentEvent = Schedule->GetPresentEvent(Channel->Number() == cDevice::CurrentChannel()); time_t now = time(NULL) - Setup.EPGLinger * 60; @@ -2833,7 +2833,7 @@ static void SetTrackDescriptions(bool Live) if (Channel) { const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock); if (Schedules) { - const cSchedule *Schedule = Schedules->GetSchedule(Channel->GetChannelID()); + const cSchedule *Schedule = Schedules->GetSchedule(Channel); if (Schedule) { const cEvent *Present = Schedule->GetPresentEvent(true); if (Present) @@ -2916,7 +2916,7 @@ void cDisplayChannel::DisplayInfo(void) cSchedulesLock SchedulesLock; const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock); if (Schedules) { - const cSchedule *Schedule = Schedules->GetSchedule(channel->GetChannelID()); + const cSchedule *Schedule = Schedules->GetSchedule(channel); if (Schedule) { const cEvent *Present = Schedule->GetPresentEvent(true); const cEvent *Following = Schedule->GetFollowingEvent(true); @@ -3346,7 +3346,7 @@ bool cRecordControl::GetEvent(void) cSchedulesLock SchedulesLock; const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock); if (Schedules) { - const cSchedule *Schedule = Schedules->GetSchedule(channel->GetChannelID()); + const cSchedule *Schedule = Schedules->GetSchedule(channel); if (Schedule) { event = Schedule->GetEventAround(Time); if (event) { @@ -10,7 +10,7 @@ * and interact with the Video Disk Recorder - or write a full featured * graphical interface that sits on top of an SVDRP connection. * - * $Id: svdrp.c 1.91 2006/01/14 11:42:52 kls Exp $ + * $Id: svdrp.c 1.92 2006/01/14 14:55:52 kls Exp $ */ #include "svdrp.h" @@ -936,7 +936,7 @@ void cSVDRP::CmdLSTE(const char *Option) else Channel = Channels.GetByChannelID(tChannelID::FromString(Option)); if (Channel) { - Schedule = Schedules->GetSchedule(Channel->GetChannelID()); + Schedule = Schedules->GetSchedule(Channel); if (!Schedule) { Reply(550, "No schedule found"); return; @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: timers.c 1.41 2006/01/08 11:40:29 kls Exp $ + * $Id: timers.c 1.42 2006/01/14 14:56:11 kls Exp $ */ #include "timers.h" @@ -596,7 +596,7 @@ void cTimers::SetEvents(void) if (Schedules) { if (!lastSetEvents || Schedules->Modified() >= lastSetEvents) { for (cTimer *ti = First(); ti; ti = Next(ti)) { - const cSchedule *Schedule = Schedules->GetSchedule(ti->Channel()->GetChannelID()); + const cSchedule *Schedule = Schedules->GetSchedule(ti->Channel()); if (Schedule) { if (!lastSetEvents || Schedule->Modified() >= lastSetEvents) { const cEvent *Event = NULL; |