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

📄 dvbtune.c

📁 DVBtune is a simple tuning application for DVB cards supported by the Linux DVB driver
💻 C
📖 第 1 页 / 共 3 页
字号:
      seclen+=3;//      printf("Read %d bytes\n",seclen);    //    for (i=0;i<seclen+3;i++) { printf("%02x ",buf[i]); }/*      for (i=0;i< seclen;i++) {        printf("%02x ",buf[i]);        if ((i % 16)==15) {           printf("  ");          for (j=i-15;j<=i;j++) {              printf("%c",((buf[j]>31) && (buf[j]<=127)) ? buf[j] : '.');           }          printf("\n");        }      }*/      max_k=buf[7]+1; // last_sec_num - read this many (+1) sections      i=11;      while (i < (seclen-4)) {       service_id=(buf[i]<<8)|buf[i+1];       i+=2;       i++;  // Skip a field       ca=(buf[i]&0x10)>>4;       loop_length=((buf[i]&0x0f)<<8)|buf[i+1];       printf("<service id=\"%d\" ca=\"%d\">\n",service_id,ca);       i+=2;       parse_descriptors(loop_length,&buf[i]);       i+=loop_length;       scan_pmt(get_pmt_pid(service_id),service_id,(service_id==pnr));       printf("</service>\n");      }    }  else {      printf("Under-read bytes for SDT - wanted %d, got %d\n",seclen,n);    }  } else {    fprintf(stderr,"Nothing to read from fd_sdt\n");  }}//  printf("</sdt>\n");  close(fd_sdt);}int FEReadBER(int fd, uint32_t *ber){        int ans;        if ( (ans = ioctl(fd,FE_READ_BER, ber) < 0)){                perror("FE READ_BER: ");                return -1;        }        return 0;}int FEReadSignalStrength(int fd, int32_t *strength){        int ans;        if ( (ans = ioctl(fd,FE_READ_SIGNAL_STRENGTH, strength) < 0)){                perror("FE READ SIGNAL STRENGTH: ");                return -1;        }        return 0;}int FEReadSNR(int fd, int32_t *snr){        int ans;        if ( (ans = ioctl(fd,FE_READ_SNR, snr) < 0)){                perror("FE READ_SNR: ");                return -1;        }        return 0;}#if 0int FEReadAFC(int fd, int32_t *snr){           int ans;        if ( (ans = ioctl(fd,FE_READ_AFC, snr) < 0)){                perror("FE READ_AFC: ");                return -1;        }        return 0;}#endifint FEReadUncorrectedBlocks(int fd, uint32_t *ucb){        int ans;        if ( (ans = ioctl(fd,FE_READ_UNCORRECTED_BLOCKS, ucb) < 0)){                perror("FE READ UNCORRECTED BLOCKS: ");                return -1;        }        return 0;}int main(int argc, char **argv){  int fd_frontend=0;  int fd_sec=0;  int fd_dvr=0;  int do_info=0;  int do_scan=0;  int do_monitor=0;	  unsigned int freq=0;  char pol=0;  unsigned int srate=0;  unsigned int diseqc = 0;  int ttpid=0;  int dpid=0;  fe_modulation_t modulation=CONSTELLATION_DEFAULT;  fe_transmit_mode_t TransmissionMode=TRANSMISSION_MODE_DEFAULT;  fe_bandwidth_t bandWidth=BANDWIDTH_DEFAULT;  fe_guard_interval_t guardInterval=GUARD_INTERVAL_DEFAULT;  fe_code_rate_t HP_CodeRate=HP_CODERATE_DEFAULT;  int count;  transponder_t * t;  int i;    if (argc==1) {    fprintf(stderr,"Usage: dvbtune [OPTIONS]\n\n");    fprintf(stderr,"Standard options:\n\n");    fprintf(stderr,"-f freq     absolute Frequency (DVB-S in Hz or DVB-T in Hz)\n");    fprintf(stderr,"            or L-band Frequency (DVB-S in Hz or DVB-T in Hz)\n");    fprintf(stderr,"-p [H,V]    Polarity (DVB-S only)\n");    fprintf(stderr,"-s N        Symbol rate (DVB-S or DVB-C)\n");    fprintf(stderr,"-v vpid     Decode video PID (full cards only)\n");    fprintf(stderr,"-a apid     Decode audio PID (full cards only)\n");    fprintf(stderr,"-t ttpid    Decode teletext PID (full cards only)\n");    fprintf(stderr,"-pnr N      Tune to Program Number (aka service) N\n\n");    fprintf(stderr,"-i          Dump SI information as XML\n");    fprintf(stderr,"\nAdvanced tuning options:\n\n");    fprintf(stderr,"-c [0-3]    Use DVB card #[0-3]\n");    fprintf(stderr,"-tone [0|1] 0=22kHz off, 1=22kHz on\n");    fprintf(stderr,"-I [0|1|2]  0=Spectrum Inversion off, 1=Spectrum Inversion on, 2=auto\n");    fprintf(stderr,"-D [0-4]    DiSEqC command (0=none)\n\n");    fprintf(stderr,"-qam X      DVB-T modulation - 16%s, 32%s, 64%s, 128%s or 256%s\n",(CONSTELLATION_DEFAULT==QAM_16 ? " (default)" : ""),(CONSTELLATION_DEFAULT==QAM_32 ? " (default)" : ""),(CONSTELLATION_DEFAULT==QAM_64 ? " (default)" : ""),(CONSTELLATION_DEFAULT==QAM_128 ? " (default)" : ""),(CONSTELLATION_DEFAULT==QAM_256 ? " (default)" : ""));    fprintf(stderr,"-gi N       DVB-T guard interval 1_N (N=32%s, 16%s, 8%s or 4%s)\n",(GUARD_INTERVAL_DEFAULT==GUARD_INTERVAL_1_32 ? " (default)" : ""),(GUARD_INTERVAL_DEFAULT==GUARD_INTERVAL_1_16 ? " (default)" : ""),(GUARD_INTERVAL_DEFAULT==GUARD_INTERVAL_1_8 ? " (default)" : ""),(GUARD_INTERVAL_DEFAULT==GUARD_INTERVAL_1_4 ? " (default)" : ""));    fprintf(stderr,"-cr N       DVB-T code rate. N=AUTO%s, 1_2%s, 2_3%s, 3_4%s, 5_6%s, 7_8%s\n",(HP_CODERATE_DEFAULT==FEC_AUTO ? " (default)" : ""),(HP_CODERATE_DEFAULT==FEC_1_2 ? " (default)" : ""),(HP_CODERATE_DEFAULT==FEC_2_3 ? " (default)" : ""),(HP_CODERATE_DEFAULT==FEC_3_4 ? " (default)" : ""),(HP_CODERATE_DEFAULT==FEC_5_6 ? " (default)" : ""),(HP_CODERATE_DEFAULT==FEC_7_8 ? " (default)" : ""));    fprintf(stderr,"-bw N       DVB-T bandwidth (Mhz) - N=6%s, 7%s or 8%s\n",(BANDWIDTH_DEFAULT==BANDWIDTH_6_MHZ ? " (default)" : ""),(BANDWIDTH_DEFAULT==BANDWIDTH_7_MHZ ? " (default)" : ""),(BANDWIDTH_DEFAULT==BANDWIDTH_8_MHZ ? " (default)" : ""));    fprintf(stderr,"-tm N       DVB-T transmission mode - N=2%s or 8%s\n",(TRANSMISSION_MODE_DEFAULT==TRANSMISSION_MODE_2K ? " (default)" : ""),(TRANSMISSION_MODE_DEFAULT==TRANSMISSION_MODE_8K ? " (default)" : ""));    fprintf(stderr,"-x          Attempt to auto-find other transponders (experimental - DVB-S only)\n");    fprintf(stderr,"-m          Monitor the reception quality\n");    fprintf(stderr,"-n dpid     Add network interface and receive MPE on PID dpid\n");    fprintf(stderr,"\n");    return(-1);  } else {    count=0;    for (i=1;i<argc;i++) {      if (strcmp(argv[i],"-f")==0) {        i++;        freq=atoi(argv[i]);      } else if (strcmp(argv[i],"-i")==0) { //         do_info=1;      } else if (strcmp(argv[i],"-m")==0) { //         do_monitor=1;      } else if (strcmp(argv[i],"-n")==0) { //         i++;        dpid=atoi(argv[i]);      } else if (strcmp(argv[i],"-c")==0) { //         i++;        card=atoi(argv[i]);        if ((card < 0) || (card > 3)) {	  fprintf(stderr,"card must be between 0 and 3\n");          exit(-1);        }      } else if (strcmp(argv[i],"-x")==0) { //         do_scan=1;      } else if (strcmp(argv[i],"-v")==0) {        i++;        vpid=atoi(argv[i]);      } else if (strcmp(argv[i],"-pnr")==0) {        i++;        pnr=atoi(argv[i]);        do_info=1;      } else if (strcmp(argv[i],"-a")==0) {        i++;        apid=atoi(argv[i]);      } else if (strcmp(argv[i],"-t")==0) {        i++;        ttpid=atoi(argv[i]);      } else if (strcmp(argv[i],"-p")==0) {        i++;        if (argv[i][1]==0) {	  if (tolower(argv[i][0])=='v') {            pol='V';          } else if (tolower(argv[i][0])=='h') {            pol='H';          } else if (tolower(argv[i][0])=='l') {            pol='L';          } else if (tolower(argv[i][0])=='r') {            pol='R';          }        }      } else if (strcmp(argv[i],"-s")==0) {        i++;        srate=atoi(argv[i])*1000UL;      } else if (strcmp(argv[i],"-qam")==0) {        i++;        switch(atoi(argv[i])) {          case 16:  modulation=QAM_16; break;          case 32:  modulation=QAM_32; break;          case 64:  modulation=QAM_64; break;          case 128: modulation=QAM_128; break;          case 256: modulation=QAM_256; break;          default:            fprintf(stderr,"Invalid QAM rate: %s\n",argv[i]);            exit(0);        }      } else if (strcmp(argv[i],"-gi")==0) {        i++;        switch(atoi(argv[i])) {          case 32:  guardInterval=GUARD_INTERVAL_1_32; break;          case 16:  guardInterval=GUARD_INTERVAL_1_16; break;          case 8:   guardInterval=GUARD_INTERVAL_1_8; break;          case 4:   guardInterval=GUARD_INTERVAL_1_4; break;          default:            fprintf(stderr,"Invalid Guard Interval: %s\n",argv[i]);            exit(0);        }      } else if (strcmp(argv[i],"-tm")==0) {        i++;        switch(atoi(argv[i])) {          case 8:   TransmissionMode=TRANSMISSION_MODE_8K; break;          case 2:   TransmissionMode=TRANSMISSION_MODE_2K; break;          default:            fprintf(stderr,"Invalid Transmission Mode: %s\n",argv[i]);            exit(0);        }      } else if (strcmp(argv[i],"-bw")==0) {        i++;        switch(atoi(argv[i])) {          case 8:   bandWidth=BANDWIDTH_8_MHZ; break;          case 7:   bandWidth=BANDWIDTH_7_MHZ; break;          case 6:   bandWidth=BANDWIDTH_6_MHZ; break;          default:            fprintf(stderr,"Invalid DVB-T bandwidth: %s\n",argv[i]);            exit(0);        }      } else if (strcmp(argv[i],"-cr")==0) {        i++;        if (!strcmp(argv[i],"AUTO")) {          HP_CodeRate=FEC_AUTO;        } else if (!strcmp(argv[i],"1_2")) {          HP_CodeRate=FEC_1_2;        } else if (!strcmp(argv[i],"2_3")) {          HP_CodeRate=FEC_2_3;        } else if (!strcmp(argv[i],"3_4")) {          HP_CodeRate=FEC_3_4;        } else if (!strcmp(argv[i],"5_6")) {          HP_CodeRate=FEC_5_6;        } else if (!strcmp(argv[i],"7_8")) {          HP_CodeRate=FEC_7_8;        } else {          fprintf(stderr,"Invalid Code Rate: %s\n",argv[i]);          exit(0);        }      } else if (strcmp(argv[i],"-D")==0) {        i++;        diseqc=atoi(argv[i]);        if (diseqc > 4) {	  fprintf(stderr,"DiSEqC must be between 0 and 4\n");          exit(-1);        }      } else if (strcmp(argv[i],"-tone")==0) {	i++;	if (atoi(argv[i])==0)	   tone = SEC_TONE_OFF;        else	   tone = SEC_TONE_ON;      } else if (strcmp(argv[i],"-I")==0) {        i++;        if (atoi(argv[i])==0)           specInv = INVERSION_OFF;	else if (atoi(argv[i])==1)           specInv = INVERSION_ON;        else           specInv = INVERSION_AUTO;      }    }  }#if 0  if (!((freq > 100000000) || ((freq > 0) && (pol!=0) && (srate!=0)))) {    fprintf(stderr,"Invalid parameters\n");    exit(-1);  }#endif  if((fd_dvr = open(dvrdev[card],O_RDONLY|O_NONBLOCK)) < 0){      fprintf(stderr,"FD %d: ",i);      perror("fd_dvr DEMUX DEVICE: ");      return -1;  }  if((fd_frontend = open(frontenddev[card],O_RDWR)) < 0){      fprintf(stderr,"frontend: %d",i);      perror("FRONTEND DEVICE: ");      return -1;  }#ifndef NEWSTRUCT  /* Only open sec for DVB-S tuning */  if (freq<100000000) {    if((fd_sec = open(secdev[card],O_RDWR)) < 0) {        fprintf(stderr,"FD %i: ",i);        perror("SEC DEVICE (warning) ");    }  }#endif  if((fd_demuxrec = open(demuxdev[card],O_RDWR|O_NONBLOCK)) < 0){      fprintf(stderr,"FD %i: ",i);      perror("DEMUX DEVICE: ");      return -1;  }  if((fd_demuxv = open(demuxdev[card],O_RDWR)) < 0){      fprintf(stderr,"FD %i: ",i);      perror("DEMUX DEVICE: ");      return -1;  }  if((fd_demuxa = open(demuxdev[card],O_RDWR)) < 0){      fprintf(stderr,"FD %i: ",i);      perror("DEMUX DEVICE: ");      return -1;  }  if((fd_demuxtt = open(demuxdev[card],O_RDWR)) < 0){      fprintf(stderr,"FD %i: ",i);      perror("DEMUX DEVICE: ");      return -1;  }  if((fd_demuxd = open(demuxdev[card],O_RDWR)) < 0){      fprintf(stderr,"FD %i: ",i);      perror("DEMUX DEVICE: ");      return -1;  }  if((fd_demuxsi = open(demuxdev[card],O_RDWR|O_NONBLOCK)) < 0){      fprintf(stderr,"FD %i: ",i);      perror("DEMUX DEVICE: ");      return -1;  }  if (freq > 0) {    /* Stop the hardware filters */    set_apid(0);    set_vpid(0);    set_ttpid(0);    if (tune_it(fd_frontend,fd_sec,freq,srate,pol,tone,specInv,diseqc,modulation,HP_CodeRate,TransmissionMode,guardInterval,bandWidth) < 0) {      return -1;    }  }  if (do_scan) {    printf("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<satellite>\n");    scan_nit(0x40); /* Get initial list of transponders */    scan_nit(0x41); /* Get initial list of transponders */    while ((t=get_unscanned(transponders))!=NULL) {      free_pat_list();      fprintf(stderr,"Scanning %d%c %d\n",t->freq,t->pol,t->srate);      tune_it(fd_frontend,fd_sec,t->freq,t->srate,t->pol,tone,specInv,0,modulation,HP_CodeRate,TransmissionMode,guardInterval,bandWidth);      printf("<transponder id=\"%d\" onid=\"%d\" freq=\"%05d\" srate=\"%d\" pos=\"%04x\" we_flag=\"%d\" polarity=\"%c\" modulation=\"%d\">\n",t->id,t->onid,t->freq,t->srate,t->pos,t->we_flag,t->pol,t->mod);      t->scanned=1;      scan_pat();      scan_sdt();      printf("</transponder>\n");      scan_nit(0x40); /* See if there are any new transponders */      scan_nit(0x41); /* See if there are any new transponders */    }    printf("</satellite>\n");  }  if (do_info) {    if (pol!=0) {      printf("<transponder type=\"S\" freq=\"%d\" srate=\"%d\" polarity=\"%c\" >\n",freq,srate,pol);    } else {      if (srate!=0) {        printf("<transponder type=\"C\" freq=\"%d\" srate=\"%d\">\n",freq,srate);      } else {        if (freq<1000000) freq*=1000UL;        printf("<transponder type=\"T\" freq=\"%d\">\n",freq);      }    }    scan_pat();    scan_sdt();//    scan_nit(0x40);    printf("</transponder>\n");  }  if ((vpid!=0) || (apid!=0) || (ttpid!=0)) {    set_vpid(vpid);    set_apid(apid);    set_ttpid(ttpid);    fprintf(stderr,"A/V/TT Filters set\n");  }  if (dpid > 0) {    char devnamen[80];    int dev, fdn;    struct dvb_net_if netif;    dev = card;    netif.pid = dpid;    netif.if_num = 0;  // always choosen the next free number#ifdef NEWSTRUCT    sprintf(devnamen,"/dev/dvb/adapter%d/net0",dev);#else    sprintf(devnamen,"/dev/ost/net%d",dev);#endif    //printf("Trying to open %s\n",devnamen);    if((fdn = open(devnamen,O_RDWR|O_NONBLOCK)) < 0) {      fprintf(stderr, "Failed to open DVB NET DEVICE");      close(fd_frontend);      if (fd_sec) close(fd_sec);    } else {      // Add the network interface      ioctl( fdn,NET_ADD_IF,&netif);      close (fdn);      printf("Successfully opened network device, please configure the dvb interface\n");    }  }  if (do_monitor) {        int32_t strength, ber, snr, uncorr;        fe_status_t festatus;        if((fd_frontend = open(frontenddev[card],O_RDONLY)) < 0){                fprintf(stderr,"frontend: %d",i);                perror("FRONTEND DEVICE: ");                return -1;        }        // Check the signal strength and the BER        while (1) {                festatus = 0; strength = 0; ber = 0; snr = 0; uncorr = 0;                FEReadBER(fd_frontend, &ber);                FEReadSignalStrength(fd_frontend, &strength);                FEReadSNR(fd_frontend, &snr);                FEReadUncorrectedBlocks(fd_frontend, &uncorr);                ioctl(fd_frontend,FE_READ_STATUS,&festatus);                fprintf(stderr,"Signal=%d, Verror=%d, SNR=%ddB, BlockErrors=%d, (", strength, ber, snr, uncorr);#ifndef NEWSTRUCT		if (festatus & FE_HAS_POWER) fprintf(stderr,"P|");		if (festatus & FE_SPECTRUM_INV) fprintf(stderr,"I|");#endif		if (festatus & FE_HAS_SIGNAL) fprintf(stderr,"S|");		if (festatus & FE_HAS_LOCK) fprintf(stderr,"L|");		if (festatus & FE_HAS_CARRIER) fprintf(stderr,"C|");		if (festatus & FE_HAS_VITERBI) fprintf(stderr,"V|");		if (festatus & FE_HAS_SYNC) fprintf(stderr,"SY|");		fprintf(stderr,")\n");                sleep(1);        }  }  close(fd_frontend);  if (fd_sec) close(fd_sec);  return(0);}

⌨️ 快捷键说明

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