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; }
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: 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; /* * If the channel file has duplicated frequencies, or some * entries without any frequency at all, discard. */ if (retrieve_entry_prop(entry, DTV_FREQUENCY, &freq)) continue; shift = estimate_freq_shift(parms); if (retrieve_entry_prop(entry, DTV_POLARIZATION, &pol)) pol = POLARIZATION_OFF; if (!new_freq_is_needed(dvb_file->first_entry, entry, freq, pol, shift)) continue; count++; dvb_log("Scanning frequency #%d %d", count, freq); /* * 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 */ store_dvb_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) 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; }