Ejemplo n.º 1
0
static bool is_blacklisted()
{
	char line_buffer[64];
	CZapitClient zapit;
	t_channel_id channel=zapit.getCurrentServiceID();

	if(!blacklist.empty())
	{
		sprintf(line_buffer,"%llx",channel);
		return (blacklist.find(line_buffer, 0) != std::string::npos);
	}
	return 0;
}
Ejemplo n.º 2
0
void disableVideoOutput(bool disable)
{
	int arg=disable?1:0;
	int fd;
	printf("[controld] videoOutput %s\n", disable?"off":"on");

	if((fd = open(SAA7126_DEVICE,O_RDWR|O_NONBLOCK)) < 0)
	{
		perror("[controld] SAA DEVICE: ");
		return;
	}

	if ( (ioctl(fd,SAAIOSPOWERSAVE,&arg) < 0))
	{
		perror("[controld] IOCTL: ");
		close(fd);
		return;
	}
	close(fd);
	/*
		arg=disable?0:0xf;
		if((fd = open("/dev/dbox/fp0",O_RDWR|O_NONBLOCK)) < 0)
		{
			perror("[controld] FP DEVICE: ");
			return;
		}

		if ( (ioctl(fd,FP_IOCTL_LCD_DIMM,&arg) < 0))
		{
			perror("[controld] IOCTL: ");
			close(fd);
			return;
		}
		close(fd);
	*/
	if(!disable)
	{
		zapit.startPlayBack();
		setvideooutput(settings.videooutput, false);
		setVideoFormat(settings.videoformat, false);
	}
	else
	{
		setvideooutput(0, false);
		setVideoFormat(-1, false);
		zapit.stopPlayBack();
	}
}
Ejemplo n.º 3
0
void InitZapitChannelHelper(CZapitClient::channelsMode mode)
{
	CZapitChannelExec *ZapitChannelChooser = new CZapitChannelExec;
	std::vector<CMenuWidget *> toDelete;
	CZapitClient zapit;
	CZapitClient::BouquetList bouquetlist;
	zapit.getBouquets(bouquetlist, false, true, mode); // UTF-8
	CZapitClient::BouquetList::iterator bouquet = bouquetlist.begin();
	CMenuWidget mctv(LOCALE_TIMERLIST_BOUQUETSELECT, NEUTRINO_ICON_SETTINGS);

	for(; bouquet != bouquetlist.end();bouquet++)
	{
		CMenuWidget* mwtv = new CMenuWidget(LOCALE_TIMERLIST_CHANNELSELECT, NEUTRINO_ICON_SETTINGS);
		toDelete.push_back(mwtv);
		CZapitClient::BouquetChannelList channellist;
		zapit.getBouquetChannels(bouquet->bouquet_nr,channellist,mode, true); // UTF-8
		CZapitClient::BouquetChannelList::iterator channel = channellist.begin();
		for(; channel != channellist.end();channel++)
		{
			char cChannelId[32];
			sprintf(cChannelId,
				"ZC%c:%d,",
				(mode==CZapitClient::MODE_TV)?'T':'R',
				channel->nr);
			mwtv->addItem(new CMenuForwarderNonLocalized(channel->name, true, NULL, ZapitChannelChooser, (std::string(cChannelId) + channel->name).c_str()));
		}
		if (!channellist.empty())
			mctv.addItem(new CMenuForwarderNonLocalized(bouquet->name, true, NULL, mwtv));
		channellist.clear();
	}
	mctv.exec (NULL, "");
	mctv.hide ();

	// delete dynamic created objects
	for(unsigned int count=0;count<toDelete.size();count++)
	{
		delete toDelete[count];
	}
	toDelete.clear();
}
Ejemplo n.º 4
0
void shutdownBox()
{
	lcdd.shutdown();

	zapit.shutdown();

	timerd.shutdown();

	saveSettings();

	if (execlp("/sbin/halt", "/sbin/halt", 0)<0)
	{
		perror("exec failed - halt\n");
	}
}
Ejemplo n.º 5
0
int CAudioSelectMenuHandler::doMenu ()
{
	CMenuWidget AudioSelector(LOCALE_APIDSELECTOR_HEAD, "audio", 360);
	unsigned int count;
	CSubtitleChangeExec SubtitleChanger;

	for(count=0; count < g_RemoteControl->current_PIDs.APIDs.size(); count++ ) {
		char apid[5];
		sprintf(apid, "%d", count);
		AudioSelector.addItem(new CMenuForwarderNonLocalized(
					g_RemoteControl->current_PIDs.APIDs[count].desc, true, NULL,
					APIDChanger, apid, CRCInput::convertDigitToKey(count + 1)),
				(count == g_RemoteControl->current_PIDs.PIDs.selected_apid));
	}

	// -- setup menue for to Dual Channel Stereo
	AudioSelector.addItem(GenericMenuSeparatorLine);

	CMenuOptionChooser* oj = new CMenuOptionChooser(LOCALE_AUDIOMENU_ANALOGOUT,
				&g_settings.audio_AnalogMode,
				AUDIOMENU_ANALOGOUT_OPTIONS, AUDIOMENU_ANALOGOUT_OPTION_COUNT,
				true, audioSetupNotifier, CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED);

	AudioSelector.addItem( oj );

	CChannelList *channelList = CNeutrinoApp::getInstance ()->channelList;
	int curnum = channelList->getActiveChannelNumber();
	CZapitChannel * cc = channelList->getChannel(curnum);

	bool sep_added = false;
	if(cc) 
	{
		bool subs_running = false;
		for (int i = 0 ; i < (int)cc->getSubtitleCount() ; ++i) 
		{
			CZapitAbsSub* s = cc->getChannelSub(i);
			if (s->thisSubType == CZapitAbsSub::DVB) {
				CZapitDVBSub* sd = reinterpret_cast<CZapitDVBSub*>(s);
				fprintf(stderr, "[neutrino] adding DVB subtitle %s pid 0x%x\n", sd->ISO639_language_code.c_str(), sd->pId);
				if(!sep_added) {
					sep_added = true;
					AudioSelector.addItem(new CMenuSeparator(CMenuSeparator::LINE | CMenuSeparator::STRING, LOCALE_SUBTITLES_HEAD));
				}
				char spid[10];
				snprintf(spid,sizeof(spid), "DVB:%d", sd->pId);
				char item[64];
				snprintf(item,sizeof(item), "DVB: %s (pid %03X)", sd->ISO639_language_code.c_str(), sd->pId);
				bool this_sub_running = (sd->pId == dvbsub_getpid());
				subs_running |= this_sub_running;
				AudioSelector.addItem(new CMenuForwarderNonLocalized(item /*sd->ISO639_language_code.c_str()*/,
							!this_sub_running, NULL, &SubtitleChanger, spid, CRCInput::convertDigitToKey(++count)));
			} else if (s->thisSubType == CZapitAbsSub::TTX) {
				CZapitTTXSub* sd = reinterpret_cast<CZapitTTXSub*>(s);
				fprintf(stderr, "[neutrino] adding TTX subtitle %s pid %X mag %d page %d\n",
					sd->ISO639_language_code.c_str(), sd->pId, sd->teletext_magazine_number, sd->teletext_page_number);
				if(!sep_added) {
					sep_added = true;
					AudioSelector.addItem(new CMenuSeparator(CMenuSeparator::LINE | CMenuSeparator::STRING, LOCALE_SUBTITLES_HEAD));
				}
				char spid[64];
				int page = ((sd->teletext_magazine_number & 0xFF) << 8) | sd->teletext_page_number;
				int pid = sd->pId;
				snprintf(spid,sizeof(spid), "TTX:%d:%03X:%s", sd->pId, page, sd->ISO639_language_code.c_str()); 
				char item[64];
				snprintf(item,sizeof(item), "TTX: %s (pid %X page %03X)", sd->ISO639_language_code.c_str(), sd->pId, page);
				bool this_sub_running = tuxtx_subtitle_running(&pid, &page, NULL);
				subs_running |= this_sub_running;
				AudioSelector.addItem(new CMenuForwarderNonLocalized(item /*sd->ISO639_language_code.c_str()*/,
							!this_sub_running, NULL, &SubtitleChanger, spid, CRCInput::convertDigitToKey(++count)));
			}
		}
		
		if(sep_added) {
			if (subs_running)
				AudioSelector.addItem(new CMenuForwarder(LOCALE_SUBTITLES_STOP, true, NULL, &SubtitleChanger, "off", CRCInput::RC_stop));
		} else {
			// subtitles might not be available, but started by zapit anyway, as it remembers pids
			dvbsub_stop();
			tuxtx_stop_subtitle();
		}
	}
	AudioSelector.addItem(new CMenuSeparator(CMenuSeparator::LINE | CMenuSeparator::STRING, LOCALE_VOLUME_ADJUSTMENT));

	int percent[g_RemoteControl->current_PIDs.APIDs.size()];
	CZapitClient zapit;
	for(count = 0; count < g_RemoteControl->current_PIDs.APIDs.size(); count++ ) {
		zapit.getVolumePercent((unsigned int *) &percent[count], g_RemoteControl->current_PIDs.APIDs[count].pid);
		AudioSelector.addItem(new CMenuOptionNumberChooser(NONEXISTANT_LOCALE, &percent[count],
			count == g_RemoteControl->current_PIDs.PIDs.selected_apid,
			0, 999, audioSetupNotifier, 0, 0, NONEXISTANT_LOCALE,
			g_RemoteControl->current_PIDs.APIDs[count].desc));
	}

	return AudioSelector.exec(NULL, "");
}
Ejemplo n.º 6
0
int main ()
{
   unsigned Bouquet;
   unsigned Channel;
   unsigned BufNum;
   int RadioMode;
   int ExtraPidNum;
   unsigned ExtraPid[MAX_PID_NUM];
   unsigned StoppedDmxReaders, EmptyStreamBuffers;
   char CmdString[100];
   char TcpString[STRING_SIZE];

   pthread_t TcpReceiverThread;
   //pthread_attr_t ThreadAttr;
   //struct sched_param SchedParam;

   int RetVal, i;
   unsigned u, v;

   mainProcessID = getpid();

   // ****************************************************
   // * INIT
   // ****************************************************
   // * - Programm umschalten
   // * - PID's ermitteln
   // * - IP-Adresse, Port, MTU ermitteln
   // ****************************************************

   // Eingabe parsen

   ReadLine( TcpString );
   RetVal = sscanf( TcpString, "%s %u %u %u %u %s %x %x %x %x %x %x %x %x %x",
                  CmdString, &(Send.Port), &BufNum,
                  &Bouquet, &Channel, ExtraAVString,
                  &(ExtraPid[0]), &(ExtraPid[1]), &(ExtraPid[2]),
                  &(ExtraPid[3]), &(ExtraPid[4]), &(ExtraPid[5]),
                  &(ExtraPid[6]), &(ExtraPid[7]), &(ExtraPid[8]) );
   if ( RetVal < 4 || RetVal > 12 || Send.Port <= 1023 ) {
      fprintf(stderr, "ERROR: main() - illegal arguments\nEXIT\n");
      fflush(stderr);
      exit(-1);
   }
   ExtraPidNum = RetVal-6;  // -1 => keine zus. PID's (wg. AVString)

   if ( BufNum > MAX_SPKT_BUF_NUM || BufNum < 5 ) {
      fprintf(stderr, "ERROR: main() - BufNum too large/small\nEXIT\n");
      fflush(stderr);
      exit(-1);
   }
   for (u=0; u<BufNum-1; u++) NextSPktBuf[u] = u+1;
   NextSPktBuf[BufNum-1] = 0;

   if (!strcmp(CmdString, "VIDEO")) {
      RadioMode = 0;
      TSMode = 0;
   } else if (!strcmp(CmdString, "VIDEOTS")) {
      RadioMode = 0;
      TSMode = 1;
   } else if (!strcmp(CmdString, "AUDIO")) {
      RadioMode = 1;
      TSMode = 0;
   } else if (!strcmp(CmdString, "AUDIOTS")) {
      RadioMode = 1;
      TSMode = 1;
   } else {
      fprintf(stderr, "ERROR: main() - illegal command\nEXIT\n");
      fflush(stderr);
      exit(-1);
   }


   StreamNum = 0;
   if ( Bouquet != 0 ) {
   	CZapitClient zapit;
      // Programm umschalten
      CZapitClient::responseGetPIDs pids;

      if (RadioMode) {
         zapit.setMode(CZapitClient::MODE_RADIO);
      } else {
         zapit.setMode(CZapitClient::MODE_TV);
      }

      zapit.zapTo(Bouquet-1,Channel);
      zapit.getPIDS(pids);

      // Pid's ermitteln
      if (pids.PIDs.vpid) {
          Stream[StreamNum].Filter.pid = pids.PIDs.vpid;
          AVString[StreamNum] = 'v';
          Stream[StreamNum++].BufPacketNum =
                 AV_BUF_FACTOR * AUDIO_BUF_PACKET_NUM;
      }
      for ( u=0; u<pids.APIDs.size(); u++) {
         Stream[StreamNum].Filter.pid = pids.APIDs[u].pid;
         AVString[StreamNum] = 'a';
         Stream[StreamNum++].BufPacketNum = AUDIO_BUF_PACKET_NUM;
      }

      /* if (TSMode) {
			// PMT-Pid wird benotigt nicht ServiceID!!
         //Stream[StreamNum].Filter.pid = zapit.getCurrentServiceID();
         //AVString[StreamNum] = 'a';
         //Stream[StreamNum++].BufPacketNum = AUDIO_BUF_PACKET_NUM;
			//zapit.stopPlayBack();
				// TS-Streaming geht nur im SPTS-Mode mit Playback!
				// sonst ist der Stream "nicht richtig gemuxt"
      }*/
   }

   //if (TSMode) {
   //   Stream[StreamNum].Filter.pid = 0;
   //   AVString[StreamNum] = 'a';
   //   Stream[StreamNum++].BufPacketNum = AUDIO_BUF_PACKET_NUM;
   //}

   for ( i=0; i<ExtraPidNum; i++) {
      Stream[StreamNum].Filter.pid = ExtraPid[i];
      switch( ExtraAVString[i] ) {
         case 'v':
            AVString[StreamNum] = 'v';
            Stream[StreamNum++].BufPacketNum =
               AV_BUF_FACTOR * AUDIO_BUF_PACKET_NUM;
            break;
         case 'a':
            AVString[StreamNum] = 'a';
            Stream[StreamNum++].BufPacketNum = AUDIO_BUF_PACKET_NUM;
            break;
        default:
            fprintf(stderr, "ERROR: main() - illegal extra AV string \n");
            fflush(stderr);
            break;
      }
   }
   if (StreamNum == 0) {
      fprintf(stderr, "ERROR: main() - no pids to record\nEXIT\n");
      fflush(stderr);
      exit(-1);
   }

   AVString[StreamNum] = 0;

   if (TSMode) {
		StreamThreadNum = 1;
		Stream[0].BufPacketNum = 188;
	} else {
		StreamThreadNum = StreamNum;
	}


   // Adresse fuer Send.Socket ermitteln
   Send.AddrLen = sizeof(struct sockaddr_in);
   if ( -1 == getpeername(STDIN_FILENO,
                (struct sockaddr *)&(Send.Addr), &(Send.AddrLen)) ) {
      perror("ERROR: main() - getpeername");
      fprintf(stderr, "EXIT\n");
      fflush(stderr);
      exit(-1);
   }
   Send.Addr.sin_family = AF_INET;
   Send.Addr.sin_port   = htons( (unsigned short)(Send.Port) );
   printf("INFO: IP %x Port %u\n", Send.Addr.sin_addr.s_addr, Send.Port);
   fflush(stdout);

   // Antwort an Client
   printf("PID %s %i", AVString, StreamThreadNum);
   for (u=0; u<StreamNum; u++) printf(" %x", Stream[u].Filter.pid);
   printf("\n");
   fflush(stdout);

   // START-Befehl abwarten
   ReadLine( TcpString );

   if ( !strncmp(TcpString, "STOP", 4) ) {   // ZapMode
      printf("INFO: zap mode\nEXIT\n" );
      fflush(stdout);
      exit(0);

   } else if ( strncmp(TcpString, "START", 5) ) {
      fprintf(stderr, "ERROR: main() - START command expected\nEXIT\n");
      fflush(stderr);
      exit(-1);
   }

   // *****************************************************
   // * Start streaming
   // *****************************************************

   // Super Packet Buffer initialisieren
   for (u=0; u<BufNum; u++) {
      SPkt.ReSendStatus[u] = 0;
      SPkt.Buf[u] = (unsigned char*) malloc( SPKT_BUF_SIZE );
      if ( SPkt.Buf[u] == 0 ) {
         fprintf(stderr, "ERROR: main() - malloc SPkt.Buf\nEXIT\n");
         fflush(stderr);
         exit(-1);
      }
   }
   SPkt.WritePkt = 0;
   SPkt.WriteBuf = 0;
   SPkt.ReadPkt = 0;
   SPkt.ReadBuf = 0;

   // UdpSender einrichten
   Send.Socket = -1;
   Send.Packet = 0;
   RestartUdpSender();



	// DmxReader vorbereiten
	StreamStop = 0;
	for (u=0; u<StreamThreadNum; u++) {
		Stream[u].ReadBuf = 0;
		Stream[u].WriteBuf = 0;
		Stream[u].ReadPkt = 0;
		Stream[u].Stopped = 0;

		Stream[u].Ptr = (void*)&(Stream[u]);
		for( v=0; v<2; v++) {
			Stream[u].Buf[v] = (unsigned char*)malloc(
			Stream[u].BufPacketNum * NET_DATA_PER_PACKET );
			if ( Stream[u].Buf[v] == 0 ) {
				fprintf(stderr, "ERROR: main() - malloc Stream.Buf\nEXIT\n");
				fflush(stderr);
				exit(-1);
			}
		}
	}


   // Tcp Receiver starten -> STOP, RESEND Befehle auswerten
   if ( pthread_create(&TcpReceiverThread, 0, TcpReceiver, 0 ) ) {
      perror("ERROR: main() - TcpReceiver pthread_create");
      fprintf(stderr, "EXIT\n");
      fflush(stderr);
      exit(-1);
   }

   //SchedParam.sched_priority = 10;
   //pthread_attr_init(&ThreadAttr);
   //pthread_attr_setschedpolicy(&ThreadAttr, SCHED_FIFO );
   //pthread_attr_setschedparam(&ThreadAttr, &SchedParam);

	// DmxReader Thread's starten
   if (TSMode) {
      if ( pthread_create(&(Stream[u].Thread), 0, //&ThreadAttr,
                            DmxTSReader, 0 ) ) {
         perror("ERROR: main() - DmxReader pthread_create");
         fprintf(stderr, "EXIT\n");
         fflush(stderr);
         exit(-1);
      }
   } else {
		for (u=0; u<StreamThreadNum; u++) {
			if ( pthread_create(&(Stream[u].Thread), 0, //&ThreadAttr,
										 DmxReader, Stream[u].Ptr ) ) {
				perror("ERROR: main() - DmxReader pthread_create");
				fprintf(stderr, "EXIT\n");
				fflush(stderr);
				exit(-1);
			}
		}
	}

   // ****************************************************************
   // Hauptschleife
   // ==============================================================
   // Pakete von den DmxBuf's in SPktBuf's umkopieren und
   // Headern versehen
   // ****************************************************************

   StoppedDmxReaders = 0;
   do {
      WritePtr = SPkt.Buf[SPkt.WriteBuf] +
                    SPkt.WritePkt * DATA_PER_PACKET;
      for (u=0; u<BufNum; u++) {
         if ( SPkt.ReSendStatus) {
            for (v=0; v<SPKT_BUF_PACKET_NUM; v++) {
               if ( SPkt.ReSend[u][v] ) {
                  ReadPtr = SPkt.Buf[u] + v * DATA_PER_PACKET;
                  memmove ( WritePtr, ReadPtr, DATA_PER_PACKET );
                  PacketHeader = (PacketHeaderType*)WritePtr;
                  PacketHeader->Packet = SPkt.WritePkt++;
                  PacketHeader->Status = 0;
                  PacketHeader->SPktBuf = SPkt.WriteBuf;
                  WritePtr += DATA_PER_PACKET;
                  CheckNextSPktWriteBuf( );
              }
              SPkt.ReSend[u][v] = 0;
           }
         }
      }
      EmptyStreamBuffers = 0;
      do {
         for(u=0; u<StreamThreadNum; u++) {
            if ( Stream[u].Stopped ) {
               StoppedDmxReaders++;
               EmptyStreamBuffers++;
               continue;
            }

            if ( Stream[u].WriteBuf != Stream[u].ReadBuf ) {
               ReadPtr = Stream[u].Buf[Stream[u].ReadBuf];

               for (v=0; v<Stream[u].BufPacketNum; v++) {
                  PacketHeader = (PacketHeaderType*)WritePtr;
                  PacketHeader->Packet = SPkt.WritePkt++;
                  PacketHeader->Status = 0;
                  PacketHeader->SPktBuf = SPkt.WriteBuf;
                  PacketHeader->Stream = u;
                  PacketHeader->StreamPacket = Stream[u].ReadPkt++;
                  WritePtr += sizeof(PacketHeaderType);
                  memmove ( WritePtr, ReadPtr, NET_DATA_PER_PACKET );
                  ReadPtr += NET_DATA_PER_PACKET;
                  WritePtr += NET_DATA_PER_PACKET;
                  CheckNextSPktWriteBuf( );
               }
               if ( Stream[u].ReadBuf == 0 ) Stream[u].ReadBuf = 1;
                                       else  Stream[u].ReadBuf = 0;
            } else {
               EmptyStreamBuffers++;
            }
         }
      } while ( EmptyStreamBuffers < StreamThreadNum );
      usleep(15000);  // 10% * 128 * 1468 * 8 / 10 MBit/s
   } while (StoppedDmxReaders < StreamThreadNum );
   PacketHeader->Status = 2;
   SPkt.WriteBuf = NextSPktBuf[SPkt.WriteBuf];
   StreamStop = 0;
   for (i=0; i<200; i++) {
	  	if ( StreamStop ) break;
		usleep(15000);
	}
   printf("EXIT\n" );
   fflush(stdout);
   /*	 siehe stopPlayBack
	if (Bouquet != 0 && TSMode) {
		zapit.startPlayBack();
	}
	*/
	exit(0);
}
Ejemplo n.º 7
0
int main (int argc, char** argv)
{
	int i;
	uint32_t  j;
	//uint32_t  k;
	uint64_t ii;

	int bouquet = -1;
	unsigned int channel = 0;
	unsigned int count;
	int diseqcRepeats = -1;
	int diseqcType = -1;
	uint64_t satmask = 0xFFFF;
	int audio = 0;
	int mute = -1;
	int volume = -1;
	int nvod = -1;
	int arat = -1;
	int m43 = -1;
	int lockrc = -1;
	const char * channelName = NULL;

	bool playback = false;
	bool recordmode = false;
	bool radio = false;
	bool reload = false;
	bool register_neutrino = false;
	bool savebouquets = false;
	bool show_satellites = false;
	bool set_pal = false;
	int  set_hd = 0;
	bool scan = false;
	bool rezap = false;
	bool zapByName = false;
	bool killzapit = false;
	bool enterStandby = false;
	bool leaveStandby = false;
	bool sendMotorCommand = false;
	bool quiet = false;
	bool getchannel = false;
	bool aspectratio = false;
	bool mode43 = false;
	uint8_t motorCmdType = 0;
	uint8_t motorCmd = 0;
	uint8_t motorNumParameters = 0;
	uint8_t motorParam1 = 0;
	uint8_t motorParam2 = 0;
	uint8_t motorAddr = 0;
	uint32_t  diseqc[5];
	unsigned int tmp;
	int scan_mode = 1;
	t_channel_id zapsid = 0;
	/* command line */
	for (i = 1; i < argc; i++)
	{
		if (!strncmp(argv[i], "-a", 2))
		{
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%d", &audio);
				continue;
			}
		}
		else if (!strncmp(argv[i], "-dr", 3))
		{
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%d", &diseqcRepeats);
				continue;
			}
		}
		else if (!strncmp(argv[i], "-dt", 3))
		{
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%d", &diseqcType);
				continue;
			}
		}
		else if (!strncmp(argv[i], "-q", 2))
		{
			quiet = true;
			continue;
		}
		else if (!strncmp(argv[i], "-c", 2))
		{
			reload = true;
			continue;
		}
		else if (!strncmp(argv[i], "-esb", 4))
		{
			enterStandby = true;
			continue;
		}
		else if (!strncmp(argv[i], "-kill", 5))
		{
			killzapit = true;
			continue;
		}
		else if (!strncmp(argv[i], "-lsb", 4))
		{
			leaveStandby = true;
			continue;
		}
		else if (!strncmp(argv[i], "-rz", 3))
		{
			rezap = true;
			continue;
		}
		else if (!strncmp(argv[i], "-mute", 5))
		{
			mute = 1;
			continue;
		}
		else if (!strncmp(argv[i], "-m", 2))
		{
			if (i < argc - 6)
			{
				sscanf(argv[++i], "%x", &tmp);
				motorCmdType = tmp;
				sscanf(argv[++i], "%x", &tmp);
				motorAddr = tmp;
				sscanf(argv[++i], "%x", &tmp);
				motorCmd = tmp;
				sscanf(argv[++i], "%x", &tmp);
				motorNumParameters = tmp;
				sscanf(argv[++i], "%x", &tmp);
				motorParam1 = tmp;
				sscanf(argv[++i], "%x", &tmp);
				motorParam2 = tmp;
				printf("[pzapit] motor command = %x %x %x %x %x %x\n", motorCmdType, motorAddr, motorCmd, motorNumParameters, motorParam1, motorParam2);
				sendMotorCommand = true;
				continue;
			}
		}
		else if (!strncmp(argv[i], "-rn", 3))
		{
			register_neutrino = true;
			continue;
		}
		else if (!strncmp(argv[i], "-nvod", 5))
		{
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%d", &nvod);
				continue;
			}
		}
		else if (!strncmp(argv[i], "-n", 2))
		{
			if (i < argc - 1)
			{
				zapByName = true;
				channelName = argv[++i];
				continue;
			}
		}
		else if (!strncmp(argv[i], "-p", 2))
		{
			playback = true;
			continue;
		}
		else if (!strncmp(argv[i], "-ra", 3))
		{
			radio = true;
			continue;
		}
		else if (!strncmp(argv[i], "-re", 3))
		{
			recordmode = true;
			continue;
		}
		else if (!strncmp(argv[i], "-var", 4))
		{
			aspectratio = true;
			if (i < argc - 1)
				sscanf(argv[++i], "%d", &arat);
			continue;
		}
		else if (!strncmp(argv[i], "-vm43", 5))
		{
			mode43 = true;
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%d", &m43);
				continue;
			}
