vdr  1.7.27
receiver.c
Go to the documentation of this file.
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 }