vdr/eit.h
Klaus Schmidinger 8b5d404083 Version 1.1.16
- Fixed saving the polarization parameter of channels that have a number in the
  'source' parameter (thanks to Peter Seyringer for reporting this one).
- Updated 'channels.conf.terr' (thanks to Andy Carter).
- Updated 'channels.conf.cable' (thanks to Achim Lange).
- First step towards a "unique channel ID". The channel ID is a human readable
  string, made up from several parameters of the channel's definition in the file
  'channels.conf' (see man vdr(5) for details).
  In order for the "unique channel ID" to work, all channel definitions now must
  be unique with respect to the combination of their Source, Frequency and SID
  parameters. You may have to fix your 'channels.conf' manually if there are error
  messages in the log file when loading it. BE SURE TO MAKE A BACKUP COPY OF YOUR
  'channels.conf' AND 'timers.conf' FILE BEFORE SWITCHING TO THIS VERSION, AND CHECK
  VERY CAREFULLY WHETHER YOUR TIMERS ARE STILL SET TO THE RIGHT CHANNELS!
  When reading an existing 'timers.conf', the channels will be identified as before
  by their numbers. As soon as this file is written back, the channel numbers will
  be replaced by the channel IDs. After that it is possible to manually edit the
  'channels.conf' file and rearrange the channels without breaking the timers.
  Note that you can still define new timers manually by using the channel number.
  VDR will correctly identify the 'channel' parameter in a timer definition and
  use it as a channel number or a channel ID, respectively. Also, the SVDRP commands
  that return timer definitions will list them with channel numbers in order to
  stay compatible with existing applications.
  The channel ID is also used in the 'epg.data' file to allow EPG information from
  different sources to be stored, which would previously have been mixed up in case
  they were using the same 'service ID'. Note that the contents of an existing
  'epg.data' file from a previous version will be silently ignored, since it doesn't
  contain the new channel IDs. When inserting EPG data into VDR via SVDRP you now also
  need to use the channel IDs.
  Currently the EPG data received from the DVB data stream only uses the 'Source'
  and 'Service ID' part of the channel ID. This makes it work for channels with
  the same service IDs on different sources (like satellites, cable or terrestrial).
  However, it doesn't work yet if the service IDs are not unique within a specific
  source. This will be fixed later.
- Added missing SID parameters to 'channels.conf'. Some channels have been removed
  since they are apparently no longer broadcasted.
- Removed dropping EPG events from "other" streams that have a duration of 86400
  seconds or more (was introduced in version 1.1.10). This has become obsolete by
  the modification in version 1.1.13, which fixed fetching the current/next information
  to handle cases where the duration of an event is set wrongly and would last beyond
  the start time of the next event. Besides, the change in 1.1.10 broke handling EPG
  data for NVOD channels.
- Fixed a compiler warning regarding cMenuChannels::Del() and MenuTimers::Del() hiding
  the base class virtual functions.
2002-11-10 18:00:00 +01:00

170 lines
6.1 KiB
C++

/***************************************************************************
eit.h - description
-------------------
begin : Fri Aug 25 2000
copyright : (C) 2000 by Robert Schneider
email : Robert.Schneider@web.de
2001-08-15: Adapted to 'libdtv' by Rolf Hakenes <hakenes@hippomi.de>
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* $Id: eit.h 1.21 2002/11/10 12:58:27 kls Exp $
***************************************************************************/
#ifndef __EIT_H
#define __EIT_H
#include "thread.h"
#include "tools.h"
#define MAXEPGBUGFIXLEVEL 2
class cEventInfo : public cListObject {
friend class cSchedule;
friend class cEIT;
private:
unsigned char uTableID; // Table ID this event came from
uint64 uChannelID; // Channel ID of program for that event
bool bIsFollowing; // true if this is the next event on this channel
bool bIsPresent; // true if this is the present event running
char *pExtendedDescription; // Extended description of this event
char *pSubtitle; // Subtitle of event
char *pTitle; // Title of event
unsigned short uEventID; // Event ID of this event
long lDuration; // duration of event in seconds
time_t tTime; // Start time
int nChannelNumber; // the actual channel number from VDR's channel list (used in cMenuSchedule for sorting by channel number)
protected:
void SetTableID(unsigned char tableid);
void SetFollowing(bool foll);
void SetPresent(bool pres);
void SetTitle(const char *string);
void SetChannelID(uint64 channelid);
void SetEventID(unsigned short evid);
void SetDuration(long l);
void SetTime(time_t t);
void SetExtendedDescription(const char *string);
void SetSubtitle(const char *string);
cEventInfo(uint64 channelid, unsigned short eventid);
public:
~cEventInfo();
const unsigned char GetTableID(void) const;
const char *GetTimeString(void) const;
const char *GetEndTimeString(void) const;
const char *GetDate(void) const;
bool IsFollowing(void) const;
bool IsPresent(void) const;
const char *GetExtendedDescription(void) const;
const char *GetSubtitle(void) const;
const char *GetTitle(void) const;
unsigned short GetEventID(void) const;
long GetDuration(void) const;
time_t GetTime(void) const;
uint64 GetChannelID(void) const;
int GetChannelNumber(void) const { return nChannelNumber; }
void SetChannelNumber(int ChannelNumber) const { ((cEventInfo *)this)->nChannelNumber = ChannelNumber; } // doesn't modify the EIT data, so it's ok to make it 'const'
void Dump(FILE *f, const char *Prefix = "") const;
static bool Read(FILE *f, cSchedule *Schedule);
void FixEpgBugs(void);
};
class cSchedule : public cListObject {
friend class cSchedules;
friend class cEIT;
private:
cEventInfo *pPresent;
cEventInfo *pFollowing;
uint64 uChannelID;
cList<cEventInfo> Events;
protected:
void SetChannelID(uint64 channelid);
bool SetFollowingEvent(cEventInfo *pEvent);
bool SetPresentEvent(cEventInfo *pEvent);
void Cleanup(time_t tTime);
void Cleanup(void);
cSchedule(uint64 channelid = 0);
public:
~cSchedule();
cEventInfo *AddEvent(cEventInfo *EventInfo);
const cEventInfo *GetPresentEvent(void) const;
const cEventInfo *GetFollowingEvent(void) const;
uint64 GetChannelID(void) const;
const cEventInfo *GetEvent(unsigned short uEventID, time_t tTime = 0) const;
const cEventInfo *GetEventAround(time_t tTime) const;
const cEventInfo *GetEventNumber(int n) const { return Events.Get(n); }
int NumEvents(void) const { return Events.Count(); }
void Dump(FILE *f, const char *Prefix = "") const;
static bool Read(FILE *f, cSchedules *Schedules);
};
class cSchedules : public cList<cSchedule> {
friend class cSchedule;
friend class cSIProcessor;
private:
const cSchedule *pCurrentSchedule;
uint64 uCurrentChannelID;
protected:
const cSchedule *AddChannelID(uint64 channelid);
const cSchedule *SetCurrentChannelID(uint64 channelid);
void Cleanup();
public:
cSchedules(void);
~cSchedules();
const cSchedule *GetSchedule(uint64 channelid) const;
const cSchedule *GetSchedule(void) const;
void Dump(FILE *f, const char *Prefix = "") const;
static bool Read(FILE *f);
};
typedef struct sip_filter {
u_char pid;
u_char tid;
int handle;
bool inuse;
}SIP_FILTER;
class cSIProcessor : public cThread {
private:
static int numSIProcessors;
static cSchedules *schedules;
static cMutex schedulesMutex;
static const char *epgDataFileName;
static time_t lastDump;
bool masterSIProcessor;
int currentSource;
int currentTransponder;
SIP_FILTER *filters;
char *fileName;
bool active;
void Action(void);
bool AddFilter(u_char pid, u_char tid);
bool ShutDownFilters(void);
public:
cSIProcessor(const char *FileName);
~cSIProcessor();
static void SetEpgDataFileName(const char *FileName);
static const char *GetEpgDataFileName(void);
static const cSchedules *Schedules(cMutexLock &MutexLock);
// Caller must provide a cMutexLock which has to survive the entire
// time the returned cSchedules is accessed. Once the cSchedules is no
// longer used, the cMutexLock must be destroyed.
static bool Read(FILE *f = NULL);
static void Clear(void);
void SetStatus(bool On);
void SetCurrentTransponder(int CurrentSource, int CurrentTransponder);
static bool SetCurrentChannelID(uint64 channelid);
static void TriggerDump(void);
};
#endif