#if 0 
			//FIXME howto read aspect mode back?
			continue;
#endif
		}
		else if (!strncmp(argv[i], "-sb", 3))
		{
			savebouquets = true;
			continue;
		}
		else if (!strncmp(argv[i], "-se", 3))
		{
			if (i < argc - 2)
			{
				sscanf(argv[++i], "%" SCNd64 "", &satmask);
				sscanf(argv[++i], "%d", &diseqc[0]);
				/*
								diseqc[0] = strlen(argv[i+1]);
								for (i++, j = 0; j <= diseqc[0]; j++)
								{
									diseqc[j+1] = argv[i][j] - 48;
								}
				*/
				continue;
			}
		}
		else if (!strncmp(argv[i], "-sh", 3))
		{
			show_satellites = true;
			continue;
		}
		else if (!strncmp(argv[i], "-st", 3))
		{
			scan = true;
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%d", &scan_mode);
			}
			continue;
		}
		else if (!strncmp(argv[i], "--pal", 4))
		{
			set_pal = true;
			continue;
		}

		else if (!strncmp(argv[i], "--1080", 6))
		{
			set_hd = 8;
			continue;
		}
		else if (!strncmp(argv[i], "--1083", 6))
		{
			set_hd = 9;
			continue;
		}
		else if (!strncmp(argv[i], "--1082", 6))
		{
			set_hd = 10;
			continue;
		}
		else if (!strncmp(argv[i], "--720", 5))
		{
			set_hd = 7;
			continue;
		}
		else if (!strncmp(argv[i], "-unmute", 7))
		{
			mute = 0;
			continue;
		}
		else if (!strncmp(argv[i], "-vol", 4))
		{
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%d", &volume);
				continue;
			}
		}
		else if (!strncmp(argv[i], "-gi", 3))
		{
			getchannel = true;
			continue;
		}
		else if (!strncmp(argv[i], "-zi", 3))
		{
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%" SCNx64 "", &zapsid);
				continue;
			}
		}
		else if (!strncmp(argv[i], "-lockrc", 7))
		{
			lockrc = 1;
			continue;
		}
		else if (!strncmp(argv[i], "-unlockrc", 9))
		{
			lockrc = 0;
			continue;
		}
		else if (i < argc - 1)
		{
			if ((sscanf(argv[i], "%d", &bouquet) > 0) && (sscanf(argv[++i], "%u", &channel) > 0))
				continue;
		}
		else if (sscanf(argv[i], "%d", &bouquet) > 0)
			continue;

		return usage(argv[0]);
	}

	/* create zapit client */
	CZapitClient zapit;

#if 0
	TP_params TP;
	TP.TP_id = 12345;
	TP.polarization = 1;
	TP.feparams.Frequency = 11727000;
	TP.feparams.u.qpsk.SymbolRate = 27500000;
	TP.feparams.u.qpsk.FEC_inner = (CodeRate) 3;

	zapit.scan_TP(TP);
	exit(0);
#endif

	/* send diseqc 1.2 motor command */
	if (sendMotorCommand)
	{
		zapit.sendMotorCommand(motorCmdType, motorAddr, motorCmd, motorNumParameters, motorParam1, motorParam2);
		return 0;
	}

	/* kill zapit*/
	if (killzapit)
	{
		zapit.shutdown();
		std::cout << "zapit shot down :)" << std::endl;
		return 0;
	}

	if (enterStandby)
	{
		zapit.setStandby(true);
		return 0;
	}

	if (leaveStandby)
	{
		zapit.setStandby(false);
		return 0;
	}

	/* audio mute */
	if (mute != -1)
	{
		std::cout << "mute/unmute" << std::endl;
		zapit.muteAudio(mute);
		return 0;
	}

	if (volume != -1)
	{
		std::cout << "set volume" << std::endl;
		zapit.setVolume(volume, volume);
		return 0;
	}
	if (lockrc != -1)
	{
		zapit.lockRc(lockrc);
		return 0;
	}
	if (rezap)
	{
		zapit.Rezap();
		return 0;
	}

	/* reload services */
	if (reload)
	{
		std::cout << "reloading channels" << std::endl;
		zapit.reinitChannels();
		return 0;
	}

	if (register_neutrino)
	{
#define NEUTRINO_UDS_NAME "/tmp/neutrino.sock"
		std::cout << "registering neutrino" << std::endl;
		for (int ic = CZapitClient::FIRST_EVENT_MARKER; ic < CZapitClient::LAST_EVENT_MARKER; ic++)
			zapit.registerEvent(ic, 222, NEUTRINO_UDS_NAME);
		return 0;
	}

	if (diseqcType != -1)
	{
		zapit.setDiseqcType((diseqc_t) diseqcType);

		if (diseqcRepeats == -1)
			return 0;
	}

	if (diseqcRepeats != -1)
	{
		zapit.setDiseqcRepeat(diseqcRepeats);
		return 0;
	}

	if (playback)
	{
		if (zapit.isPlayBackActive())
			zapit.stopPlayBack();
		else
			zapit.startPlayBack();

		if (!recordmode)
			return 0;
	}

	if (recordmode)
	{
		zapit.setRecordMode(!zapit.isRecordModeActive());
		return 0;
	}

	if (aspectratio)
	{
		if(arat >= 0)
			zapit.setAspectRatio(arat);
		else
		{
			zapit.getAspectRatio(&arat);
			printf("%d\n", arat);
		}
		return 0;
	}

	if (mode43)
	{
		if(m43 >= 0)
			zapit.setMode43(m43);
		else
		{
			zapit.getMode43(&m43);
			printf("%d\n",m43);
		}
		return 0;
	}

	if (savebouquets)
	{
		zapit.saveBouquets();
		return 0;
	}

	if (show_satellites)
	{
		std::vector<CZapitClient::responseGetSatelliteList> satelliteList;
		zapit.getScanSatelliteList(satelliteList);

		std::vector<CZapitClient::responseGetSatelliteList>::const_iterator rI;
		for ( ii = 0, rI = satelliteList.begin(); rI != satelliteList.end(); ii++, rI++)
			printf("%" PRId64 " : %s %d\n", ii, rI->satName, rI->satPosition);
		//std::cout << (1 << ii) << ": " << rI->satName << std::endl;

		return 0;
	}
	else if (satmask != 0xFFFF)
	{
		std::vector<CZapitClient::responseGetSatelliteList> satelliteList;
		zapit.getScanSatelliteList(satelliteList);

		std::vector<CZapitClient::commandSetScanSatelliteList> newSatelliteList;
		CZapitClient::commandSetScanSatelliteList item;

		for (j = 0; j < satelliteList.size(); j++)
		{
			if (satmask == j)
			{
				std::cout << "diseqc " << diseqc[0] << ": " << satelliteList[j].satName << std::endl;

				cstrncpy(item.satName, satelliteList[j].satName, sizeof(item.satName) - 1);
				item.position = diseqc[0];
				newSatelliteList.push_back(item);
				break;
			}
		}

		zapit.setScanSatelliteList(newSatelliteList);

		return 0;
	}

	/* transponderscan */
	if (scan)
	{
		unsigned int satellite;
		unsigned int processed_transponder;
		unsigned int transponder;
		unsigned int services;
		printf("Start scan, mode %d\n", scan_mode);
		zapit.startScan(scan_mode);

		while (zapit.isScanReady(satellite, processed_transponder, transponder, services) == false)
		{
			std::cout << "satellite: " << satellite << ", transponder: " << processed_transponder <<", of: " << transponder << ", services: " << services << std::endl;
			sleep(1);
		}

		return 0;
	}

	if (set_pal)
	{
		//zapit.stopPlayBack();
		zapit.setVideoSystem(2);
		//zapit.startPlayBack();
		return 0;
	}

	if (set_hd)
	{
		//zapit.stopPlayBack();
		zapit.setVideoSystem(set_hd);
		//zapit.startPlayBack();
		return 0;
	}
	if (getchannel)
	{
		t_channel_id channelid = zapit.getCurrentServiceID();
		printf("%" PRIx64 " (%s)\n", channelid, (zapit.getChannelName(channelid)).c_str());
		return 0;
	}


	/* choose source mode */
	zapit.setMode(radio ? CZapitClient::MODE_RADIO : CZapitClient::MODE_TV);

	if (zapsid > 0)
	{
		printf("Zapping to: %" PRIx64 " (%s) ", zapsid, (zapit.getChannelName(zapsid)).c_str());
		tmp = zapit.zapTo_serviceID(zapsid);
		if (!tmp)
		  printf("failed");
		printf("\n");
		return tmp;
	}
	/* set audio channel */
	if (audio)
	{
		zapit.setAudioChannel(audio - 1);
		return 0;
	}

	if (nvod != -1)
	{
		zapit.zaptoNvodSubService(nvod);
		return 0;
	}
	else
	{
		std::vector<CZapitClient::responseGetBouquetChannels> channels;

		if (zapByName)
		{
			zapit.getChannels(channels);

			std::vector<CZapitClient::responseGetBouquetChannels>::const_iterator ch_resp;
			for (ch_resp = channels.begin(), channel = 1; ch_resp != channels.end(); ch_resp++, ++channel)
			{
				if (!strcasecmp(ch_resp->name, channelName))
				{
					std::cout << "found channel number: " << channel << std::endl;
					goto channel_found;
				}
			}

			std::cout << "channel not found." << std::endl;
			return 0;
		}
		else /* zap by bouquet number and channel number */
		{
			/* read channel list */
			if (bouquet != -1)
				zapit.getBouquetChannels(bouquet - 1, channels, CZapitClient::MODE_CURRENT, true);

			/* display bouquet list */
			else
			{
				std::vector<CZapitClient::responseGetBouquets> bouquets;
				std::vector<CZapitClient::responseGetBouquets>::const_iterator b_resp;

				zapit.getBouquets(bouquets, false);

				for (b_resp = bouquets.begin(); b_resp != bouquets.end(); ++b_resp)
					std::cout << (b_resp->bouquet_nr + 1) << ": " << b_resp->name << std::endl;

				return 0;
			}

			/* display channel list */
			if (!channel)
			{
				std::vector<CZapitClient::responseGetBouquetChannels>::const_iterator ch_resp;
				for (ch_resp = channels.begin(), channel = 1; ch_resp != channels.end(); ch_resp++, ++channel)
					//std::cout << channel << ": " << ch_resp->name << ": " << ch_resp->channel_id<< std::endl;
					printf("%3d: %s (%04x)\n", channel, ch_resp->name, (short) (ch_resp->channel_id &0xFFFF));
				return 0;
			}
		}

		/* zap */
		if (channel > channels.size())
		{
			std::cout << "Only " << channels.size() << " channels in bouquet " << bouquet << std::endl;
			return 0;
		}

channel_found:
		zapit.zapTo(channels[channel-1].nr);
		std::cout << "zapped to " << channels[channel-1].name << std::endl;
	}

	if (!quiet)
	{
		CZapitClient::responseGetPIDs pids;
		zapit.getPIDS(pids);

		if (pids.PIDs.vpid)
			std::cout << "   video: 0x" << std::hex << pids.PIDs.vpid << std::endl;

		if (pids.PIDs.vtxtpid)
			std::cout << "teletext: 0x" << std::hex << pids.PIDs.vtxtpid << std::endl;

		if (pids.PIDs.pcrpid)
			std::cout << "     pcr: 0x" << std::hex << pids.PIDs.pcrpid << std::endl;

		for (count = 0; count < pids.APIDs.size(); count++)
		{
			std::cout << " audio " << std::dec << count + 1 << ": 0x" << std::hex << pids.APIDs[count].pid << " (" << pids.APIDs[count].desc;
			if (pids.APIDs[count].is_ac3)
				std::cout << ", ac3";
			else if (pids.APIDs[count].is_aac)
				std::cout << ", aac";
			else
				std::cout << ", unknown";

			std::cout << ")" << std::endl;
		}
	}

	return 0;
}
Ejemplo n.º 8
0
int main(int argc, char **argv)
{
	int listenfd, connfd;
	printf("Controld  $Id: controld.cpp,v 1.76.2.1 2002/10/24 20:34:32 thegoodguy Exp $\n\n");
	
	switch (fork())
	{
	case -1:
		perror("[controld] fork");
		return -1;
	case 0:
		break;
	default:
		return 0;
	}
	
	if (setsid() == -1)
	{
		perror("[controld] setsid");
		return -1;
	}

	eventServer = new CEventServer;

	struct sockaddr_un servaddr;
	int clilen;
	memset(&servaddr, 0, sizeof(struct sockaddr_un));
	servaddr.sun_family = AF_UNIX;
	strcpy(servaddr.sun_path, CONTROLD_UDS_NAME);
	clilen = sizeof(servaddr.sun_family) + strlen(servaddr.sun_path);
	unlink(CONTROLD_UDS_NAME);

	//network-setup
	if ((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
	{
		perror("socket");
	}

	if ( bind(listenfd, (struct sockaddr*) &servaddr, clilen) <0 )
	{
		perror("[controld] bind failed...\n");
		exit(-1);
	}


	if (listen(listenfd, 5) !=0)
	{
		perror("[controld] listen failed...\n");
		exit( -1 );
	}

	//busyBox
	signal(SIGHUP,sig_catch);
	signal(SIGINT,sig_catch);
	signal(SIGQUIT,sig_catch);
	signal(SIGTERM,sig_catch);

	/* load configuration */
	config = new CConfigFile(',');

	if (!config->loadConfig(CONF_FILE))
	{
		/* set defaults if no configuration file exists */
		printf("[controld] %s not found\n", CONF_FILE);
	}


	settings.volume      = config->getInt32("volume", 100);
	settings.volume_avs  = config->getInt32("volume_avs", 100);
	settings.mute        = config->getBool("mute", false);
	settings.mute_avs    = config->getBool("mute_avs", false);
	settings.videooutput = config->getInt32("videooutput", 1); // fblk1 - rgb
	settings.videoformat = config->getInt32("videoformat", 2); // fnc2 - 4:3

	setBoxType(); // dummy set - liest den aktuellen Wert aus!

	watchDog = new CEventWatchDog();
	aspectRatioNotifier = new CControldAspectRatioNotifier();
	watchDog->registerNotifier(WDE_VIDEOMODE, aspectRatioNotifier);

	//init
	audioControl::setVolume(map_volume(settings.volume_avs, true));
	zapit.setVolume(map_volume(settings.volume, false), map_volume(settings.volume, false));
	lcdd.setVolume(settings.volume_avs);    // we could also display settings.volume at startup

	audioControl::setMute(settings.mute_avs);
	zapit.muteAudio(settings.mute);
	lcdd.setMute(settings.mute || settings.mute_avs);

	setvideooutput(settings.videooutput);
	setVideoFormat(settings.videoformat, false);


	try
	{
		struct CControld::Header rmessage;
		while(true)
		{
			connfd = accept(listenfd, (struct sockaddr*) &servaddr, (socklen_t*) &clilen);
			memset(&rmessage, 0, sizeof(rmessage));
			read(connfd,&rmessage,sizeof(rmessage));

			parse_command(connfd, &rmessage);
			close(connfd);
		}
	}
	catch (std::exception& e)
	{
		printf("[controld] caught std-exception in main-thread %s!\n", e.what());
	}
	catch (...)
	{
	    printf("[controld] caught exception in main-thread!\n");
  	}
}
Ejemplo n.º 9
0
void parse_command(int connfd, CControld::Header * rmessage)
{
	
	if(rmessage->version != CControld::ACTVERSION)
	{
		perror("[controld] wrong version\n");
		return;
	}

	switch (rmessage->cmd)
	{
	case CControld::CMD_SHUTDOWN:
		shutdownBox();
		break;

	case CControld::CMD_SAVECONFIG:
		saveSettings();
		break;

	case CControld::CMD_SETVOLUME:
	case CControld::CMD_SETVOLUME_AVS:
		CControld::commandVolume msg_commandVolume;
		read(connfd, &msg_commandVolume, sizeof(msg_commandVolume));

		if (rmessage->cmd == CControld::CMD_SETVOLUME)
		{
			settings.volume = msg_commandVolume.volume;
			config->setInt32("volume", settings.volume);
			zapit.setVolume(map_volume(msg_commandVolume.volume, false), map_volume(msg_commandVolume.volume, false));
		}
		else
		{
			settings.volume_avs = msg_commandVolume.volume;
			config->setInt32("volume_avs", settings.volume_avs);
			audioControl::setVolume(map_volume(msg_commandVolume.volume, true));
		}
		lcdd.setVolume(msg_commandVolume.volume);
		eventServer->sendEvent(CControldClient::EVT_VOLUMECHANGED, CEventServer::INITID_CONTROLD, &msg_commandVolume.volume, sizeof(msg_commandVolume.volume));
		break;

	case CControld::CMD_MUTE:
		settings.mute = true;
		config->setBool("mute", settings.mute);
		zapit.muteAudio(true);
		lcdd.setMute(true);
		eventServer->sendEvent(CControldClient::EVT_MUTECHANGED, CEventServer::INITID_CONTROLD, &settings.mute, sizeof(settings.mute));
		break;
	case CControld::CMD_MUTE_AVS:
		settings.mute_avs = true;
		config->setBool("mute_avs", settings.mute_avs);
		audioControl::setMute(true);
		lcdd.setMute(true);
		eventServer->sendEvent(CControldClient::EVT_MUTECHANGED, CEventServer::INITID_CONTROLD, &settings.mute_avs, sizeof(settings.mute_avs));
		break;
	case CControld::CMD_UNMUTE:
		settings.mute = false;
		config->setBool("mute", settings.mute);
		zapit.muteAudio(false);
		lcdd.setMute(settings.mute_avs);
		eventServer->sendEvent(CControldClient::EVT_MUTECHANGED, CEventServer::INITID_CONTROLD, &settings.mute_avs, sizeof(settings.mute_avs));
		break;
	case CControld::CMD_UNMUTE_AVS:
		settings.mute_avs = false;
		config->setBool("mute_avs", settings.mute_avs);
		audioControl::setMute(false);
		lcdd.setMute(settings.mute);
		eventServer->sendEvent(CControldClient::EVT_MUTECHANGED, CEventServer::INITID_CONTROLD, &settings.mute, sizeof(settings.mute));
		break;

		case CControld::CMD_SETANALOGMODE:
			CControld::commandAnalogMode msgmd;
			read(connfd, &msgmd, sizeof(msgmd));
			zapit.setAudioMode(msgmd.mode);
			break;
		case CControld::CMD_SETVIDEOFORMAT:
			//printf("[controld] set videoformat\n");
			CControld::commandVideoFormat msg2;
			read(connfd, &msg2, sizeof(msg2));
			setVideoFormat(msg2.format);
			break;
		case CControld::CMD_SETVIDEOOUTPUT:
			//printf("[controld] set videooutput\n");
			CControld::commandVideoOutput msg3;
			read(connfd, &msg3, sizeof(msg3));
			setvideooutput(msg3.output);
			break;
		case CControld::CMD_SETBOXTYPE:
			//printf("[controld] set boxtype\n");    //-------------------dummy!!!!!!!!!!
			CControld::commandBoxType msg4;
			read(connfd, &msg4, sizeof(msg4));
			setBoxType();
			break;
		case CControld::CMD_SETSCARTMODE:
			//printf("[controld] set scartmode\n");
			CControld::commandScartMode msg5;
			read(connfd, &msg5, sizeof(msg5));
			setScartMode(msg5.mode);
			break;
		case CControld::CMD_SETVIDEOPOWERDOWN:
			//printf("[controld] set scartmode\n");
			CControld::commandVideoPowerSave msg10;
			read(connfd, &msg10, sizeof(msg10));
			disableVideoOutput(msg10.powerdown);
			break;

	case CControld::CMD_GETVOLUME:
	case CControld::CMD_GETVOLUME_AVS:
		CControld::responseVolume msg_responseVolume;
		msg_responseVolume.volume = (rmessage->cmd == CControld::CMD_GETVOLUME) ? settings.volume : settings.volume_avs;
		write(connfd, &msg_responseVolume, sizeof(msg_responseVolume));
		break;

	case CControld::CMD_GETMUTESTATUS:
	case CControld::CMD_GETMUTESTATUS_AVS:
		CControld::responseMute msg_responseMute;
		msg_responseMute.mute = (rmessage->cmd == CControld::CMD_GETMUTESTATUS) ? settings.mute : settings.mute_avs;
		write(connfd, &msg_responseMute, sizeof(msg_responseMute));
		break;

		case CControld::CMD_GETVIDEOFORMAT:
			//printf("[controld] get videoformat (fnc)\n");
			CControld::responseVideoFormat msg8;
			msg8.format = settings.videoformat;
			write(connfd,&msg8,sizeof(msg8));
			break;
		case CControld::CMD_GETASPECTRATIO:
			//printf("[controld] get videoformat (fnc)\n");
			CControld::responseAspectRatio msga;
			msga.aspectRatio = aspectRatio;
			write(connfd,&msga,sizeof(msga));
			break;
		case CControld::CMD_GETVIDEOOUTPUT:
			//printf("[controld] get videooutput (fblk)\n");
			CControld::responseVideoOutput msg9;
			msg9.output = settings.videooutput;
			write(connfd,&msg9,sizeof(msg9));
			break;
		case CControld::CMD_GETBOXTYPE:
			//printf("[controld] get boxtype\n");
			CControld::responseBoxType msg0;
			msg0.boxtype = settings.boxtype;
			write(connfd,&msg0,sizeof(msg0));
			break;

		case CControld::CMD_REGISTEREVENT:
			eventServer->registerEvent(connfd);
			break;
		case CControld::CMD_UNREGISTEREVENT:
			eventServer->unRegisterEvent(connfd);
			break;

		default:
			printf("[controld] unknown command\n");
	}
}
Ejemplo n.º 10
0
void setVideoFormat(int format, bool bSaveFormat = true )
{
	int fd;
	int videoDisplayFormat;
	int avsiosfncFormat;
	int wss;

	/*
		16:9 : fnc 1
		4:3  : fnc 2
	*/


	if (bSaveFormat) // only set settings if we dont come from watchdog or video_off
	{
		if (format < 0)
			format=0;
		if (format > 3)
			format=3;

		settings.videoformat = format;
		config->setInt32("videoformat", settings.videoformat);
	}

	if (format==0) // automatic switch
	{
		printf("[controld] setting VideoFormat to auto \n");

		switch ( aspectRatio )
		{
			case 2 :	// 4:3
				format= 2;
				break;
			case 3 :	// 16:9
			case 4 :	// 21,1:1
				format= 1;
				break;
			default:
				format= 2;
				// damits nicht ausgeht beim starten :)
		}
	}

	if ((fd = open("/dev/dbox/avs0",O_RDWR)) < 0)
	{
		perror("open");
		return;
	}

	if (format< 0)
		format= 0;

	avsiosfncFormat = format;
	if (settings.boxtype == CControldClient::BOXTYPE_PHILIPS) // Philips
	{
		switch (format)
		{
			case 1 :
				avsiosfncFormat=2;
				break;
			case 2 :
				avsiosfncFormat=3;
				break;
		}
	}
	if (ioctl(fd,AVSIOSFNC,&avsiosfncFormat)< 0)
	{
		perror("AVSIOSFNC");
		close(fd);
		return;
	}
	close(fd);

	switch( format )
	{
		//	?	case AVS_FNCOUT_INTTV	: videoDisplayFormat = VIDEO_PAN_SCAN;
		case AVS_FNCOUT_EXT169	:
			videoDisplayFormat = VIDEO_CENTER_CUT_OUT;
			wss = SAA_WSS_169F;
			break;
		case AVS_FNCOUT_EXT43	:
			videoDisplayFormat = VIDEO_LETTER_BOX;
			wss = SAA_WSS_43F;
			break;
		default:
			videoDisplayFormat = VIDEO_LETTER_BOX;
			wss = SAA_WSS_43F;
			break;
			//	?	case AVS_FNCOUT_EXT43_1	: videoDisplayFormat = VIDEO_PAN_SCAN;
	}

	zapit.setDisplayFormat((int)videoDisplayFormat);

	if ( (fd = open(SAA7126_DEVICE,O_RDWR)) < 0)
	{
		perror("open " SAA7126_DEVICE);
		return;
	}

	ioctl(fd,SAAIOSWSS,&wss);
	close(fd);
}
Ejemplo n.º 11
0
int main (int argc, char** argv)
{
	int i;
	uint32_t j;
	uint32_t k;

	int bouquet = -1;
	unsigned int channel = 0;
	unsigned int count;
	int diseqcRepeats = -1;
	int diseqcType = -1;
	int satmask = 0;
	int audio = 0;
	int mute = -1;
	int volume = -1;
	int nvod = -1;
	int fastzap = -1;
	t_channel_id zapsid = 0;
	const char * channelName = NULL;

	bool playback = false;
	bool recordmode = false;
	bool radio = false;
	bool reload = false;
	bool register_neutrino = false;
	bool savebouquets = false;
	bool show_satellites = false;
        bool set_pal = false;
        bool set_ntsc = false;
	bool scan = false;
	bool zapByName = false;
	bool rezap = false;
	bool killzapit = false;
	bool savezapit = false;
	bool enterStandby = false;
	bool leaveStandby = false;
	bool sendMotorCommand = false;
#ifdef HAVE_DBOX_HARDWARE
	bool Iecon = false;
	bool Iecoff = false;
	bool Iecstate = false;
	bool pes = false;
	bool spts = false;
	bool decmode = false;
#endif
#ifdef HAVE_TRIPLEDRAGON
	bool zoom = false;
	int zoomlevel = 0;
	bool pig = false;
	bool avinfo = false;
	int pig_x = 0;
	int pig_y = 0;
	int pig_w = 0;
	int pig_h = 0;
	int pig_a = 0;
#endif
	bool getchannel = false;
	bool getmode = false;
	bool getpids = false;
	bool includeBouquetOthers = false;
	bool getserviceinfo = false;
	uint8_t motorCmdType = 0;
	uint8_t motorCmd = 0;
	uint8_t motorNumParameters = 0;
	uint8_t motorParam1 = 0;
	uint8_t motorParam2 = 0;
	uint8_t motorAddr = 0;
	uint32_t diseqc[5];
	unsigned int tmp;

	/* command line */
	for (i = 1; i < argc; i++)
	{
		if (!strncmp(argv[i], "-a", 2))
		{
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%d", &audio);
				continue;
			}
		}
		else if (!strncmp(argv[i], "-dr", 3))
		{
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%d", &diseqcRepeats);
				continue;
			}
		}
		else if (!strncmp(argv[i], "-dt", 3))
		{
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%d", &diseqcType);
				continue;
			}
		}
		else if (!strncmp(argv[i], "-c", 2))
		{
			reload = true;
			continue;
		}
		else if (!strncmp(argv[i], "-gm", 3))
		{
			getmode = true;
			continue;
		}
		else if (!strncmp(argv[i], "-gi", 3))
		{
			getchannel = true;
			continue;
		}
		else if (!strncmp(argv[i], "-rz", 3))
		{
			rezap = true;
			continue;
		}
		else if (!strncmp(argv[i], "-zi", 3))
		{
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%llx", &zapsid);
				continue;
			}
		}
		else if (!strncmp(argv[i], "-esb", 4))
		{
			enterStandby = true;
			continue;
		}
		else if (!strncmp(argv[i], "-kill", 5))
		{
			killzapit = true;
			continue;
		}
		else if (!strncmp(argv[i], "-lsb", 4))
		{
			leaveStandby = true;
			continue;
		}
		else if (!strncmp(argv[i], "-motor", 6))
		{
			if (i < argc - 6)
			{
				sscanf(argv[++i], "%x", &tmp);
				motorCmdType = tmp;
				sscanf(argv[++i], "%x", &tmp);
				motorAddr = tmp;
				sscanf(argv[++i], "%x", &tmp);
				motorCmd = tmp;
				sscanf(argv[++i], "%x", &tmp);
				motorNumParameters = tmp;
				sscanf(argv[++i], "%x", &tmp);
				motorParam1 = tmp;
				sscanf(argv[++i], "%x", &tmp);
				motorParam2 = tmp;
				printf("[pzapit] motor command = %x %x %x %x %x %x\n", motorCmdType, motorAddr, motorCmd, motorNumParameters, motorParam1, motorParam2);
				sendMotorCommand = true;
				continue;
			}
		}
		else if (!strncmp(argv[i], "-rn", 3))
		{
			register_neutrino = true;
			continue;
		}
		else if (!strncmp(argv[i], "-mute", 5))
		{
			mute = 1;
			continue;
		}
		else if (!strncmp(argv[i], "-nvod", 5))
		{
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%d", &nvod);
				continue;
			}
		}
		else if (!strncmp(argv[i], "-n", 2))
		{
			if (i < argc - 1)
			{
				zapByName = true;
				channelName = argv[++i];
				continue;
			}
		}
		else if (!strncmp(argv[i], "-p", 2))
		{
			playback = true;
			continue;
		}
		else if (!strncmp(argv[i], "-ra", 3))
		{
			radio = true;
			continue;
		}
		else if (!strncmp(argv[i], "-re", 3))
		{
			recordmode = true;
			continue;
		}
		// don't change order with "-sb" or the other will always be found first
		else if (!strncmp(argv[i], "-sbo", 4))
		{
			savebouquets = true;
			includeBouquetOthers = true;
			continue;
		}
		else if (!strncmp(argv[i], "-sb", 3))
		{
			savebouquets = true;
			continue;
		}
		else if (!strncmp(argv[i], "-se", 3))
		{
			if (i < argc - 2)
			{
				sscanf(argv[++i], "%d", &satmask);
				diseqc[0] = strlen(argv[i+1]);
				for (i++, j = 0; j <= diseqc[0]; j++)
				{
					diseqc[j+1] = argv[i][j] - 48;
				}
				continue;
			}
		}
		else if (!strncmp(argv[i], "-sh", 3))
		{
			show_satellites = true;
			continue;
		}
		else if (!strncmp(argv[i], "-st", 3))
		{
			scan = true;
			continue;
		}
                else if (!strncmp(argv[i], "--pal", 4))
                {
                        set_pal = true;
                        continue;
                }

                else if (!strncmp(argv[i], "--ntsc", 5))
                {
                        set_ntsc = true;
                        continue;
                }
		else if (!strncmp(argv[i], "-unmute", 7))
		{
			mute = 0;
			continue;
		}
#ifdef HAVE_DBOX_HARDWARE
                else if (!strncmp(argv[i], "--iecon", 7))
                {
                        Iecon = true;
                        continue;
                }
                else if (!strncmp(argv[i], "--iecoff", 8))
                {
                        Iecoff = true;
                        continue;
                }
                else if (!strncmp(argv[i], "--iecstate", 10))
                {
                        Iecstate = true;
                        continue;
                }
                else if (!strncmp(argv[i], "--pes", 5))
                {
                        pes = true;
                        continue;
                }
                else if (!strncmp(argv[i], "--spts", 6))
                {
                        spts = true;
                        continue;
                }
                else if (!strncmp(argv[i], "--decmode", 9))
                {
                        decmode = true;
                        continue;
                }
#endif
#ifdef HAVE_TRIPLEDRAGON
		else if (!strncmp(argv[i], "--zoom", 6))
		{
			zoom = true;
			if (i < argc - 1) {
				sscanf(argv[++i], "%d", &zoomlevel);
			}
			continue;
		}
		else if (!strncmp(argv[i], "--pig", 5))
		{
			pig = true;
			if (i < argc - 1) {
				sscanf(argv[++i], "%d", &pig_x);
			}
			if (i < argc - 1) {
				sscanf(argv[++i], "%d", &pig_y);
			}
			if (i < argc - 1) {
				sscanf(argv[++i], "%d", &pig_w);
			}
			if (i < argc - 1) {
				sscanf(argv[++i], "%d", &pig_h);
			}
			if (i < argc - 1) {
				sscanf(argv[++i], "%d", &pig_a);
			}
			continue;
		}
		else if (!strncmp(argv[i], "--avinfo", 6))
		{
			avinfo = true;
			continue;
		}
