⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dvb_tune.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
			break;#ifdef DVB_ATSC			case FE_ATSC:			mp_msg(MSGT_DEMUX, MSGL_V, "Event:  Frequency: %d\n",feparams->frequency);			mp_msg(MSGT_DEMUX, MSGL_V, "        Modulation: %d\n",feparams->u.vsb.modulation);			break;#endif			default:			break;		}		}		strength=0;		if(ioctl(fd_frontend,FE_READ_BER,&strength) >= 0)		mp_msg(MSGT_DEMUX, MSGL_V, "Bit error rate: %d\n",strength);		strength=0;		if(ioctl(fd_frontend,FE_READ_SIGNAL_STRENGTH,&strength) >= 0)		mp_msg(MSGT_DEMUX, MSGL_V, "Signal strength: %d\n",strength);		strength=0;		if(ioctl(fd_frontend,FE_READ_SNR,&strength) >= 0)		mp_msg(MSGT_DEMUX, MSGL_V, "SNR: %d\n",strength);		strength=0;		if(ioctl(fd_frontend,FE_READ_UNCORRECTED_BLOCKS,&strength) >= 0)		mp_msg(MSGT_DEMUX, MSGL_V, "UNC: %d\n",strength);				print_status(festatus);	}	else	{		mp_msg(MSGT_DEMUX, MSGL_ERR, "Not able to lock to the signal on the given frequency\n");		return -1;	}	return 0;}#elsestatic int check_status(int fd_frontend,FrontendParameters* feparams,int tuner_type,uint32_t base){	int i,res;	int32_t strength;	fe_status_t festatus;	FrontendEvent event;		struct pollfd pfd[1];	while(1)	{	    if(ioctl(fd_frontend, FE_GET_EVENT, &event) == -1)	    break;	}	i = 0; res = -1;	while ((i < 3) && (res < 0))	{		if (ioctl(fd_frontend,FE_SET_FRONTEND,feparams) < 0)		{			mp_msg(MSGT_DEMUX, MSGL_ERR, "ERROR tuning channel\n");			return -1;		}		pfd[0].fd = fd_frontend;		pfd[0].events = POLLIN | POLLPRI;		if(poll(pfd,1,10000) > 0)		{			if (pfd[0].revents & POLLPRI)			{				mp_msg(MSGT_DEMUX, MSGL_V, "Getting frontend event\n");				if ( ioctl(fd_frontend, FE_GET_EVENT, &event) < 0)				{					mp_msg(MSGT_DEMUX, MSGL_ERR, "FE_GET_EVENT");					return -1;				}				mp_msg(MSGT_DEMUX, MSGL_V, "Received ");				switch(event.type)				{					case FE_UNEXPECTED_EV:					mp_msg(MSGT_DEMUX, MSGL_V, "unexpected event\n");					res = -1;					break;					case FE_FAILURE_EV:					mp_msg(MSGT_DEMUX, MSGL_V, "failure event\n");					res = -1;					break;					case FE_COMPLETION_EV:					mp_msg(MSGT_DEMUX, MSGL_V, "completion event\n");					res = 0;					break;				}			}			i++;		}	}	if (res > 0)	switch (event.type)	{		case FE_UNEXPECTED_EV: mp_msg(MSGT_DEMUX, MSGL_V, "FE_UNEXPECTED_EV\n");			break;		case FE_COMPLETION_EV: mp_msg(MSGT_DEMUX, MSGL_V, "FE_COMPLETION_EV\n");			break;		case FE_FAILURE_EV: mp_msg(MSGT_DEMUX, MSGL_V, "FE_FAILURE_EV\n");			break;	}	if (event.type == FE_COMPLETION_EV)	{		switch(tuner_type)		{			case FE_OFDM:			mp_msg(MSGT_DEMUX, MSGL_V, "Event:  Frequency: %d\n",event.u.completionEvent.Frequency);			break;			case FE_QPSK:			mp_msg(MSGT_DEMUX, MSGL_V, "Event:  Frequency: %d\n",(unsigned int)((event.u.completionEvent.Frequency)+base));			mp_msg(MSGT_DEMUX, MSGL_V, "        SymbolRate: %d\n",event.u.completionEvent.u.qpsk.SymbolRate);			mp_msg(MSGT_DEMUX, MSGL_V, "        FEC_inner:  %d\n",event.u.completionEvent.u.qpsk.FEC_inner);			mp_msg(MSGT_DEMUX, MSGL_V, "\n");			break;			case FE_QAM:			mp_msg(MSGT_DEMUX, MSGL_V, "Event:  Frequency: %d\n",event.u.completionEvent.Frequency);			mp_msg(MSGT_DEMUX, MSGL_V, "        SymbolRate: %d\n",event.u.completionEvent.u.qpsk.SymbolRate);			mp_msg(MSGT_DEMUX, MSGL_V, "        FEC_inner:  %d\n",event.u.completionEvent.u.qpsk.FEC_inner);			break;			default:			break;		}		strength=0;		if(ioctl(fd_frontend,FE_READ_BER,&strength) >= 0)		mp_msg(MSGT_DEMUX, MSGL_V, "Bit error rate: %d\n",strength);		strength=0;		if(ioctl(fd_frontend,FE_READ_SIGNAL_STRENGTH,&strength) >= 0)		mp_msg(MSGT_DEMUX, MSGL_V, "Signal strength: %d\n",strength);		strength=0;		if(ioctl(fd_frontend,FE_READ_SNR,&strength) >= 0)		mp_msg(MSGT_DEMUX, MSGL_V, "SNR: %d\n",strength);		festatus=0;		mp_msg(MSGT_DEMUX, MSGL_V, "FE_STATUS:");				if(ioctl(fd_frontend,FE_READ_STATUS,&festatus) >= 0)		    print_status(festatus);		else		    mp_msg(MSGT_DEMUX, MSGL_ERR, " ERROR, UNABLE TO READ_STATUS");		    		mp_msg(MSGT_DEMUX, MSGL_V, "\n");	}	else	{		mp_msg(MSGT_DEMUX, MSGL_V, "Not able to lock to the signal on the given frequency\n");		return -1;	}	return 0;}#endif#ifdef HAVE_DVB_HEADstatic struct diseqc_cmd {   struct dvb_diseqc_master_cmd cmd;   uint32_t wait;};static int diseqc_send_msg(int fd, fe_sec_voltage_t v, struct diseqc_cmd *cmd,		     fe_sec_tone_mode_t t, fe_sec_mini_cmd_t b){   if(ioctl(fd, FE_SET_TONE, SEC_TONE_OFF) == -1)    return -1;   if(ioctl(fd, FE_SET_VOLTAGE, v) == -1)    return -1;   usleep(15 * 1000);   if(ioctl(fd, FE_DISEQC_SEND_MASTER_CMD, &cmd->cmd) == -1)    return -1;   usleep(cmd->wait * 1000);   usleep(15 * 1000);   if(ioctl(fd, FE_DISEQC_SEND_BURST, b) == -1)    return -1;   usleep(15 * 1000);   if(ioctl(fd, FE_SET_TONE, t) == -1)    return -1;    return 0;}/* digital satellite equipment control, * specification is available from http://www.eutelsat.com/ */static int do_diseqc(int secfd, int sat_no, int polv, int hi_lo){   struct diseqc_cmd cmd =  { {{0xe0, 0x10, 0x38, 0xf0, 0x00, 0x00}, 4}, 0 };   /* param: high nibble: reset bits, low nibble set bits,    * bits are: option, position, polarizaion, band    */   cmd.cmd.msg[3] =       0xf0 | (((sat_no * 4) & 0x0f) | (hi_lo ? 1 : 0) | (polv ? 0 : 2));   return diseqc_send_msg(secfd, polv ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18,		   &cmd, hi_lo ? SEC_TONE_ON : SEC_TONE_OFF,		   (sat_no / 4) % 2 ? SEC_MINI_B : SEC_MINI_A);}#elsestatic int do_diseqc(int secfd, int sat_no, int polv, int hi_lo){	struct secCommand scmd;        struct secCmdSequence scmds;        scmds.continuousTone = (hi_lo ? SEC_TONE_ON : SEC_TONE_OFF);        scmds.voltage = (polv ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);        scmds.miniCommand = SEC_MINI_NONE;        scmd.type = SEC_CMDTYPE_DISEQC;        scmds.numCommands = 1;        scmds.commands = &scmd;        scmd.u.diseqc.addr = 0x10;        scmd.u.diseqc.cmd = 0x38;        scmd.u.diseqc.numParams = 1;        scmd.u.diseqc.params[0] = 0xf0 |                                  (((sat_no) << 2) & 0x0F) |				  (hi_lo ? 1 : 0) |                                  (polv ? 0 : 2);         if (ioctl(secfd,SEC_SEND_SEQUENCE,&scmds) < 0)	{          mp_msg(MSGT_DEMUX, MSGL_ERR, "Error sending DisEqC");          return -1;        }		return 0;}#endifstatic int tune_it(int fd_frontend, int fd_sec, unsigned int freq, unsigned int srate, char pol, int tone,	fe_spectral_inversion_t specInv, unsigned int diseqc, fe_modulation_t modulation, fe_code_rate_t HP_CodeRate,	fe_transmit_mode_t TransmissionMode, fe_guard_interval_t guardInterval, fe_bandwidth_t bandwidth,	fe_code_rate_t LP_CodeRate, fe_hierarchy_t hier){  int res, hi_lo, dfd;#ifdef HAVE_DVB_HEAD  struct dvb_frontend_parameters feparams;  struct dvb_frontend_info fe_info;#else  FrontendParameters feparams;  FrontendInfo fe_info;  struct secStatus sec_state;#endif  mp_msg(MSGT_DEMUX, MSGL_V,  "TUNE_IT, fd_frontend %d, fd_sec %d\nfreq %lu, srate %lu, pol %c, tone %i, specInv, diseqc %u, fe_modulation_t modulation,fe_code_rate_t HP_CodeRate, fe_transmit_mode_t TransmissionMode,fe_guard_interval_t guardInterval, fe_bandwidth_t bandwidth\n",	    fd_frontend, fd_sec, (long unsigned int)freq, (long unsigned int)srate, pol, tone, diseqc);  if ( (res = ioctl(fd_frontend,FE_GET_INFO, &fe_info) < 0))  {  	mp_msg(MSGT_DEMUX, MSGL_FATAL, "FE_GET_INFO FAILED\n");	return -1;  }#ifdef HAVE_DVB_HEAD  mp_msg(MSGT_DEMUX, MSGL_V, "Using DVB card \"%s\"\n", fe_info.name);#endif  switch(fe_info.type)  {    case FE_OFDM:#ifdef HAVE_DVB_HEAD      if (freq < 1000000) freq*=1000UL;      feparams.frequency=freq;      feparams.inversion=specInv;      feparams.u.ofdm.bandwidth=bandwidth;      feparams.u.ofdm.code_rate_HP=HP_CodeRate;      feparams.u.ofdm.code_rate_LP=LP_CodeRate;      feparams.u.ofdm.constellation=modulation;      feparams.u.ofdm.transmission_mode=TransmissionMode;      feparams.u.ofdm.guard_interval=guardInterval;      feparams.u.ofdm.hierarchy_information=hier;#else      if (freq < 1000000) freq*=1000UL;      feparams.Frequency=freq;      feparams.Inversion=specInv;      feparams.u.ofdm.bandWidth=bandwidth;      feparams.u.ofdm.HP_CodeRate=HP_CodeRate;      feparams.u.ofdm.LP_CodeRate=LP_CodeRate;      feparams.u.ofdm.Constellation=modulation;      feparams.u.ofdm.TransmissionMode=TransmissionMode;      feparams.u.ofdm.guardInterval=guardInterval;      feparams.u.ofdm.HierarchyInformation=hier;#endif      mp_msg(MSGT_DEMUX, MSGL_V, "tuning DVB-T to %d Hz, bandwidth: %d\n",freq, bandwidth);      break;    case FE_QPSK:      if (freq > 2200000)      {        // this must be an absolute frequency        if (freq < SLOF)	{#ifdef HAVE_DVB_HEAD          freq = feparams.frequency=(freq-LOF1);#else          freq = feparams.Frequency=(freq-LOF1);#endif	    hi_lo = 0;        }	else	{#ifdef HAVE_DVB_HEAD          freq = feparams.frequency=(freq-LOF2);#else          freq = feparams.Frequency=(freq-LOF2);#endif	    hi_lo = 1;        }      }      else      {        // this is an L-Band frequency#ifdef HAVE_DVB_HEAD       feparams.frequency=freq;#else       feparams.Frequency=freq;#endif      }#ifdef HAVE_DVB_HEAD      feparams.inversion=specInv;      feparams.u.qpsk.symbol_rate=srate;      feparams.u.qpsk.fec_inner=HP_CodeRate;      dfd = fd_frontend;#else      feparams.Inversion=specInv;      feparams.u.qpsk.SymbolRate=srate;      feparams.u.qpsk.FEC_inner=HP_CodeRate;      dfd = fd_sec;#endif	mp_msg(MSGT_DEMUX, MSGL_V, "tuning DVB-S to Freq: %u, Pol: %c Srate: %d, 22kHz: %s, LNB:  %d\n",freq,pol,srate,hi_lo ? "on" : "off", diseqc);   if(do_diseqc(dfd, diseqc, (pol == 'V' ? 1 : 0), hi_lo) == 0)	mp_msg(MSGT_DEMUX, MSGL_V, "DISEQC SETTING SUCCEDED\n");   else   {	mp_msg(MSGT_DEMUX, MSGL_ERR, "DISEQC SETTING FAILED\n");	return -1;   }      break;    case FE_QAM:      mp_msg(MSGT_DEMUX, MSGL_V, "tuning DVB-C to %d, srate=%d\n",freq,srate);#ifdef HAVE_DVB_HEAD      feparams.frequency=freq;      feparams.inversion=specInv;      feparams.u.qam.symbol_rate = srate;      feparams.u.qam.fec_inner = HP_CodeRate;      feparams.u.qam.modulation = modulation;#else      feparams.Frequency=freq;      feparams.Inversion=specInv;      feparams.u.qam.SymbolRate = srate;      feparams.u.qam.FEC_inner = HP_CodeRate;      feparams.u.qam.QAM = modulation;#endif      break;#ifdef DVB_ATSC    case FE_ATSC:      mp_msg(MSGT_DEMUX, MSGL_V, "tuning ATSC to %d, modulation=%d\n",freq,modulation);      feparams.frequency=freq;      feparams.u.vsb.modulation = modulation;      break;#endif    default:      mp_msg(MSGT_DEMUX, MSGL_V, "Unknown FE type. Aborting\n");      return 0;  }  usleep(100000);#ifndef HAVE_DVB_HEAD  if (fd_sec) SecGetStatus(fd_sec, &sec_state);#endif  return(check_status(fd_frontend,&feparams,fe_info.type, (hi_lo ? LOF2 : LOF1)));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -