vdr
1.7.27
|
00001 /* 00002 * receiver.c: The basic receiver interface 00003 * 00004 * See the main source file 'vdr.c' for copyright information and 00005 * how to reach the author. 00006 * 00007 * $Id: receiver.c 2.5 2012/02/29 11:49:36 kls Exp $ 00008 */ 00009 00010 #include "receiver.h" 00011 #include <stdio.h> 00012 #include "tools.h" 00013 00014 #ifdef LEGACY_CRECEIVER 00015 cReceiver::cReceiver(tChannelID ChannelID, int Priority, int Pid, const int *Pids1, const int *Pids2, const int *Pids3) 00016 { 00017 device = NULL; 00018 channelID = ChannelID; 00019 priority = constrain(Priority, MINPRIORITY, MAXPRIORITY); 00020 numPids = 0; 00021 AddPid(Pid); 00022 AddPids(Pids1); 00023 AddPids(Pids2); 00024 AddPids(Pids3); 00025 } 00026 #endif 00027 00028 cReceiver::cReceiver(const cChannel *Channel, int Priority) 00029 { 00030 device = NULL; 00031 priority = constrain(Priority, MINPRIORITY, MAXPRIORITY); 00032 numPids = 0; 00033 SetPids(Channel); 00034 } 00035 00036 cReceiver::~cReceiver() 00037 { 00038 if (device) { 00039 const char *msg = "ERROR: cReceiver has not been detached yet! This is a design fault and VDR will segfault now!"; 00040 esyslog("%s", msg); 00041 fprintf(stderr, "%s\n", msg); 00042 *(char *)0 = 0; // cause a segfault 00043 } 00044 } 00045 00046 bool cReceiver::AddPid(int Pid) 00047 { 00048 if (Pid) { 00049 if (numPids < MAXRECEIVEPIDS) 00050 pids[numPids++] = Pid; 00051 else { 00052 dsyslog("too many PIDs in cReceiver (Pid = %d)", Pid); 00053 return false; 00054 } 00055 } 00056 return true; 00057 } 00058 00059 bool cReceiver::AddPids(const int *Pids) 00060 { 00061 if (Pids) { 00062 while (*Pids) { 00063 if (!AddPid(*Pids++)) 00064 return false; 00065 } 00066 } 00067 return true; 00068 } 00069 00070 bool cReceiver::AddPids(int Pid1, int Pid2, int Pid3, int Pid4, int Pid5, int Pid6, int Pid7, int Pid8, int Pid9) 00071 { 00072 return AddPid(Pid1) && AddPid(Pid2) && AddPid(Pid3) && AddPid(Pid4) && AddPid(Pid5) && AddPid(Pid6) && AddPid(Pid7) && AddPid(Pid8) && AddPid(Pid9); 00073 } 00074 00075 bool cReceiver::SetPids(const cChannel *Channel) 00076 { 00077 numPids = 0; 00078 if (Channel) { 00079 channelID = Channel->GetChannelID(); 00080 return AddPid(Channel->Vpid()) && 00081 (Channel->Ppid() == Channel->Vpid() || AddPid(Channel->Ppid())) && 00082 AddPids(Channel->Apids()) && 00083 AddPids(Channel->Dpids()) && 00084 AddPids(Channel->Spids()) && 00085 (!Setup.SupportTeletext || AddPid(Channel->Tpid())); 00086 } 00087 return true; 00088 } 00089 00090 bool cReceiver::WantsPid(int Pid) 00091 { 00092 if (Pid) { 00093 for (int i = 0; i < numPids; i++) { 00094 if (pids[i] == Pid) 00095 return true; 00096 } 00097 } 00098 return false; 00099 } 00100 00101 void cReceiver::Detach(void) 00102 { 00103 if (device) 00104 device->Detach(this); 00105 }