#endif
		else if (!strncmp(argv[i], "-vol", 4))
		{
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%d", &volume);
				continue;
			}
		}
		else if (!strncmp(argv[i], "--fastzap", 9))
		{
			if (i < argc - 1)
			{
				sscanf(argv[++i], "%d", &fastzap);
				continue;
			}
		}
		else if (!strncmp(argv[i], "--getpids", 9))
		{
			getpids = true;
			continue;
		}
		else if (!strncmp(argv[i], "-gsi", 4))
		{
			getserviceinfo = true;
			continue;
		}
		else if (!strncmp(argv[i], "-save", 5))
		{
			savezapit = true;
			continue;
		}
		else if (i < argc - 1)
		{
			if ((sscanf(argv[i], "%d", &bouquet) > 0) && (sscanf(argv[++i], "%u", &channel) > 0))
				continue;
		}
		else if (sscanf(argv[i], "%d", &bouquet) > 0)
			continue;

		return usage(argv[0]);
	}

	/* create zapit client */
	CZapitClient zapit;

	/* send diseqc 1.2 motor command */
	if (sendMotorCommand)
	{
		zapit.sendMotorCommand(motorCmdType, motorAddr, motorCmd, motorNumParameters, motorParam1, motorParam2);
	}
	
	/* kill zapit*/
	if (killzapit)
	{
		zapit.shutdown();
		std::cout << "zapit shot down :)" << std::endl;
		return 0;
	}

	if (enterStandby)
	{
		zapit.setStandby(true);
		return 0;
	}

	if (leaveStandby)
	{
		zapit.setStandby(false);
		return 0;
	}

	if (fastzap > -1)
	{
		zapit.setFastZap(fastzap != 0);
		return 0;
	}

	if (getmode)
	{
		int mode = zapit.getMode(); // 1 = TV, 2 = Radio
		std::cout << "Mode: " << mode;
		if (mode == CZapitClient::MODE_TV)
			std::cout << " (TV)" << std::endl;
		else if (mode == CZapitClient::MODE_RADIO)
			std::cout << " (Radio)" << std::endl;
		else
			std::cout << " (unknown!)" << std::endl;
		return mode;
	}

	if (getchannel)
	{
		int mode = zapit.getMode();
		if (mode == CZapitClient::MODE_STANDBY)
		{
			std::cerr << "zapit is in standby mode, no channel active." << std::endl;
			return 1;
		}
		t_channel_id c = zapit.getCurrentServiceID();
		printf("%llx (%s)\n", c, (zapit.getChannelName(c)).c_str());
		return 0;
	}

	if (rezap)
	{
		zapit.ReZap();
		return 0;
	}

	/* audio mute */
	if (mute != -1)
	{
		std::cout << "mute/unmute" << std::endl;
		zapit.muteAudio(mute);
		return 0;
	}

	if (volume != -1)
	{
		std::cout << "set volume" << std::endl;
		zapit.setVolume(volume, volume);
		return 0;
	}

