vdr  2.2.0
channels.h
Go to the documentation of this file.
1 /*
2  * channels.h: Channel handling
3  *
4  * See the main source file 'vdr.c' for copyright information and
5  * how to reach the author.
6  *
7  * $Id: channels.h 3.3 2015/02/01 13:30:26 kls Exp $
8  */
9 
10 #ifndef __CHANNELS_H
11 #define __CHANNELS_H
12 
13 #include "config.h"
14 #include "sources.h"
15 #include "thread.h"
16 #include "tools.h"
17 
18 #define ISTRANSPONDER(f1, f2) (abs((f1) - (f2)) < 4) //XXX
19 
20 #define CHANNELMOD_NONE 0x00
21 #define CHANNELMOD_ALL 0xFF
22 #define CHANNELMOD_NAME 0x01
23 #define CHANNELMOD_PIDS 0x02
24 #define CHANNELMOD_ID 0x04
25 #define CHANNELMOD_AUX 0x08
26 #define CHANNELMOD_CA 0x10
27 #define CHANNELMOD_TRANSP 0x20
28 #define CHANNELMOD_LANGS 0x40
29 #define CHANNELMOD_RETUNE (CHANNELMOD_PIDS | CHANNELMOD_CA | CHANNELMOD_TRANSP)
30 
31 #define CHANNELSMOD_NONE 0
32 #define CHANNELSMOD_AUTO 1
33 #define CHANNELSMOD_USER 2
34 
35 #define MAXAPIDS 32 // audio
36 #define MAXDPIDS 16 // dolby (AC3 + DTS)
37 #define MAXSPIDS 32 // subtitles
38 #define MAXCAIDS 12 // conditional access
39 #define MAXTXTPAGES 8 // teletext pages
40 
41 #define MAXLANGCODE1 4 // a 3 letter language code, zero terminated
42 #define MAXLANGCODE2 8 // up to two 3 letter language codes, separated by '+' and zero terminated
43 
44 #define CA_FTA 0x0000
45 #define CA_DVB_MIN 0x0001
46 #define CA_DVB_MAX 0x000F
47 #define CA_USER_MIN 0x0010
48 #define CA_USER_MAX 0x00FF
49 #define CA_ENCRYPTED_MIN 0x0100
50 #define CA_ENCRYPTED_MAX 0xFFFF
51 
52 #define LCN_OVERFLOW_OFFSET 1024
53 
54 struct tChannelID {
55 private:
56  int source;
57  int nid;
58  int tid;
59  int sid;
60  int rid;
61 public:
62  tChannelID(void) { source = nid = tid = sid = rid = 0; }
63  tChannelID(int Source, int Nid, int Tid, int Sid, int Rid = 0) { source = Source; nid = Nid; tid = Tid; sid = Sid; rid = Rid; }
64  bool operator== (const tChannelID &arg) const { return source == arg.source && nid == arg.nid && tid == arg.tid && sid == arg.sid && rid == arg.rid; }
65  bool Valid(void) const { return (nid || tid) && sid; } // rid is optional and source may be 0//XXX source may not be 0???
66  tChannelID &ClrRid(void) { rid = 0; return *this; }
68  int Source(void) const { return source; }
69  int Nid(void) const { return nid; }
70  int Tid(void) const { return tid; }
71  int Sid(void) const { return sid; }
72  int Rid(void) const { return rid; }
73  static tChannelID FromString(const char *s);
74  cString ToString(void) const;
75  static const tChannelID InvalidID;
76  };
77 
79  tTeletextSubtitlePage(void) { ttxtPage = ttxtMagazine = 0; ttxtType = 0x02; strcpy(ttxtLanguage, "und"); }
80  tTeletextSubtitlePage(int page) { ttxtMagazine = (page / 100) & 0x7; ttxtPage = (((page % 100) / 10) << 4) + (page % 10); ttxtType = 0x02; strcpy(ttxtLanguage, "und"); }
81  char ttxtLanguage[MAXLANGCODE1];
85  int PageNumber(void) const { return BCDCHARTOINT(ttxtMagazine) * 100 + BCDCHARTOINT(ttxtPage); }
86  };
87 
88 class cChannel;
89 
90 class cLinkChannel : public cListObject {
91 private:
93 public:
94  cLinkChannel(cChannel *Channel) { channel = Channel; }
95  cChannel *Channel(void) { return channel; }
96  };
97 
98 class cLinkChannels : public cList<cLinkChannel> {
99  };
100 
101 class cSchedule;
102 
103 class cChannel : public cListObject {
104  friend class cSchedules;
105  friend class cMenuEditChannel;
106  friend class cDvbSourceParam;
107 private:
108  static cString ToText(const cChannel *Channel);
109  char *name;
110  char *shortName;
111  char *provider;
112  char *portalName;
114  int frequency; // MHz
115  int source;
116  int srate;
117  int vpid;
118  int ppid;
119  int vtype;
120  int apids[MAXAPIDS + 1]; // list is zero-terminated
121  int atypes[MAXAPIDS + 1]; // list is zero-terminated
122  char alangs[MAXAPIDS][MAXLANGCODE2];
123  int dpids[MAXDPIDS + 1]; // list is zero-terminated
124  int dtypes[MAXAPIDS + 1]; // list is zero-terminated
125  char dlangs[MAXDPIDS][MAXLANGCODE2];
126  int spids[MAXSPIDS + 1]; // list is zero-terminated
127  char slangs[MAXSPIDS][MAXLANGCODE2];
128  uchar subtitlingTypes[MAXSPIDS];
129  uint16_t compositionPageIds[MAXSPIDS];
130  uint16_t ancillaryPageIds[MAXSPIDS];
131  int tpid;
134  tTeletextSubtitlePage teletextSubtitlePages[MAXTXTPAGES];
135  int caids[MAXCAIDS + 1]; // list is zero-terminated
136  int nid;
137  int tid;
138  int sid;
139  int rid;
140  int lcn; // Logical channel number assigned by data stream (or -1 if not available)
141  int number; // Sequence number assigned on load
142  bool groupSep;
148  time_t seen; // When this channel was last seen in the SDT of its transponder
149  mutable const cSchedule *schedule;
152  cString TransponderDataToString(void) const;
153 public:
154  cChannel(void);
155  cChannel(const cChannel &Channel);
156  ~cChannel();
157  cChannel& operator= (const cChannel &Channel);
158  cString ToText(void) const;
159  bool Parse(const char *s);
160  bool Save(FILE *f);
161  const char *Name(void) const;
162  const char *ShortName(bool OrName = false) const;
163  const char *Provider(void) const { return provider; }
164  const char *PortalName(void) const { return portalName; }
165  int Frequency(void) const { return frequency; }
166  int Transponder(void) const;
167  static int Transponder(int Frequency, char Polarization);
168  int Source(void) const { return source; }
169  int Srate(void) const { return srate; }
170  int Vpid(void) const { return vpid; }
171  int Ppid(void) const { return ppid; }
172  int Vtype(void) const { return vtype; }
173  const int *Apids(void) const { return apids; }
174  const int *Dpids(void) const { return dpids; }
175  const int *Spids(void) const { return spids; }
176  int Apid(int i) const { return (0 <= i && i < MAXAPIDS) ? apids[i] : 0; }
177  int Dpid(int i) const { return (0 <= i && i < MAXDPIDS) ? dpids[i] : 0; }
178  int Spid(int i) const { return (0 <= i && i < MAXSPIDS) ? spids[i] : 0; }
179  const char *Alang(int i) const { return (0 <= i && i < MAXAPIDS) ? alangs[i] : ""; }
180  const char *Dlang(int i) const { return (0 <= i && i < MAXDPIDS) ? dlangs[i] : ""; }
181  const char *Slang(int i) const { return (0 <= i && i < MAXSPIDS) ? slangs[i] : ""; }
182  int Atype(int i) const { return (0 <= i && i < MAXAPIDS) ? atypes[i] : 0; }
183  int Dtype(int i) const { return (0 <= i && i < MAXDPIDS) ? dtypes[i] : 0; }
184  uchar SubtitlingType(int i) const { return (0 <= i && i < MAXSPIDS) ? subtitlingTypes[i] : uchar(0); }
185  uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? compositionPageIds[i] : uint16_t(0); }
186  uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? ancillaryPageIds[i] : uint16_t(0); }
187  int Tpid(void) const { return tpid; }
188  const tTeletextSubtitlePage *TeletextSubtitlePages() const { return teletextSubtitlePages; }
189  int TotalTeletextSubtitlePages() const { return totalTtxtSubtitlePages; }
190  const int *Caids(void) const { return caids; }
191  int Ca(int Index = 0) const { return Index < MAXCAIDS ? caids[Index] : 0; }
192  int Nid(void) const { return nid; }
193  int Tid(void) const { return tid; }
194  int Sid(void) const { return sid; }
195  int Rid(void) const { return rid; }
196  int Lcn(void) const { return lcn; }
197  int Number(void) const { return number; }
198  void SetNumber(int Number) { number = Number; }
199  bool GroupSep(void) const { return groupSep; }
200  const char *Parameters(void) const { return parameters; }
201  const cLinkChannels* LinkChannels(void) const { return linkChannels; }
202  const cChannel *RefChannel(void) const { return refChannel; }
203  bool IsAtsc(void) const { return cSource::IsAtsc(source); }
204  bool IsCable(void) const { return cSource::IsCable(source); }
205  bool IsSat(void) const { return cSource::IsSat(source); }
206  bool IsTerr(void) const { return cSource::IsTerr(source); }
207  bool IsSourceType(char Source) const { return cSource::IsType(source, Source); }
208  tChannelID GetChannelID(void) const { return tChannelID(source, nid, (nid || tid) ? tid : Transponder(), sid, rid); }
209  bool HasTimer(void) const;
210  int Modification(int Mask = CHANNELMOD_ALL);
211  time_t Seen(void) { return seen; }
212  void CopyTransponderData(const cChannel *Channel);
213  bool SetTransponderData(int Source, int Frequency, int Srate, const char *Parameters, bool Quiet = false);
214  void SetId(int Nid, int Tid, int Sid, int Rid = 0);
215  void SetLcn(int Lcn);
216  void SetName(const char *Name, const char *ShortName, const char *Provider);
217  void SetPortalName(const char *PortalName);
218  void SetPids(int Vpid, int Ppid, int Vtype, int *Apids, int *Atypes, char ALangs[][MAXLANGCODE2], int *Dpids, int *Dtypes, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid);
219  void SetTeletextSubtitlePages(tTeletextSubtitlePage pages[], int numberOfPages);
220  void SetCaIds(const int *CaIds); // list must be zero-terminated
221  void SetCaDescriptors(int Level);
222  void SetLinkChannels(cLinkChannels *LinkChannels);
223  void SetRefChannel(cChannel *RefChannel);
224  void SetSubtitlingDescriptors(uchar *SubtitlingTypes, uint16_t *CompositionPageIds, uint16_t *AncillaryPageIds);
225  void SetSeen(void);
226  };
227 
228 class cChannels : public cRwLock, public cConfig<cChannel> {
229 private:
233  int modified;
236  void DeleteDuplicateChannels(void);
237 public:
238  cChannels(void);
239  bool Load(const char *FileName, bool AllowComments = false, bool MustExist = false);
240  void HashChannel(cChannel *Channel);
241  void UnhashChannel(cChannel *Channel);
242  int GetNextGroup(int Idx); // Get next channel group
243  int GetPrevGroup(int Idx); // Get previous channel group
244  int GetNextNormal(int Idx); // Get next normal channel (not group)
245  int GetPrevNormal(int Idx); // Get previous normal channel (not group)
246  void ReNumber(void); // Recalculate 'number' based on channel type
247  cChannel *GetByNumber(int Number, int SkipGap = 0);
248  cChannel *GetByServiceID(int Source, int Transponder, unsigned short ServiceID);
249  cChannel *GetByChannelID(tChannelID ChannelID, bool TryWithoutRid = false, bool TryWithoutPolarization = false);
250  cChannel *GetByTransponderID(tChannelID ChannelID);
251  int BeingEdited(void) { return beingEdited; }
252  void IncBeingEdited(void) { beingEdited++; }
253  void DecBeingEdited(void) { beingEdited--; }
254  bool HasUniqueChannelID(cChannel *NewChannel, cChannel *OldChannel = NULL);
255  bool SwitchTo(int Number);
256  int MaxNumber(void) { return maxNumber; }
257  int MaxChannelNameLength(void);
258  int MaxShortChannelNameLength(void);
259  void SetModified(bool ByUser = false);
260  int Modified(void);
264  cChannel *NewChannel(const cChannel *Transponder, const char *Name, const char *ShortName, const char *Provider, int Nid, int Tid, int Sid, int Rid = 0);
265  void MarkObsoleteChannels(int Source, int Nid, int Tid);
266  };
267 
268 extern cChannels Channels;
269 
270 cString ChannelString(const cChannel *Channel, int Number);
271 
272 #endif //__CHANNELS_H
cChannel * channel
Definition: channels.h:92
uint16_t AncillaryPageId(int i) const
Definition: channels.h:186
int sid
Definition: channels.h:59
unsigned char uchar
Definition: tools.h:30
int Tid(void) const
Definition: channels.h:193
int Vpid(void) const
Definition: channels.h:170
int Number(void) const
Definition: channels.h:197
const int * Dpids(void) const
Definition: channels.h:174
int tid
Definition: channels.h:137
static tChannelID FromString(const char *s)
Definition: channels.c:26
int Index(void) const
Definition: tools.c:1989
time_t seen
Definition: channels.h:148
int Dtype(int i) const
Definition: channels.h:183
void SetNumber(int Number)
Definition: channels.h:198
int MaxNumber(void)
Definition: channels.h:256
const cLinkChannels * LinkChannels(void) const
Definition: channels.h:201
const char * PortalName(void) const
Definition: channels.h:164
int Rid(void) const
Definition: channels.h:72
int Nid(void) const
Definition: channels.h:192
uchar SubtitlingType(int i) const
Definition: channels.h:184
int Spid(int i) const
Definition: channels.h:178
int TotalTeletextSubtitlePages() const
Definition: channels.h:189
int Ca(int Index=0) const
Definition: channels.h:191
int Dpid(int i) const
Definition: channels.h:177
int modification
Definition: channels.h:147
tChannelID(void)
Definition: channels.h:62
int tid
Definition: channels.h:58
static bool IsTerr(int Code)
Definition: sources.h:58
int ppid
Definition: channels.h:118
int maxChannelNameLength
Definition: channels.h:231
int Srate(void) const
Definition: channels.h:169
Definition: tools.h:489
bool GroupSep(void) const
Definition: channels.h:199
int Sid(void) const
Definition: channels.h:71
tChannelID & ClrPolarization(void)
Definition: channels.c:50
#define MAXTXTPAGES
Definition: channels.h:39
char * name
Definition: channels.h:109
cString nameSource
Definition: channels.h:144
const char * Dlang(int i) const
Definition: channels.h:180
int nid
actually the "original" network id
Definition: channels.h:57
int Ppid(void) const
Definition: channels.h:171
bool groupSep
Definition: channels.h:142
int nid
Definition: channels.h:136
const cSchedule * schedule
Definition: channels.h:149
char * provider
Definition: channels.h:111
int totalTtxtSubtitlePages
Definition: channels.h:133
const char * Alang(int i) const
Definition: channels.h:179
int maxShortChannelNameLength
Definition: channels.h:232
int tpid
Definition: channels.h:131
const char * Parameters(void) const
Definition: channels.h:200
#define CHANNELMOD_ALL
Definition: channels.h:21
cChannel * Channel(void)
Definition: channels.h:95
char * shortName
Definition: channels.h:110
int Source(void) const
Definition: channels.h:168
time_t Seen(void)
Definition: channels.h:211
const int * Caids(void) const
Definition: channels.h:190
int Rid(void) const
Definition: channels.h:195
static bool IsAtsc(int Code)
Definition: sources.h:55
void IncBeingEdited(void)
Definition: channels.h:252
const tTeletextSubtitlePage * TeletextSubtitlePages() const
Definition: channels.h:188
tChannelID(int Source, int Nid, int Tid, int Sid, int Rid=0)
Definition: channels.h:63
int source
Definition: channels.h:56
int Tpid(void) const
Definition: channels.h:187
int __EndData__
Definition: channels.h:143
int Atype(int i) const
Definition: channels.h:182
static bool IsSat(int Code)
Definition: sources.h:57
int rid
Definition: channels.h:139
tChannelID GetChannelID(void) const
Definition: channels.h:208
int frequency
Definition: channels.h:114
const char * Provider(void) const
Definition: channels.h:163
int __BeginData__
Definition: channels.h:113
const cChannel * RefChannel(void) const
Definition: channels.h:202
int Frequency(void) const
Returns the actual frequency, as given in &#39;channels.conf&#39;.
Definition: channels.h:165
#define MAXLANGCODE1
Definition: channels.h:41
int vpid
Definition: channels.h:117
#define MAXLANGCODE2
Definition: channels.h:42
bool Valid(void) const
Definition: channels.h:65
#define BCDCHARTOINT(x)
Definition: tools.h:64
int sid
Definition: channels.h:138
static bool IsType(int Code, char Source)
Definition: sources.h:59
bool IsSat(void) const
Definition: channels.h:205
cString shortNameSource
Definition: channels.h:145
const int * Apids(void) const
Definition: channels.h:173
void DecBeingEdited(void)
Definition: channels.h:253
#define MAXDPIDS
Definition: channels.h:36
cString ToString(void) const
Definition: channels.c:43
cString ChannelString(const cChannel *Channel, int Number)
Definition: channels.c:1147
bool IsTerr(void) const
Definition: channels.h:206
Definition: thread.h:53
int PageNumber(void) const
Definition: channels.h:85
Definition: epg.h:143
bool IsSourceType(char Source) const
Definition: channels.h:207
static bool IsCable(int Code)
Definition: sources.h:56
uint16_t CompositionPageId(int i) const
Definition: channels.h:185
int Apid(int i) const
Definition: channels.h:176
int maxNumber
Definition: channels.h:230
int source
Definition: channels.h:115
cString parameters
Definition: channels.h:146
int rid
Definition: channels.h:60
#define MAXSPIDS
Definition: channels.h:37
int vtype
Definition: channels.h:119
const char * Slang(int i) const
Definition: channels.h:181
bool operator==(const tChannelID &arg) const
Definition: channels.h:64
cHash< cChannel > channelsHashSid
Definition: channels.h:235
cChannels Channels
Definition: channels.c:864
int Tid(void) const
Definition: channels.h:70
static const tChannelID InvalidID
Definition: channels.h:75
int beingEdited
Definition: channels.h:234
const int * Spids(void) const
Definition: channels.h:175
cChannel * refChannel
Definition: channels.h:151
tTeletextSubtitlePage(void)
Definition: channels.h:79
int modified
Definition: channels.h:233
int Lcn(void) const
Definition: channels.h:196
bool IsCable(void) const
Definition: channels.h:204
int number
Definition: channels.h:141
cLinkChannel(cChannel *Channel)
Definition: channels.h:94
#define MAXCAIDS
Definition: channels.h:38
int Sid(void) const
Definition: channels.h:194
tChannelID & ClrRid(void)
Definition: channels.h:66
cLinkChannels * linkChannels
Definition: channels.h:150
char * portalName
Definition: channels.h:112
bool IsAtsc(void) const
Definition: channels.h:203
int Vtype(void) const
Definition: channels.h:172
int BeingEdited(void)
Definition: channels.h:251
tTeletextSubtitlePage(int page)
Definition: channels.h:80
int lcn
Definition: channels.h:140
int fixedTtxtSubtitlePages
Definition: channels.h:132
int srate
Definition: channels.h:116
Definition: tools.h:168
int Source(void) const
Definition: channels.h:68
#define MAXAPIDS
Definition: channels.h:35
int Nid(void) const
Definition: channels.h:69