Ejemplo n.º 1
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.º 2
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.º 3
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.º 4
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 );
}