#ifdef HAVE_DBOX_HARDWARE
	if (Iecon)
	{
		std::cout << "Iec on" << std::endl;
		zapit.IecOn();
		return 0;
	}
	if (Iecoff)
	{
		std::cout << "Iec off" << std::endl;
		zapit.IecOff();
		return 0;
	}
	if (Iecstate)
	{
		std::cout << "Iec state = " << zapit.IecState() << std::endl;
		return 0;
	}

	if (pes)
	{
		std::cout << "set decoder to PES mode" << std::endl;
		zapit.PlaybackPES();
		return 0;
	}
	if (spts)
	{
		std::cout << "set decoder to SPTS mode" << std::endl;
		zapit.PlaybackSPTS();
		return 0;
	}
	if (decmode)
	{
		std::cout << "decoder mode = " << zapit.PlaybackState() << std::endl;
		return 0;
	}
#endif
#ifdef HAVE_TRIPLEDRAGON
	if (zoom)
	{
		if (zoomlevel > 0)
			zapit.setZoom(zoomlevel);
		std::cout << "zoom = " << zapit.getZoom() << "%" << std::endl;
		return 0;
	}
	if (pig)
	{
		zapit.setPIG(pig_x, pig_y, pig_w, pig_h, !!pig_a);
		std::cout << "pig = " << pig_x << "." << pig_y << "." << pig_w << "." << pig_h << ":" << pig_a << std::endl;
		return 0;
	}
	if (avinfo)
	{
		AVInfo v = zapit.getAVInfo();
		std::cout << "h_size = " << v.vinfo.h_size << " v_size = " << v.vinfo.v_size << " ar = " << v.vinfo.pel_aspect_ratio << " rate = " << v.vinfo.frame_rate << std::endl;
		printf("atype = %d astatus0 = 0x%08x astatus1 = 0x%08x\n", v.atype, v.astatus.word00, v.astatus.word01);
		return 0;
	}
