/* set the delsys default/fixed parameters and replace DVBv5 default values */ static void dvb_setup_delsys_default(struct dvb_v5_fe_parms *p) { struct dvb_v5_fe_parms_priv *parms = (void *)p; uint32_t cc; switch (p->current_sys) { case SYS_ISDBT: /* Set country code. */ /* if the default country is not known, fallback to BR */ cc = COUNTRY_UNKNOWN; dvb_fe_retrieve_parm(p, DTV_COUNTRY_CODE, &cc); if (cc == COUNTRY_UNKNOWN) { cc = (parms->country == COUNTRY_UNKNOWN) ? BR : parms->country; dvb_fe_store_parm(p, DTV_COUNTRY_CODE, cc); } switch (cc) { case JP: p->default_charset = "arib-std-b24"; dvb_fe_store_parm(p, DTV_BANDWIDTH_HZ, 6000000); break; /* Americas (SBTVD) */ case AR: case BO: case BR: case CL: case CR: case EC: case GT: case HN: case NI: case PE: case PY: case UY: case VE: p->default_charset = "iso8859-15"; break; } break; case SYS_ISDBS: p->default_charset = "arib-std-b24"; if (!p->lnb) p->lnb = dvb_sat_get_lnb(dvb_sat_search_lnb("110BS")); break; default: break; } }
bool Frontend_DVBS::SetTuneParams( Transponder &t ) { int satpos = GetCurrentPort( )->GetPortNum( ); int lnb = dvb_sat_search_lnb( LNB.c_str( )); if( lnb < 0 ) { LogError( "Unknown LNB '%s'", LNB.c_str( )); t.SetState( Transponder::State_TuningFailed ); t.SaveConfig( ); return false; } // FIXME: we should never use fe->* directly, use functions... // fe->sat_number = satpos % 3; fe->lnb = dvb_sat_get_lnb( lnb ); // FIXME: put to ptroperties in v4l fe->diseqc_wait = 0; fe->freq_bpf = 0; return true; }
int main(int argc, char **argv) { struct arguments args; int lnb = -1,idx = -1; const struct argp argp = { .options = options, .parser = parse_opt, .doc = "scan DVB services using the channel file", .args_doc = "<initial file>", }; memset(&args, 0, sizeof(args)); args.sat_number = -1; args.output = DEFAULT_OUTPUT; args.input_format = FILE_DVBV5; args.output_format = FILE_DVBV5; args.timeout_multiply = 1; argp_parse(&argp, argc, argv, 0, &idx, &args); if (args.timeout_multiply == 0) args.timeout_multiply = 1; if (args.lnb_name) { lnb = dvb_sat_search_lnb(args.lnb_name); if (lnb < 0) { printf("Please select one of the LNBf's below:\n"); print_all_lnb(); exit(1); } else { printf("Using LNBf "); print_lnb(lnb); } } if (idx < argc) args.confname = argv[idx]; if (!args.confname || idx < 0) { argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } if ((args.input_format == FILE_ZAP) || (args.input_format == FILE_UNKNOWN) || (args.output_format == FILE_UNKNOWN)) { fprintf(stderr, "ERROR: Please specify a valid format\n"); argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } asprintf(&args.demux_dev, "/dev/dvb/adapter%i/demux%i", args.adapter, args.demux); if (verbose) fprintf(stderr, "using demux '%s'\n", args.demux_dev); struct dvb_v5_fe_parms *parms = dvb_fe_open(args.adapter, args.frontend, verbose, args.force_dvbv3); if (!parms) return -1; if (lnb >= 0) parms->lnb = dvb_sat_get_lnb(lnb); if (args.sat_number >= 0) parms->sat_number = args.sat_number % 3; parms->diseqc_wait = args.diseqc_wait; parms->freq_bpf = args.freq_bpf; if (run_scan(&args, parms)) return -1; dvb_fe_close(parms); free(args.demux_dev); return 0; }
int main(int argc, char **argv) { struct arguments args; int err, lnb = -1,idx = -1; int r; const struct argp argp = { .options = options, .parser = parse_opt, .doc = N_("scan DVB services using the channel file"), .args_doc = N_("<initial file>"), }; #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); #endif memset(&args, 0, sizeof(args)); args.sat_number = -1; args.output = DEFAULT_OUTPUT; args.input_format = FILE_DVBV5; args.output_format = FILE_DVBV5; args.timeout_multiply = 1; args.adapter = (unsigned)-1; args.lna = LNA_AUTO; if (argp_parse(&argp, argc, argv, ARGP_NO_HELP | ARGP_NO_EXIT, &idx, &args)) { argp_help(&argp, stderr, ARGP_HELP_SHORT_USAGE, PROGRAM_NAME); return -1; } if (args.timeout_multiply == 0) args.timeout_multiply = 1; if (args.n_adapter == 1) { args.adapter_fe = args.adapter; args.adapter_dmx = args.adapter; } if (args.lnb_name) { lnb = dvb_sat_search_lnb(args.lnb_name); if (lnb < 0) { printf(_("Please select one of the LNBf's below:\n")); dvb_print_all_lnb(); exit(1); } else { printf(_("Using LNBf ")); dvb_print_lnb(lnb); } } if (idx < argc) args.confname = argv[idx]; if (!args.confname || idx < 0) { argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } if ((args.input_format == FILE_ZAP) || (args.input_format == FILE_UNKNOWN) || (args.output_format == FILE_UNKNOWN)) { fprintf(stderr, _("ERROR: Please specify a valid format\n")); argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } r = asprintf(&args.demux_dev, "/dev/dvb/adapter%i/demux%i", args.adapter_dmx, args.demux); if (r < 0) { fprintf(stderr, _("asprintf error\n") ); return -1; } if (verbose) fprintf(stderr, _("using demux '%s'\n"), args.demux_dev); struct dvb_v5_fe_parms *parms = dvb_fe_open(args.adapter_fe, args.frontend, verbose, args.force_dvbv3); if (!parms) { free(args.demux_dev); return -1; } if (lnb >= 0) parms->lnb = dvb_sat_get_lnb(lnb); if (args.sat_number >= 0) parms->sat_number = args.sat_number % 3; parms->diseqc_wait = args.diseqc_wait; parms->freq_bpf = args.freq_bpf; parms->lna = args.lna; r = dvb_fe_set_default_country(parms, args.cc); if (r < 0) fprintf(stderr, _("Failed to set the country code:%s\n"), args.cc); timeout_flag = &parms->abort; signal(SIGTERM, do_timeout); signal(SIGINT, do_timeout); err = run_scan(&args, parms); dvb_fe_close(parms); free(args.demux_dev); return err; }
static int run_scan(struct arguments *args, struct dvb_v5_fe_parms *parms) { struct dvb_file *dvb_file = NULL, *dvb_file_new = NULL; struct dvb_entry *entry; int count = 0, dmx_fd, shift; uint32_t freq, sys; enum dvb_sat_polarization pol; /* This is used only when reading old formats */ switch (parms->current_sys) { case SYS_DVBT: case SYS_DVBS: case SYS_DVBC_ANNEX_A: case SYS_ATSC: sys = parms->current_sys; break; case SYS_DVBC_ANNEX_C: sys = SYS_DVBC_ANNEX_A; break; case SYS_DVBC_ANNEX_B: sys = SYS_ATSC; break; case SYS_ISDBT: case SYS_DTMB: sys = SYS_DVBT; break; default: sys = SYS_UNDEFINED; break; } dvb_file = dvb_read_file_format(args->confname, sys, args->input_format); if (!dvb_file) return -2; dmx_fd = open(args->demux_dev, O_RDWR); if (dmx_fd < 0) { perror(_("openening pat demux failed")); return -3; } for (entry = dvb_file->first_entry; entry != NULL; entry = entry->next) { struct dvb_v5_descriptors *dvb_scan_handler = NULL; uint32_t stream_id; /* * If the channel file has duplicated frequencies, or some * entries without any frequency at all, discard. */ if (dvb_retrieve_entry_prop(entry, DTV_FREQUENCY, &freq)) continue; shift = dvb_estimate_freq_shift(parms); if (dvb_retrieve_entry_prop(entry, DTV_POLARIZATION, &pol)) pol = POLARIZATION_OFF; if (dvb_retrieve_entry_prop(entry, DTV_STREAM_ID, &stream_id)) stream_id = NO_STREAM_ID_FILTER; if (!dvb_new_entry_is_needed(dvb_file->first_entry, entry, freq, shift, pol, stream_id)) continue; count++; dvb_log(_("Scanning frequency #%d %d"), count, freq); /* * update params->lnb only if it differs from entry->lnb * (and "--lnbf" option was not provided), * to avoid linear search of LNB types for every entries. */ if (!args->lnb_name && entry->lnb && (!parms->lnb || strcasecmp(entry->lnb, parms->lnb->alias))) parms->lnb = dvb_sat_get_lnb(dvb_sat_search_lnb(entry->lnb)); /* * Run the scanning logic */ dvb_scan_handler = dvb_scan_transponder(parms, entry, dmx_fd, &check_frontend, args, args->other_nit, args->timeout_multiply); if (parms->abort) { dvb_scan_free_handler_table(dvb_scan_handler); break; } if (!dvb_scan_handler) continue; /* * Store the service entry */ dvb_store_channel(&dvb_file_new, parms, dvb_scan_handler, args->get_detected, args->get_nit); /* * Add new transponders based on NIT table information */ if (!args->dont_add_new_freqs) dvb_add_scaned_transponders(parms, dvb_scan_handler, dvb_file->first_entry, entry); /* * Free the scan handler associated with the transponder */ dvb_scan_free_handler_table(dvb_scan_handler); } if (dvb_file_new) dvb_write_file_format(args->output, dvb_file_new, parms->current_sys, args->output_format); dvb_file_free(dvb_file); if (dvb_file_new) dvb_file_free(dvb_file_new); close(dmx_fd); return 0; }
int main(int argc, char **argv) { struct arguments args; char *homedir = getenv("HOME"); char *channel = NULL; int lnb = -1, idx = -1; int vpid = -1, apid = -1, sid = -1; int pmtpid = 0; int pat_fd = -1, pmt_fd = -1; int audio_fd = 0, video_fd = 0; int dvr_fd, file_fd; struct dvb_v5_fe_parms *parms; const struct argp argp = { .options = options, .parser = parse_opt, .doc = "DVB zap utility", .args_doc = "<initial file>", }; memset(&args, 0, sizeof(args)); args.sat_number = -1; argp_parse(&argp, argc, argv, 0, &idx, &args); if (idx < argc) channel = argv[idx]; if (!channel) { argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } if (args.input_format == FILE_UNKNOWN) { fprintf(stderr, "ERROR: Please specify a valid format\n"); argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } if (args.lnb_name) { lnb = dvb_sat_search_lnb(args.lnb_name); if (lnb < 0) { printf("Please select one of the LNBf's below:\n"); print_all_lnb(); exit(1); } else { printf("Using LNBf "); print_lnb(lnb); } } asprintf(&args.demux_dev, "/dev/dvb/adapter%i/demux%i", args.adapter, args.demux); asprintf(&args.dvr_dev, "/dev/dvb/adapter%i/dvr%i", args.adapter, args.demux); if (args.silent < 2) fprintf(stderr, "using demux '%s'\n", args.demux_dev); if (!args.confname) { if (!homedir) ERROR("$HOME not set"); asprintf(&args.confname, "%s/.tzap/%i/%s", homedir, args.adapter, CHANNEL_FILE); if (access(args.confname, R_OK)) asprintf(&args.confname, "%s/.tzap/%s", homedir, CHANNEL_FILE); } printf("reading channels from file '%s'\n", args.confname); parms = dvb_fe_open(args.adapter, args.frontend, 0, args.force_dvbv3); if (!parms) return -1; if (lnb) parms->lnb = dvb_sat_get_lnb(lnb); if (args.sat_number > 0) parms->sat_number = args.sat_number % 3; parms->diseqc_wait = args.diseqc_wait; parms->freq_bpf = args.freq_bpf; if (parse(&args, parms, channel, &vpid, &apid, &sid)) return -1; if (setup_frontend(&args, parms) < 0) return -1; if (args.frontend_only) { check_frontend(&args, parms); dvb_fe_close(parms); return 0; } if (args.rec_psi) { if (sid < 0) { fprintf(stderr, "Service id 0x%04x was not specified at the file\n", sid); return -1; } pmtpid = get_pmt_pid(args.demux_dev, sid); if (pmtpid <= 0) { fprintf(stderr, "couldn't find pmt-pid for sid %04x\n", sid); return -1; } if ((pat_fd = open(args.demux_dev, O_RDWR)) < 0) { perror("opening pat demux failed"); return -1; } if (dvb_set_pesfilter(pat_fd, 0, DMX_PES_OTHER, args.dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER, args.dvr ? 64 * 1024 : 0) < 0) return -1; if ((pmt_fd = open(args.demux_dev, O_RDWR)) < 0) { perror("opening pmt demux failed"); return -1; } if (dvb_set_pesfilter(pmt_fd, pmtpid, DMX_PES_OTHER, args.dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER, args.dvr ? 64 * 1024 : 0) < 0) return -1; } if (vpid >= 0) { if (args.silent < 2) fprintf(stderr, "video pid %d\n", vpid); if ((video_fd = open(args.demux_dev, O_RDWR)) < 0) { PERROR("failed opening '%s'", args.demux_dev); return -1; } printf( " dvb_set_pesfilter %d\n", vpid ); if (dvb_set_pesfilter(video_fd, vpid, DMX_PES_VIDEO, args.dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER, args.dvr ? 64 * 1024 : 0) < 0) return -1; } if (apid >= 0) { if (args.silent < 2) fprintf(stderr, "audio pid %d\n", apid); if ((audio_fd = open(args.demux_dev, O_RDWR)) < 0) { PERROR("failed opening '%s'", args.demux_dev); return -1; } if (dvb_set_pesfilter(audio_fd, apid, DMX_PES_AUDIO, args.dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER, args.dvr ? 64 * 1024 : 0) < 0) return -1; } signal(SIGALRM, do_timeout); if (args.timeout > 0) alarm(args.timeout); if (args.record) { if (args.filename != NULL) { if (strcmp(args.filename, "-") != 0) { file_fd = open(args.filename, #ifdef O_LARGEFILE O_LARGEFILE | #endif O_WRONLY | O_CREAT, 0644); if (file_fd < 0) { PERROR("open of '%s' failed", args.filename); return -1; } } else { file_fd = 1; } } else { PERROR("Record mode but no filename!"); return -1; } if ((dvr_fd = open(args.dvr_dev, O_RDONLY)) < 0) { PERROR("failed opening '%s'", args.dvr_dev); return -1; } if (args.silent < 2) print_frontend_stats(parms, args.human_readable); copy_to_file(dvr_fd, file_fd, args.timeout, args.silent); if (args.silent < 2) print_frontend_stats(parms, args.human_readable); } else { check_frontend(&args, parms); } close(pat_fd); close(pmt_fd); close(audio_fd); close(video_fd); dvb_fe_close(parms); return 0; }
int main(int argc, char **argv) { struct arguments args; char *homedir = getenv("HOME"); char *channel = NULL; int lnb = -1, idx = -1; int vpid = -1, apid = -1, sid = -1; int pmtpid = 0; int pat_fd = -1, pmt_fd = -1, sid_fd = -1; int audio_fd = -1, video_fd = -1; int dvr_fd = -1, file_fd = -1; int err = -1; int r; struct dvb_v5_fe_parms *parms = NULL; const struct argp argp = { .options = options, .parser = parse_opt, .doc = N_("DVB zap utility"), .args_doc = N_("<channel name> [or <frequency> if in monitor mode]"), }; #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); #endif memset(&args, 0, sizeof(args)); args.sat_number = -1; args.lna = LNA_AUTO; args.input_format = FILE_DVBV5; argp_parse(&argp, argc, argv, ARGP_NO_HELP | ARGP_NO_EXIT, &idx, &args); if (idx < argc) channel = argv[idx]; if (!channel) { argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } if (args.input_format == FILE_UNKNOWN) { fprintf(stderr, _("ERROR: Please specify a valid format\n")); argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } if (!args.traffic_monitor && args.search) { fprintf(stderr, _("ERROR: search string can be used only on monitor mode\n")); argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } if (args.lnb_name) { lnb = dvb_sat_search_lnb(args.lnb_name); if (lnb < 0) { printf(_("Please select one of the LNBf's below:\n")); dvb_print_all_lnb(); exit(1); } else { printf(_("Using LNBf ")); dvb_print_lnb(lnb); } } r = asprintf(&args.demux_dev, "/dev/dvb/adapter%i/demux%i", args.adapter, args.demux); if (r < 0) { fprintf(stderr, _("asprintf error\n")); return -1; } r = asprintf(&args.dvr_dev, "/dev/dvb/adapter%i/dvr%i", args.adapter, args.demux); if (r < 0) { fprintf(stderr, _("asprintf error\n")); return -1; } if (args.silent < 2) fprintf(stderr, _("using demux '%s'\n"), args.demux_dev); if (!args.confname) { if (!homedir) ERROR(_("$HOME not set")); r = asprintf(&args.confname, "%s/.tzap/%i/%s", homedir, args.adapter, CHANNEL_FILE); if (access(args.confname, R_OK)) { free(args.confname); r = asprintf(&args.confname, "%s/.tzap/%s", homedir, CHANNEL_FILE); } } fprintf(stderr, _("reading channels from file '%s'\n"), args.confname); parms = dvb_fe_open(args.adapter, args.frontend, args.verbose, args.force_dvbv3); if (!parms) goto err; if (lnb >= 0) parms->lnb = dvb_sat_get_lnb(lnb); if (args.sat_number > 0) parms->sat_number = args.sat_number % 3; parms->diseqc_wait = args.diseqc_wait; parms->freq_bpf = args.freq_bpf; parms->lna = args.lna; r = dvb_fe_set_default_country(parms, args.cc); if (r < 0) fprintf(stderr, _("Failed to set the country code:%s\n"), args.cc); if (parse(&args, parms, channel, &vpid, &apid, &sid)) goto err; if (setup_frontend(&args, parms) < 0) goto err; if (args.exit_after_tuning) { err = 0; check_frontend(&args, parms); goto err; } if (args.traffic_monitor) { signal(SIGTERM, do_timeout); signal(SIGINT, do_timeout); if (args.timeout > 0) { signal(SIGINT, do_timeout); alarm(args.timeout); } err = do_traffic_monitor(&args, parms); goto err; } if (args.rec_psi) { if (sid < 0) { fprintf(stderr, _("Service id 0x%04x was not specified at the file\n"), sid); goto err; } sid_fd = dvb_dmx_open(args.adapter, args.demux); if (sid_fd < 0) { perror(_("opening pat demux failed")); return -1; } pmtpid = dvb_get_pmt_pid(sid_fd, sid); dvb_dmx_close(sid_fd); if (pmtpid <= 0) { fprintf(stderr, _("couldn't find pmt-pid for sid %04x\n"), sid); goto err; } if ((pat_fd = open(args.demux_dev, O_RDWR)) < 0) { perror(_("opening pat demux failed")); goto err; } if (dvb_set_pesfilter(pat_fd, 0, DMX_PES_OTHER, args.dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER, args.dvr ? 64 * 1024 : 0) < 0) goto err; if ((pmt_fd = open(args.demux_dev, O_RDWR)) < 0) { perror(_("opening pmt demux failed")); goto err; } if (dvb_set_pesfilter(pmt_fd, pmtpid, DMX_PES_OTHER, args.dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER, args.dvr ? 64 * 1024 : 0) < 0) goto err; } if (args.all_pids++) { vpid = 0x2000; apid = 0; } if (vpid >= 0) { if (args.silent < 2) { if (vpid == 0x2000) fprintf(stderr, _("pass all PID's to TS\n")); else fprintf(stderr, _("video pid %d\n"), vpid); } if ((video_fd = open(args.demux_dev, O_RDWR)) < 0) { PERROR(_("failed opening '%s'"), args.demux_dev); goto err; } if (args.silent < 2) fprintf(stderr, _(" dvb_set_pesfilter %d\n"), vpid); if (vpid == 0x2000) { if (ioctl(video_fd, DMX_SET_BUFFER_SIZE, 1024 * 1024) == -1) perror(_("DMX_SET_BUFFER_SIZE failed")); if (dvb_set_pesfilter(video_fd, vpid, DMX_PES_OTHER, DMX_OUT_TS_TAP, 0) < 0) goto err; } else { if (dvb_set_pesfilter(video_fd, vpid, DMX_PES_VIDEO, args.dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER, args.dvr ? 64 * 1024 : 0) < 0) goto err; } } if (apid > 0) { if (args.silent < 2) fprintf(stderr, _("audio pid %d\n"), apid); if ((audio_fd = open(args.demux_dev, O_RDWR)) < 0) { PERROR(_("failed opening '%s'"), args.demux_dev); goto err; } if (args.silent < 2) fprintf(stderr, _(" dvb_set_pesfilter %d\n"), apid); if (dvb_set_pesfilter(audio_fd, apid, DMX_PES_AUDIO, args.dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER, args.dvr ? 64 * 1024 : 0) < 0) goto err; } signal(SIGALRM, do_timeout); signal(SIGTERM, do_timeout); if (args.timeout > 0) { signal(SIGINT, do_timeout); alarm(args.timeout); } if (!check_frontend(&args, parms)) { err = 1; fprintf(stderr, _("frontend doesn't lock\n")); goto err; } if (args.dvr) { if (args.filename) { file_fd = STDOUT_FILENO; if (strcmp(args.filename, "-") != 0) { file_fd = open(args.filename, #ifdef O_LARGEFILE O_LARGEFILE | #endif O_WRONLY | O_CREAT, 0644); if (file_fd < 0) { PERROR(_("open of '%s' failed"), args.filename); return -1; } } } if (args.silent < 2) get_show_stats(&args, parms, 0); if (file_fd >= 0) { if ((dvr_fd = open(args.dvr_dev, O_RDONLY)) < 0) { PERROR(_("failed opening '%s'"), args.dvr_dev); goto err; } if (!timeout_flag) fprintf(stderr, _("Record to file '%s' started\n"), args.filename); copy_to_file(dvr_fd, file_fd, args.timeout, args.silent); } else { if (!timeout_flag) fprintf(stderr, _("DVR interface '%s' can now be opened\n"), args.dvr_dev); get_show_stats(&args, parms, 1); } if (args.silent < 2) get_show_stats(&args, parms, 0); } err = 0; err: if (file_fd > 0) close(file_fd); if (dvr_fd > 0) close(dvr_fd); if (pat_fd > 0) close(pat_fd); if (pmt_fd > 0) close(pmt_fd); if (audio_fd > 0) close(audio_fd); if (video_fd > 0) close(video_fd); if (parms) dvb_fe_close(parms); if (args.confname) free(args.confname); if (args.demux_dev) free(args.demux_dev); if (args.dvr_dev) free(args.dvr_dev); return err; }
static int parse(struct arguments *args, struct dvb_v5_fe_parms *parms, char *channel, int *vpid, int *apid, int *sid) { struct dvb_file *dvb_file; struct dvb_entry *entry; int i; uint32_t sys; /* This is used only when reading old formats */ switch (parms->current_sys) { case SYS_DVBT: case SYS_DVBS: case SYS_DVBC_ANNEX_A: case SYS_ATSC: sys = parms->current_sys; break; case SYS_DVBC_ANNEX_C: sys = SYS_DVBC_ANNEX_A; break; case SYS_DVBC_ANNEX_B: sys = SYS_ATSC; break; case SYS_ISDBT: case SYS_DTMB: sys = SYS_DVBT; break; default: sys = SYS_UNDEFINED; break; } dvb_file = dvb_read_file_format(args->confname, sys, args->input_format); if (!dvb_file) return -2; for (entry = dvb_file->first_entry; entry != NULL; entry = entry->next) { if (entry->channel && !strcmp(entry->channel, channel)) break; if (entry->vchannel && !strcmp(entry->vchannel, channel)) break; } /* * Give a second shot, using a case insensitive seek */ if (!entry) { for (entry = dvb_file->first_entry; entry != NULL; entry = entry->next) { if (entry->channel && !strcasecmp(entry->channel, channel)) break; } } /* * When this tool is used to just tune to a channel, to monitor it or * to capture all PIDs, all it needs is a frequency. * So, let the tool to accept a frequency as the tuning channel on those * cases. * This way, a file in "channel" format can be used instead of a zap file. * It is also easier to use it for testing purposes. */ if (!entry && (args->traffic_monitor || args->all_pids || args->exit_after_tuning)) { uint32_t f, freq = atoi(channel); if (freq) { for (entry = dvb_file->first_entry; entry != NULL; entry = entry->next) { dvb_retrieve_entry_prop(entry, DTV_FREQUENCY, &f); if (f == freq) break; } } } if (!entry) { ERROR(_("Can't find channel")); dvb_file_free(dvb_file); return -3; } /* * Both the DVBv5 format and the command line parameters may * specify the LNBf. If both have the definition, use the one * provided by the command line parameter, overriding the one * stored in the channel file. */ if (entry->lnb && !parms->lnb) { int lnb = dvb_sat_search_lnb(entry->lnb); if (lnb == -1) { PERROR(_("unknown LNB %s\n"), entry->lnb); dvb_file_free(dvb_file); return -1; } parms->lnb = dvb_sat_get_lnb(lnb); } if (entry->video_pid) { if (args->n_vpid < entry->video_pid_len) *vpid = entry->video_pid[args->n_vpid]; else *vpid = entry->video_pid[0]; } if (entry->audio_pid) { if (args->n_apid < entry->audio_pid_len) *apid = entry->audio_pid[args->n_apid]; else *apid = entry->audio_pid[0]; } if (entry->other_el_pid) { int i, type = -1; for (i = 0; i < entry->other_el_pid_len; i++) { if (type != entry->other_el_pid[i].type) { type = entry->other_el_pid[i].type; if (i) fprintf(stderr, "\n"); fprintf(stderr, _("service has pid type %02x: "), type); } fprintf(stderr, " %d", entry->other_el_pid[i].pid); } fprintf(stderr, "\n"); } *sid = entry->service_id; /* First of all, set the delivery system */ dvb_retrieve_entry_prop(entry, DTV_DELIVERY_SYSTEM, &sys); dvb_set_compat_delivery_system(parms, sys); /* Copy data into parms */ for (i = 0; i < entry->n_props; i++) { uint32_t data = entry->props[i].u.data; /* Don't change the delivery system */ if (entry->props[i].cmd == DTV_DELIVERY_SYSTEM) continue; dvb_fe_store_parm(parms, entry->props[i].cmd, data); if (parms->current_sys == SYS_ISDBT) { dvb_fe_store_parm(parms, DTV_ISDBT_PARTIAL_RECEPTION, 0); dvb_fe_store_parm(parms, DTV_ISDBT_SOUND_BROADCASTING, 0); dvb_fe_store_parm(parms, DTV_ISDBT_LAYER_ENABLED, 0x07); if (entry->props[i].cmd == DTV_CODE_RATE_HP) { dvb_fe_store_parm(parms, DTV_ISDBT_LAYERA_FEC, data); dvb_fe_store_parm(parms, DTV_ISDBT_LAYERB_FEC, data); dvb_fe_store_parm(parms, DTV_ISDBT_LAYERC_FEC, data); } else if (entry->props[i].cmd == DTV_MODULATION) { dvb_fe_store_parm(parms, DTV_ISDBT_LAYERA_MODULATION, data); dvb_fe_store_parm(parms, DTV_ISDBT_LAYERB_MODULATION, data); dvb_fe_store_parm(parms, DTV_ISDBT_LAYERC_MODULATION, data); } } if (parms->current_sys == SYS_ATSC && entry->props[i].cmd == DTV_MODULATION) { if (data != VSB_8 && data != VSB_16) dvb_fe_store_parm(parms, DTV_DELIVERY_SYSTEM, SYS_DVBC_ANNEX_B); } } dvb_file_free(dvb_file); return 0; }
static int dev_set_parms(uint32_t seq, char *cmd, int fd, char *buf, ssize_t size) { struct dvb_v5_fe_parms_priv *parms = (void *)dvb->fe_parms; struct dvb_v5_fe_parms *par = (void *)parms; int ret, i; char *p = buf; const char *old_lnb = ""; char new_lnb[256]; if (verbose) dbg("dev_set_parms called"); /* first the public params that aren't read only */ /* Get current LNB name */ if (par->lnb) old_lnb = par->lnb->name; ret = scan_data(p, size, "%i%i%s%i%i%i%i%s%s", &par->abort, &par->lna, new_lnb, &par->sat_number, &par->freq_bpf, &par->diseqc_wait, &par->verbose, default_charset, output_charset); if (ret < 0) goto error; p += ret; size -= ret; /* Now, the private ones */ ret = scan_data(p, size, "%i", &i); if (ret < 0) goto error; parms->country = i; p += ret; size -= ret; for (i = 0; i < parms->n_props; i++) { ret = scan_data(p, size, "%i%i", &parms->dvb_prop[i].cmd, &parms->dvb_prop[i].u.data); if (ret < 0) goto error; p += ret; size -= ret; } if (!*new_lnb) { par->lnb = NULL; } else if (strcmp(old_lnb, new_lnb)) { int lnb = dvb_sat_search_lnb(new_lnb); if (lnb < 0) { dvb_logerr("Invalid lnb: %s", new_lnb); ret = -1; goto error; } par->lnb = dvb_sat_get_lnb(lnb); } par->output_charset = output_charset; par->default_charset = default_charset; ret = __dvb_fe_set_parms(par); error: return send_data(fd, "%i%s%i", seq, cmd, ret); }
static int parse(struct arguments *args, struct dvb_v5_fe_parms *parms, char *channel, int *vpid, int *apid, int *sid) { struct dvb_file *dvb_file; struct dvb_entry *entry; int i; uint32_t sys; /* This is used only when reading old formats */ switch (parms->current_sys) { case SYS_DVBT: case SYS_DVBS: case SYS_DVBC_ANNEX_A: case SYS_ATSC: sys = parms->current_sys; break; case SYS_DVBC_ANNEX_C: sys = SYS_DVBC_ANNEX_A; break; case SYS_DVBC_ANNEX_B: sys = SYS_ATSC; break; case SYS_ISDBT: sys = SYS_DVBT; break; default: sys = SYS_UNDEFINED; break; } dvb_file = dvb_read_file_format(args->confname, sys, args->input_format); if (!dvb_file) return -2; for (entry = dvb_file->first_entry; entry != NULL; entry = entry->next) { if (!strcmp(entry->channel, channel)) break; if (entry->vchannel && !strcmp(entry->vchannel, channel)) break; } /* * Give a second shot, using a case insensitive seek */ if (!entry) { for (entry = dvb_file->first_entry; entry != NULL; entry = entry->next) { if (!strcasecmp(entry->channel, channel)) break; } } if (!entry) { ERROR("Can't find channel"); return -3; } if (entry->lnb) { int lnb = dvb_sat_search_lnb(entry->lnb); if (lnb == -1) { PERROR("unknown LNB %s\n", entry->lnb); return -1; } parms->lnb = dvb_sat_get_lnb(lnb); } if (entry->video_pid) { if (args->n_vpid < entry->video_pid_len) *vpid = entry->video_pid[args->n_vpid]; else *vpid = entry->video_pid[0]; } if (entry->audio_pid) { if (args->n_apid < entry->audio_pid_len) *apid = entry->audio_pid[args->n_apid]; else *apid = entry->audio_pid[0]; } if (entry->other_el_pid) { int i, type = -1; for (i = 0; i < entry->other_el_pid_len; i++) { if (type != entry->other_el_pid[i].type) { type = entry->other_el_pid[i].type; if (i) fprintf(stderr, "\n"); fprintf(stderr, "service has pid type %02x: ", type); } fprintf(stderr, " %d", entry->other_el_pid[i].pid); } fprintf(stderr, "\n"); } *sid = entry->service_id; /* First of all, set the delivery system */ for (i = 0; i < entry->n_props; i++) if (entry->props[i].cmd == DTV_DELIVERY_SYSTEM) dvb_set_compat_delivery_system(parms, entry->props[i].u.data); /* Copy data into parms */ for (i = 0; i < entry->n_props; i++) { uint32_t data = entry->props[i].u.data; /* Don't change the delivery system */ if (entry->props[i].cmd == DTV_DELIVERY_SYSTEM) continue; dvb_fe_store_parm(parms, entry->props[i].cmd, data); if (parms->current_sys == SYS_ISDBT) { dvb_fe_store_parm(parms, DTV_ISDBT_PARTIAL_RECEPTION, 0); dvb_fe_store_parm(parms, DTV_ISDBT_SOUND_BROADCASTING, 0); dvb_fe_store_parm(parms, DTV_ISDBT_LAYER_ENABLED, 0x07); if (entry->props[i].cmd == DTV_CODE_RATE_HP) { dvb_fe_store_parm(parms, DTV_ISDBT_LAYERA_FEC, data); dvb_fe_store_parm(parms, DTV_ISDBT_LAYERB_FEC, data); dvb_fe_store_parm(parms, DTV_ISDBT_LAYERC_FEC, data); } else if (entry->props[i].cmd == DTV_MODULATION) { dvb_fe_store_parm(parms, DTV_ISDBT_LAYERA_MODULATION, data); dvb_fe_store_parm(parms, DTV_ISDBT_LAYERB_MODULATION, data); dvb_fe_store_parm(parms, DTV_ISDBT_LAYERC_MODULATION, data); } } if (parms->current_sys == SYS_ATSC && entry->props[i].cmd == DTV_MODULATION) { if (data != VSB_8 && data != VSB_16) dvb_fe_store_parm(parms, DTV_DELIVERY_SYSTEM, SYS_DVBC_ANNEX_B); } } #if 0 /* HACK to test the write file function */ write_dvb_file("dvb_channels.conf", dvb_file); #endif dvb_file_free(dvb_file); return 0; }