vdr  1.7.31
receiver.c
Go to the documentation of this file.
1 /*
2  * receiver.c: The basic receiver interface
3  *
4  * See the main source file 'vdr.c' for copyright information and
5  * how to reach the author.
6  *
7  * $Id: receiver.c 2.7 2012/06/02 13:20:38 kls Exp $
8  */
9 
10 #include "receiver.h"
11 #include <stdio.h>
12 #include "tools.h"
13 
14 cReceiver::cReceiver(const cChannel *Channel, int Priority)
15 {
16  device = NULL;
18  numPids = 0;
19  SetPids(Channel);
20 }
21 
23 {
24  if (device) {
25  const char *msg = "ERROR: cReceiver has not been detached yet! This is a design fault and VDR will segfault now!";
26  esyslog("%s", msg);
27  fprintf(stderr, "%s\n", msg);
28  *(char *)0 = 0; // cause a segfault
29  }
30 }
31 
32 bool cReceiver::AddPid(int Pid)
33 {
34  if (Pid) {
35  if (numPids < MAXRECEIVEPIDS)
36  pids[numPids++] = Pid;
37  else {
38  dsyslog("too many PIDs in cReceiver (Pid = %d)", Pid);
39  return false;
40  }
41  }
42  return true;
43 }
44 
45 bool cReceiver::AddPids(const int *Pids)
46 {
47  if (Pids) {
48  while (*Pids) {
49  if (!AddPid(*Pids++))
50  return false;
51  }
52  }
53  return true;
54 }
55 
56 bool cReceiver::AddPids(int Pid1, int Pid2, int Pid3, int Pid4, int Pid5, int Pid6, int Pid7, int Pid8, int Pid9)
57 {
58  return AddPid(Pid1) && AddPid(Pid2) && AddPid(Pid3) && AddPid(Pid4) && AddPid(Pid5) && AddPid(Pid6) && AddPid(Pid7) && AddPid(Pid8) && AddPid(Pid9);
59 }
60 
61 bool cReceiver::SetPids(const cChannel *Channel)
62 {
63  numPids = 0;
64  if (Channel) {
65  channelID = Channel->GetChannelID();
66  return AddPid(Channel->Vpid()) &&
67  (Channel->Ppid() == Channel->Vpid() || AddPid(Channel->Ppid())) &&
68  AddPids(Channel->Apids()) &&
69  AddPids(Channel->Dpids()) &&
70  AddPids(Channel->Spids()) &&
71  (!Setup.SupportTeletext || AddPid(Channel->Tpid()));
72  }
73  return true;
74 }
75 
76 bool cReceiver::WantsPid(int Pid)
77 {
78  if (Pid) {
79  for (int i = 0; i < numPids; i++) {
80  if (pids[i] == Pid)
81  return true;
82  }
83  }
84  return false;
85 }
86 
88 {
89  if (device)
90  device->Detach(this);
91 }