#endif
	/* reload services */
	if (reload)
	{
		std::cout << "reloading channels" << std::endl;
		zapit.reinitChannels();
		return 0;
	}

	if (register_neutrino)
	{
#define NEUTRINO_UDS_NAME "/tmp/neutrino.sock"
		std::cout << "registering neutrino" << std::endl;
		for (i = CZapitClient::FIRST_EVENT_MARKER; i < CZapitClient::LAST_EVENT_MARKER; i++)
			zapit.registerEvent(i, 222, NEUTRINO_UDS_NAME);
		return 0;
	}

	if (diseqcType != -1)
	{
		zapit.setDiseqcType((diseqc_t) diseqcType);

		if (diseqcRepeats == -1)
			return 0;
	}

	if (diseqcRepeats != -1)
	{
		zapit.setDiseqcRepeat(diseqcRepeats);
		return 0;
	}

	if (playback)
	{
		if (zapit.isPlayBackActive())
			zapit.stopPlayBack();
		else
			zapit.startPlayBack();

		if (!recordmode)
			return 0;
	}

	if (recordmode)
	{
		zapit.setRecordMode(!zapit.isRecordModeActive());
		return 0;
	}

	if (savebouquets)
	{
		zapit.saveBouquets(includeBouquetOthers);
		return 0;
	}

	if (show_satellites)
	{
		std::vector<CZapitClient::responseGetSatelliteList> satelliteList;
		zapit.getScanSatelliteList(satelliteList);

		std::vector<CZapitClient::responseGetSatelliteList>::const_iterator rI;
		for (i = 0, rI = satelliteList.begin(); rI != satelliteList.end(); i++, rI++)
			std::cout << (1 + i) << ": " << rI->satName << std::endl;

		return 0;
	}
	else if (satmask != 0)
	{
		std::vector<CZapitClient::responseGetSatelliteList> satelliteList;
		zapit.getScanSatelliteList(satelliteList);

		std::vector<CZapitClient::commandSetScanSatelliteList> newSatelliteList;
		CZapitClient::commandSetScanSatelliteList item;

		for (i = 1, j = 0, k = 0; j < satelliteList.size(); i = (i << 1), k++)
		{
			if (satmask & i)
			{
				j++;
				std::cout << "diseqc " << diseqc[j] << ": " << satelliteList[k].satName << std::endl;

				strcpy(item.satName, satelliteList[k].satName);
				item.diseqc = diseqc[j];
				newSatelliteList.push_back(item);
			}

			if ((j >= diseqc[0]) || (k >= satelliteList.size()))
			{
				break;
			}
		}

		zapit.setScanSatelliteList(newSatelliteList);

		return 0;
	}

	/* transponderscan */
	if (scan)
	{
		unsigned int satellite;
		unsigned int processed_transponder;
		unsigned int transponder;
		unsigned int services;
		
		zapit.startScan(1);

		while (zapit.isScanReady(satellite, processed_transponder, transponder, services) == false)
		{
			std::cout << "satellite: " << satellite << ", transponder: " << processed_transponder <<", of: " << transponder << ", services: " << services << std::endl;
			sleep(1);
		}

		return 0;
	}

	if (set_pal)
	{
		zapit.stopPlayBack();
		zapit.setVideoSystem_a(PAL);
		zapit.startPlayBack();
		return 0;
	}

	if (set_ntsc)
	{
		zapit.stopPlayBack();
		zapit.setVideoSystem_a(NTSC);
		zapit.startPlayBack();
		return 0;
	}

	/* set audio channel */
	if (audio)
	{
		zapit.setAudioChannel(audio - 1);
		return 0;
	}

	if (nvod != -1)
	{
		zapit.zaptoNvodSubService(nvod);
		return 0;
	}

	if (getpids)
	{	
		CZapitClient::responseGetPIDs pids;
		zapit.getPIDS(pids);

		if (pids.PIDs.vpid)
			std::cout << "   video: 0x" << std::hex << pids.PIDs.vpid << std::endl;

		if (pids.PIDs.ecmpid) 
			std::cout << "  ecmpid: 0x" << std::hex << pids.PIDs.ecmpid << std::endl;

		if (pids.PIDs.vtxtpid)
			std::cout << "teletext: 0x" << std::hex << pids.PIDs.vtxtpid << std::endl;

		if (pids.PIDs.pcrpid)
			std::cout << "     pcr: 0x" << std::hex << pids.PIDs.pcrpid << std::endl;

		if (pids.PIDs.pmtpid)
			std::cout << "     pmt: 0x" << std::hex << pids.PIDs.pmtpid << std::endl;

		if (pids.PIDs.privatepid)
			std::cout << " private: 0x" << std::hex << pids.PIDs.privatepid << std::endl;

		for (count = 0; count < pids.APIDs.size(); count++)
		{
			if (count == pids.PIDs.selected_apid)
				std::cout << "*";
			else 
				std::cout << " ";
	
			std::cout << "audio " << std::dec << count + 1 << ": 0x" << std::hex << pids.APIDs[count].pid << " (" << pids.APIDs[count].desc;
			if (pids.APIDs[count].is_ac3)
				std::cout << ", ac3";
			std::cout << ")" << std::endl;
		}

		for (count = 0 ; count < pids.SubPIDs.size() ; count++)
		{
			if (pids.SubPIDs[count].pid != pids.PIDs.vtxtpid) {
				std::cout << "DVB-Sub "
					<< std::dec << count + 1 
                                	<< ": 0x" << std::hex << pids.SubPIDs[count].pid
                                	<< " (" << pids.SubPIDs[count].desc << ")"
                                	<< std::endl;
			} else {
				std::cout << "TTX-Sub "
					<< std::dec << count + 1
					<< ": " << pids.SubPIDs[count].composition_page
                                	<< " (" << pids.SubPIDs[count].desc << ")"
                                	<< std::endl;
			}
		}
		return 0;
	}

	if (getserviceinfo)
	{	
		CZapitClient::CCurrentServiceInfo si;
		si = zapit.getCurrentServiceInfo();

		printf("frequency = %d.%d MHz", si.tsfrequency/1000, si.tsfrequency%1000);

		if (si.polarisation != 2) /* only satellite has polarisation */
		{
			printf(" (%c)\n", (si.polarisation == HORIZONTAL) ? 'h' : 'v');
			//satellite
			printf("diseqc = %d\n", si.diseqc);
		}
		else
		{
			printf("\n");
		}
		printf("onid = 0x%04x\n", si.onid);
		printf("sid = 0x%04x\n", si.sid);
		printf("tsid = 0x%04x\n", si.tsid);
		printf("pmtpid = 0x%04x\n", si.pmtpid);
		printf("vpid = 0x%04x\n", si.vpid);
		printf("apid = 0x%04x\n", si.apid);
		printf("spid = 0x%04x\n", si.spid);
		printf("spage = 0x%04x\n", si.spage);
		printf("pcrpid = 0x%04x\n", si.pcrpid);
		printf("vtxtpid = 0x%04x\n", si.vtxtpid);
		return 0;
	}

	/* save zapit*/
	if (savezapit)
	{
		zapit.saveSettings();
		std::cout << "zapit settings saved" << std::endl;
		return 0;
	}

	/* if we got here, we want to zap by name, bouquet / number or onidsid */

	/* choose source mode */
	zapit.setMode(radio ? CZapitClient::MODE_RADIO : CZapitClient::MODE_TV);

	if (zapsid > 0)
	{
		printf("Zapping to: %llx (%s) ", zapsid, (zapit.getChannelName(zapsid)).c_str());
		tmp = zapit.zapTo_serviceID(zapsid);
		if (!tmp)
			printf("failed");
		printf("\n");
		return tmp;
	}

	std::vector<CZapitClient::responseGetBouquetChannels> channels;

	if (zapByName)
	{
		zapit.getChannels(channels);

		std::vector<CZapitClient::responseGetBouquetChannels>::const_iterator ch_resp;
		for (ch_resp = channels.begin(), channel = 1; ch_resp != channels.end(); ch_resp++, channel++)
		{
			if (!strcasecmp(ch_resp->name, channelName))
			{
				std::cout << "found channel number: " << channel << std::endl;
				goto channel_found;
			}
		}
		std::cout << "channel not found." << std::endl;
		return 0;
	}
	else /* zap by bouquet number and channel number */
	{
		/* read channel list */
		if (bouquet != -1)
			zapit.getBouquetChannels(bouquet - 1, channels);

		/* display bouquet list */
		else
		{
			std::vector<CZapitClient::responseGetBouquets> bouquets;
			std::vector<CZapitClient::responseGetBouquets>::const_iterator b_resp;

			zapit.getBouquets(bouquets, false);

			for (b_resp = bouquets.begin(); b_resp != bouquets.end(); b_resp++)
				std::cout << (b_resp->bouquet_nr + 1) << ": " << b_resp->name << std::endl;

			return 0;
		}

		/* display channel list */
		if (!channel)
		{
			std::vector<CZapitClient::responseGetBouquetChannels>::const_iterator ch_resp;
			for (ch_resp = channels.begin(), channel = 1; ch_resp != channels.end(); ch_resp++, channel++)
				std::cout << channel << ": " << ch_resp->name << std::endl;
			return 0;
		}
	}

	/* zap */
	if (channel > channels.size())
	{
		std::cout << "Only " << channels.size() << " channels in bouquet " << bouquet << std::endl;
		return 0;
	}

channel_found:
	zapit.zapTo(channels[channel-1].nr);
	std::cout << "zapped to " << channels[channel-1].name << std::endl;

	return 0;
}
Ejemplo n.º 12
0
/* too many subtle differences between old and new API, so i just have this
   code twice - much more readable than putting #ifdefs all over the place
 */
#ifndef HAVE_TRIPLEDRAGON
#if HAVE_DVB_API_VERSION >= 3
void *CEventWatchDog::watchdogThread(void *arg)
{
	const char *verb_aratio[] = { "4:3", "16:9", "2.21:1" };

	CEventWatchDog *WatchDog = (CEventWatchDog *)arg;
	int fd_ev = -1, fd_video;

	while (true)
	{
#if defined HAVE_DBOX_HARDWARE || defined HAVE_DREAMBOX_HARDWARE || defined HAVE_IPBOX_HARDWARE
#define _DEVNUM 2
		struct pollfd pfd[2];
		fd_ev = open(EVENT_DEVICE, O_RDWR|O_NONBLOCK);
		if (fd_ev < 0)
		{
			perror("[controld] " EVENT_DEVICE);
			pthread_exit(NULL);
		}

		if (ioctl(fd_ev, EVENT_SET_FILTER, EVENT_VCR_CHANGED) < 0) {
			perror("[controld] EVENT_SET_FILTER");
			close(fd_ev);
			pthread_exit(NULL);
		}
		pfd[1].fd = fd_ev;
		pfd[1].events = POLLIN;
#else
#define _DEVNUM 1
		struct pollfd pfd[1];
#endif
		fd_video = open(VIDEO_DEVICE, O_RDONLY|O_NONBLOCK);
		if (fd_video < 0)
		{
			perror("[controld] " VIDEO_DEVICE);
			if (fd_ev >= 0)
				close(fd_ev);
			pthread_exit(NULL);
		}

		pfd[0].fd = fd_video;
		pfd[0].events = POLLPRI;

		while (poll(pfd, _DEVNUM, -1) > 0) {
#if defined HAVE_DBOX_HARDWARE || defined HAVE_DREAMBOX_HARDWARE || defined HAVE_IPBOX_HARDWARE
			if (pfd[1].revents & POLLIN) {
				struct event_t event;
				while (read(fd_ev, &event, sizeof(event)) == sizeof(event)) {
					if (event.event == EVENT_VCR_CHANGED) {
						int newVCRMode = WatchDog->getVCRMode();
						if ((newVCRMode != WatchDog->VCRMode)) {
							pthread_mutex_lock( &WatchDog->wd_mutex );

							WatchDog->VCRMode = newVCRMode;
							WatchDog->vcrModeChanged( newVCRMode );

							if(newVCRMode > 0)
							{
								//Set Aspect ratio of scart input signal (1->4:3 / 2->16:9)
								// vcr AR is saved in Bit 8-15, DVB AR is saved in bits 0-7
								WatchDog->VideoMode = (WatchDog->VideoMode & 0xFF) | ((newVCRMode-1) << 8);
								WatchDog->videoModeChanged(WatchDog->VideoMode);
							}
							pthread_mutex_unlock( &WatchDog->wd_mutex );
						}
					}
				}
			}
#endif
			if (pfd[0].revents & POLLPRI) {
				struct video_event event;

				if (ioctl(fd_video, VIDEO_GET_EVENT, &event) == -1) {
					perror("[controld] VIDEO_GET_EVENT");
				}
				else if (event.type == VIDEO_EVENT_SIZE_CHANGED) {
					printf("[controld] VIDEO_EVENT_SIZE_CHANGED %ux%u (%s -> %s)\n",
							event.u.size.w,
							event.u.size.h,
							verb_aratio[WatchDog->VideoMode&3],
							verb_aratio[event.u.size.aspect_ratio]);

					// DVB AR is saved in Bites 0-7
					if ((WatchDog->VideoMode & 0xFF) != event.u.size.aspect_ratio) {
						pthread_mutex_lock(&WatchDog->wd_mutex);
						WatchDog->VideoMode = (WatchDog->VideoMode & 0xFF00 ) | event.u.size.aspect_ratio;
						WatchDog->videoModeChanged(WatchDog->VideoMode);
						pthread_mutex_unlock(&WatchDog->wd_mutex);
					}
				}
			}
		}
		perror("[CONTROLD] eventwatchdog poll()");

		close(fd_video);
		if (fd_ev >= 0)
			close(fd_ev);
		sleep(1);
	}
	pthread_exit(NULL);
}
#else	/* old API -> dreambox */
void *CEventWatchDog::watchdogThread(void *arg)
{
#if defined HAVE_DBOX_HARDWARE || defined HAVE_DREAMBOX_HARDWARE || defined HAVE_IPBOX_HARDWARE
	char *verb_aratio[] = { "4:3", "16:9", "2.21:1" };

	CEventWatchDog *WatchDog = (CEventWatchDog *)arg;
	int fd_ev;

	while (true)
	{
		if ((fd_ev = open(EVENT_DEVICE, O_RDWR | O_NONBLOCK)) < 0) {
			perror("[controld] " EVENT_DEVICE);
			pthread_exit(NULL);
		}

		if (ioctl(fd_ev, EVENT_SET_FILTER, EVENT_VCR_CHANGED | EVENT_ARATIO_CHANGE) < 0) {
			perror("[controld] EVENT_SET_FILTER");
			close(fd_ev);
			pthread_exit(NULL);
		}

		CZapitClient zapit;
		struct pollfd pfd[1];
		pfd[0].fd = fd_ev;
		pfd[0].events = POLLIN;
#if 0
		int pollret;
		while ((pollret = poll(pfd, 1, 2500)) >= 0) {
			if (pollret == 0) {
				if (WatchDog->getVideoMode() & 0x100) {
					printf("[controld] possible hang of mpeg decoder detected\n");
					if (zapit.isPlayBackActive()) {
						zapit.stopPlayBack();
						usleep(200000); //stopPlayBack is not blocking :-(
						zapit.startPlayBack();
					}
				}
			}
#endif
		while (poll(pfd, 1, -1) >= 0) {
			if (!(pfd[0].revents & POLLIN))
				continue;
			struct event_t event;
			while (read(fd_ev, &event, sizeof(event)) == sizeof(event)) {
				if (event.event == EVENT_VCR_CHANGED) {
					int newVCRMode = WatchDog->getVCRMode();
					if (newVCRMode == WatchDog->VCRMode)
						continue;
					pthread_mutex_lock( &WatchDog->wd_mutex );
					WatchDog->VCRMode = newVCRMode;
					WatchDog->vcrModeChanged( newVCRMode );

					if(newVCRMode > 0) {
						//Set Aspect ratio of scart input signal (1->4:3 / 2->16:9)
						// vcr AR is saved in Bit 8-15, DVB AR is saved in bits 0-7
						WatchDog->VideoMode = (WatchDog->VideoMode & 0xFF) | ((newVCRMode-1) << 8);
						WatchDog->videoModeChanged(WatchDog->VideoMode);
					}
					pthread_mutex_unlock( &WatchDog->wd_mutex );
				} else if (event.event == EVENT_ARATIO_CHANGE) {
					int aspect = WatchDog->getVideoMode();
					if ((WatchDog->VideoMode & 0xFF) != aspect) {
						printf("[controld] aspect ratio changed %u -> %u (%s -> %s)\n",
							(WatchDog->VideoMode & 0xFF), aspect,
							verb_aratio[WatchDog->VideoMode&3],
							verb_aratio[aspect]);
						pthread_mutex_lock(&WatchDog->wd_mutex);
						WatchDog->VideoMode = (WatchDog->VideoMode & 0xFF00) | aspect;
						WatchDog->videoModeChanged(WatchDog->VideoMode);
						pthread_mutex_unlock(&WatchDog->wd_mutex);
					}
				} else {
					printf("[controld] unknown event: 0x%02x\n", event.event);
				}
			}
		}
		perror("[CONTROLD] eventwatchdog poll()");

		close(fd_ev);
		sleep(1);
	}
	pthread_exit(NULL);
#endif
	return NULL;
}
#endif
#else /* TRIPLEDRAGON */
void *CEventWatchDog::watchdogThread(void *arg)
{
	const char *verb_aratio[] = { "4:3", "16:9", "2.21:1", "unknown" };

	CEventWatchDog *WatchDog = (CEventWatchDog *)arg;

	while (true)
	{
		sleep(1);
		int newVCRMode = WatchDog->getVCRMode();
		if (newVCRMode != WatchDog->VCRMode)
		{
			printf("[controld] VCR SCART PIN8 changed from %dV to %dV\n", WatchDog->VCRMode * 6, newVCRMode * 6);
			pthread_mutex_lock( &WatchDog->wd_mutex );
			WatchDog->VCRMode = newVCRMode;
			WatchDog->vcrModeChanged( newVCRMode );

			if(newVCRMode > 0) {
				//Set Aspect ratio of scart input signal (1->4:3 / 2->16:9)
				// vcr AR is saved in Bit 8-15, DVB AR is saved in bits 0-7
				WatchDog->VideoMode = (WatchDog->VideoMode & 0xFF) | ((newVCRMode-1) << 8);
				WatchDog->videoModeChanged(WatchDog->VideoMode);
			}
			pthread_mutex_unlock( &WatchDog->wd_mutex );
		}
		int aspect = WatchDog->getVideoMode();
		if ((WatchDog->VideoMode & 0xFF) != aspect) {
			printf("[controld] aspect ratio changed %u -> %u (%s -> %s)\n",
				(WatchDog->VideoMode & 0xFF), aspect,
				verb_aratio[WatchDog->VideoMode&3],
				verb_aratio[aspect]);
			pthread_mutex_lock(&WatchDog->wd_mutex);
			WatchDog->VideoMode = (WatchDog->VideoMode & 0xFF00) | aspect;
			WatchDog->videoModeChanged(WatchDog->VideoMode);
			pthread_mutex_unlock(&WatchDog->wd_mutex);
		}
	}

	pthread_exit(NULL);
}
#endif

void CEventWatchDog::registerNotifier( uint watchdogEvent, CEventWatchdogNotifier* notifier )
{
	if (bThreadRunning)
		pthread_mutex_lock( &wd_mutex );

	Notifiers.find(watchdogEvent)->second->insert( Notifiers.find(watchdogEvent)->second->end(), notifier);

	if (watchdogEvent== WDE_VIDEOMODE)
	{
		videoModeChanged( getVideoMode() );
	}
	if (watchdogEvent== WDE_VCRONOFF)
	{
		vcrModeChanged( getVCRMode() );
	}

	if (bThreadRunning)
		pthread_mutex_unlock( &wd_mutex );

	if (!bThreadRunning)
		startThread();
}

void CEventWatchDog::unregisterNotifier( uint watchdogEvent, CEventWatchdogNotifier* notifier )
{
	if (bThreadRunning)
		pthread_mutex_lock( &wd_mutex );

	EventWatchdogNotifiers* notifiers = Notifiers.find(watchdogEvent)->second;
	EventWatchdogNotifiers::iterator it;
	for (it=notifiers->end(); it>=notifiers->begin(); it--)
	{
		if (*it == notifier)
		{
			notifiers->erase(it);
		}
	}

	if (bThreadRunning)
		pthread_mutex_unlock( &wd_mutex );
}