bool CFrontend::setInput(CZapitChannel * channel, bool nvod) { transponder_list_t::iterator tpI; transponder_id_t ct = nvod ? (channel->getTransponderId() & 0xFFFFFFFFULL) : channel->getTransponderId(); transponder_id_t current_id = nvod ? (currentTransponder.TP_id & 0xFFFFFFFFULL) : currentTransponder.TP_id; //printf("CFrontend::setInput tuned %d nvod %d current_id %llx new %llx\n\n", tuned, nvod, current_id, ct); if (tuned && (ct == current_id)) return false; if (nvod) { for (tpI = transponders.begin(); tpI != transponders.end(); ++tpI) { if ((ct & 0xFFFFFFFFULL) == (tpI->first & 0xFFFFFFFFULL)) break; } } else tpI = transponders.find(channel->getTransponderId()); if (tpI == transponders.end()) { printf("Transponder %" PRIx64 " for channel %" PRIx64 " not found\n", ct, channel->getChannelID()); return false; } currentTransponder.TP_id = tpI->first; currentTransponder.polarization = tpI->second.polarization; currentSatellitePosition = channel->getSatellitePosition(); setInput(channel->getSatellitePosition(), tpI->second.feparams.dvb_feparams.frequency, tpI->second.polarization); return true; }
void SaveServices(bool tocopy) { transponder_id_t tpid = 0; FILE * fd = 0; bool updated = 0; tallchans_iterator ccI; tallchans_iterator dI; transponder_list_t::iterator tI; char tpstr[256]; bool tpdone = 0; bool satdone = 0; int processed = 0; sat_iterator_t spos_it; updated = 0; dprintf(DEBUG_INFO, "total channels: %d\n", allchans.size()); fd = fopen(SERVICES_TMP, "w"); if(!fd) { perror(SERVICES_TMP); return; } // headers fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<zapit api=\"3\">\n"); // loop througth satpos for (spos_it = satellitePositions.begin(); spos_it != satellitePositions.end(); spos_it++) { satdone = 0; // loop througth TPs for(tI = transponders.begin(); tI != transponders.end(); tI++) { t_satellite_position satpos = GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first) & 0xFFF; tpdone = 0; if(GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first) & 0xF000) satpos = -satpos; if(satpos != spos_it->first) { dprintf(DEBUG_DEBUG, "Sat position %d not found !!\n", satpos); continue; } switch(spos_it->second.type) { case DVB_S: sprintf(tpstr, "\t\t<TS id=\"%04x\" on=\"%04x\" frq=\"%u\" inv=\"%hu\" sr=\"%u\" fec=\"%hu\" pol=\"%hu\">\n", tI->second.transport_stream_id, tI->second.original_network_id, tI->second.feparams.frequency, tI->second.feparams.inversion, tI->second.feparams.u.qpsk.symbol_rate, tI->second.feparams.u.qpsk.fec_inner, tI->second.polarization); break; case DVB_C: sprintf(tpstr, "\t\t<TS id=\"%04x\" on=\"%04x\" frq=\"%u\" inv=\"%hu\" sr=\"%u\" fec=\"%hu\" mod=\"%hu\">\n", tI->second.transport_stream_id, tI->second.original_network_id, tI->second.feparams.frequency, tI->second.feparams.inversion, tI->second.feparams.u.qam.symbol_rate, tI->second.feparams.u.qam.fec_inner, tI->second.feparams.u.qam.modulation); break; case DVB_T: sprintf(tpstr, "\t\t<TS id=\"%04x\" on=\"%04x\" frq=\"%u\" inv=\"%hu\" band=\"%hu\" HP=\"%hu\" LP=\"%hu\" const=\"%hu\" trans=\"%hu\" guard=\"%hu\" hierarchy=\"%hu\">\n", tI->second.transport_stream_id, tI->second.original_network_id, tI->second.feparams.frequency, tI->second.feparams.inversion, tI->second.feparams.u.ofdm.bandwidth, tI->second.feparams.u.ofdm.code_rate_HP, tI->second.feparams.u.ofdm.code_rate_LP, tI->second.feparams.u.ofdm.constellation,tI->second.feparams.u.ofdm.transmission_mode, tI->second.feparams.u.ofdm.guard_interval, tI->second.feparams.u.ofdm.hierarchy_information); break; default: break; } tpid = tI->first; // loop througth channels for (ccI = allchans.begin(); ccI != allchans.end(); ccI++) { if(ccI->second.getTransponderId() == tpid) { if(!satdone) { switch(spos_it->second.type) { case DVB_S: { fprintf(fd, "\t<sat name=\"%s\" position=\"%hd\" diseqc=\"%hd\" uncommited=\"%hd\">\n",spos_it->second.name.c_str(), spos_it->first, spos_it->second.diseqc, spos_it->second.uncommited); } break; case DVB_C: { fprintf(fd, "\t<cable name=\"%s\">\n", spos_it->second.name.c_str()); } break; case DVB_T: { fprintf(fd, "\t<terrestrial name=\"%s\">\n", spos_it->second.name.c_str()); } break; default: break; } satdone = 1; } if(!tpdone) { fprintf(fd, "%s", tpstr); tpdone = 1; } if(ccI->second.getPidsFlag()) { fprintf(fd, "\t\t\t<S i=\"%04x\" n=\"%s\" v=\"%x\" a=\"%x\" p=\"%x\" pmt=\"%x\" tx=\"%x\" t=\"%x\" vt=\"%d\" s=\"%d\"/>\n", ccI->second.getServiceId(), convert_UTF8_To_UTF8_XML(ccI->second.getName().c_str()).c_str(), ccI->second.getVideoPid(), ccI->second.getPreAudioPid(), ccI->second.getPcrPid(), ccI->second.getPmtPid(), ccI->second.getTeletextPid(), ccI->second.getServiceType(true), ccI->second.videoType, ccI->second.scrambled); } else { fprintf(fd, "\t\t\t<S i=\"%04x\" n=\"%s\" t=\"%x\" s=\"%d\"/>\n", ccI->second.getServiceId(), convert_UTF8_To_UTF8_XML(ccI->second.getName().c_str()).c_str(), ccI->second.getServiceType(true), ccI->second.scrambled); } processed++; } } if(tpdone) fprintf(fd, "\t\t</TS>\n"); } if(satdone) { switch(spos_it->second.type) { case DVB_S: fprintf(fd, "\t</sat>\n"); break; case DVB_C: fprintf(fd, "\t</cable>\n"); break; case DVB_T: fprintf(fd, "\t</terrestrial>\n"); break; default: break; } } } fprintf(fd, "</zapit>\n"); fclose(fd); // create zapit ordner if missed struct stat statInfo; int res = stat(CONFIGDIR "/zapit", &statInfo); if (res == -1) { if (errno == ENOENT) { res = safe_mkdir((char *)CONFIGDIR "/zapit"); if (res != 0) perror("[getservices] mkdir"); } else { perror("[getservices] stat"); } } if(tocopy) { zapit_cp((char *) SERVICES_TMP, (char *) SERVICES_XML); unlink(SERVICES_TMP); } dprintf(DEBUG_INFO, "processed channels: %d\n", processed); }
void ParseTransponders(xmlNodePtr node, t_satellite_position satellitePosition, uint8_t Source ) { t_transport_stream_id transport_stream_id; t_original_network_id original_network_id; FrontendParameters feparams; uint8_t polarization = 0; freq_id_t freq; tcnt = 0; memset(&feparams, 0, sizeof(FrontendParameters)); // read all transponders while ((node = xmlGetNextOccurence(node, "TS")) != NULL) { // common transport_stream_id = xmlGetNumericAttribute(node, "id", 16); original_network_id = xmlGetNumericAttribute(node, "on", 16); feparams.frequency = xmlGetNumericAttribute(node, "frq", 0); feparams.inversion = (fe_spectral_inversion) xmlGetNumericAttribute(node, "inv", 0); // DVB-C if(Source == DVB_C) { feparams.u.qam.symbol_rate = xmlGetNumericAttribute(node, "sr", 0); feparams.u.qam.fec_inner = (fe_code_rate_t) xmlGetNumericAttribute(node, "fec", 0); feparams.u.qam.modulation = (fe_modulation_t) xmlGetNumericAttribute(node, "mod", 0); } // DVB-T else if(Source == DVB_T) { feparams.u.ofdm.bandwidth = (fe_bandwidth_t) xmlGetNumericAttribute(node, "band", 0); feparams.u.ofdm.code_rate_HP = (fe_code_rate_t) xmlGetNumericAttribute(node, "HP", 0); feparams.u.ofdm.code_rate_LP = (fe_code_rate_t) xmlGetNumericAttribute(node, "LP", 0); feparams.u.ofdm.constellation = (fe_modulation_t) xmlGetNumericAttribute(node, "const", 0); feparams.u.ofdm.transmission_mode = (fe_transmit_mode_t) xmlGetNumericAttribute(node, "trans", 0); feparams.u.ofdm.guard_interval = (fe_guard_interval_t) xmlGetNumericAttribute(node, "guard", 0); feparams.u.ofdm.hierarchy_information = (fe_hierarchy_t) xmlGetNumericAttribute(node, "hierarchy", 0); } // DVB-S else if(Source == DVB_S) { feparams.u.qpsk.fec_inner = (fe_code_rate_t) xmlGetNumericAttribute(node, "fec", 0); feparams.u.qpsk.symbol_rate = xmlGetNumericAttribute(node, "sr", 0); polarization = xmlGetNumericAttribute(node, "pol", 0); if(feparams.u.qpsk.symbol_rate < 50000) feparams.u.qpsk.symbol_rate = feparams.u.qpsk.symbol_rate * 1000; // ??? if(feparams.frequency < 20000) feparams.frequency = feparams.frequency*1000; } if(Source == DVB_C) freq = feparams.frequency/100; else if(Source == DVB_S) freq = feparams.frequency/1000; else if(Source == DVB_T) freq = feparams.frequency/1000000; // add current transponder to list transponder_id_t tid = CREATE_TRANSPONDER_ID_FROM_SATELLITEPOSITION_ORIGINALNETWORK_TRANSPORTSTREAM_ID(freq, satellitePosition, original_network_id, transport_stream_id); pair<map<transponder_id_t, transponder>::iterator, bool> ret; ret = transponders.insert (std::pair <transponder_id_t, transponder> ( tid, transponder(transport_stream_id, feparams, polarization, original_network_id))); if (ret.second == false) printf("[zapit] duplicate transponder id %llx freq %d\n", tid, feparams.frequency); // read channels that belong to the current transponder ParseChannels(node->xmlChildrenNode, transport_stream_id, original_network_id, satellitePosition, freq, polarization); // hop to next transponder node = node->xmlNextNode; } return; }
int parse_nit(const t_satellite_position satellite_position, const unsigned char DiSEqC) { CDemux dmx; unsigned char buffer[NIT_SIZE]; /* position in buffer */ unsigned short pos; unsigned short pos2; /* network_information_section elements */ unsigned short section_length; unsigned short network_descriptors_length; unsigned short transport_descriptors_length; unsigned short transport_stream_loop_length; t_transport_stream_id transport_stream_id; t_original_network_id original_network_id; // unsigned short network_id; transponder_id_t transponder_id; unsigned char filter[DMX_FILTER_SIZE]; unsigned char mask[DMX_FILTER_SIZE]; memset(filter, 0x00, DMX_FILTER_SIZE); memset(mask, 0x00, DMX_FILTER_SIZE); filter[0] = 0x40; filter[4] = 0x00; mask[0] = 0xFF; mask[4] = 0xFF; do { if ((dmx.sectionFilter(0x10, filter, mask) < 0) || (dmx.read(buffer, NIT_SIZE) < 0)) return -1; section_length = ((buffer[1] & 0x0F) << 8) + buffer[2]; // network_id = ((buffer[3] << 8)| buffer [4]); network_descriptors_length = ((buffer[8] & 0x0F) << 8) | buffer[9]; for (pos = 10; pos < network_descriptors_length + 10; pos += buffer[pos + 1] + 2) { switch (buffer[pos]) { /* case 0x0F: Private_data_indicator_descriptor(buffer + pos); break; */ case 0x40: network_name_descriptor(buffer + pos); break; case 0x4A: linkage_descriptor(buffer + pos); break; case 0x5B: multilingual_network_name_descriptor(buffer + pos); break; /* case 0x5F: private_data_specifier_descriptor(buffer + pos); break; */ case 0x80: /* unknown, Eutelsat 13.0E */ break; case 0x90: /* unknown, Eutelsat 13.0E */ break; default: DBG("first_descriptor_tag: %02x", buffer[pos]); break; } } transport_stream_loop_length = ((buffer[pos] & 0x0F) << 8) | buffer[pos + 1]; if (!transport_stream_loop_length) continue; for (pos += 2; pos < section_length - 3; pos += transport_descriptors_length + 6) { transport_stream_id = (buffer[pos] << 8) | buffer[pos + 1]; original_network_id = (buffer[pos + 2] << 8) | buffer[pos + 3]; transport_descriptors_length = ((buffer[pos + 4] & 0x0F) << 8) | buffer[pos + 5]; // frequency will be inserted in satellite/cable_delivery_system_descriptor() transponder_id = CREATE_TRANSPONDER_ID_FROM_FREQUENCY_SATELLITEPOSITION_ORIGINALNETWORK_TRANSPORTSTREAM_ID(0, satellite_position,original_network_id,transport_stream_id); if (transponders.find(transponder_id) == transponders.end()) { for (pos2 = pos + 6; pos2 < pos + transport_descriptors_length + 6; pos2 += buffer[pos2 + 1] + 2) { switch (buffer[pos2]) { case 0x41: service_list_descriptor(buffer + pos2, transport_stream_id, original_network_id); break; case 0x42: stuffing_descriptor(buffer + pos2); break; case 0x43: if (satellite_delivery_system_descriptor(buffer + pos2, transponder_id, DiSEqC) < 0) return -2; break; case 0x44: if (cable_delivery_system_descriptor(buffer + pos2, transponder_id) < 0) return -2; break; case 0x5A: if (terrestrial_delivery_system_descriptor(buffer + pos2) < 0) return -2; break; case 0x5F: private_data_specifier_descriptor(buffer + pos2); break; case 0x62: frequency_list_descriptor(buffer + pos2); break; case 0x82: /* unknown, Eutelsat 13.0E */ break; default: DBG("second_descriptor_tag: %02x", buffer[pos2]); break; } } } } } while (filter[4]++ != buffer[7]); return 0; }
bool CServiceManager::SaveCurrentServices(transponder_id_t tpid) { channel_map_iterator_t ccI; channel_map_iterator_t dI; transponder_list_t::iterator tI; char satstr[256]; char buffer[256]; FILE * fd = 0; FILE * fd1 = 0; bool updated = 0; bool tpdone = 0; bool satfound = 0; tI = transponders.find(tpid); if(tI == transponders.end()) { printf("[sdt monitor] tp not found ?!\n"); return false; } t_satellite_position satellitePosition = GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tpid) & 0xFFF; if(GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tpid) & 0xF000) satellitePosition = -satellitePosition; fd = fopen(CURRENTSERVICES_TMP, "w"); if(!fd) { printf("[sdt monitor] " CURRENTSERVICES_TMP ": cant open!\n"); return false; } sat_iterator_t spos_it = satellitePositions.find(satellitePosition); if(spos_it == satellitePositions.end()){ fclose(fd); return false; } switch (CFrontend::getInstance()->getInfo()->type) { case FE_QPSK: /* satellite */ sprintf(satstr, "\t<%s name=\"%s\" position=\"%hd\">\n", "sat", spos_it->second.name.c_str(), satellitePosition); break; case FE_QAM: /* cable */ sprintf(satstr, "\t<%s name=\"%s\"\n", "cable", spos_it->second.name.c_str()); break; case FE_OFDM: default: break; } fd1 = fopen(CURRENTSERVICES_XML, "r"); if(!fd1) { fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<zapit>\n"); } else { fgets(buffer, 255, fd1); while(!feof(fd1) && !strstr(buffer, satfound ? "</sat>" : "</zapit>")) { if(!satfound && !strcmp(buffer, satstr)) satfound = 1; fputs(buffer, fd); fgets(buffer, 255, fd1); } } for (channel_map_iterator_t cI = curchans.begin(); cI != curchans.end(); cI++) { ccI = allchans.find(cI->second.getChannelID()); if(ccI == allchans.end()) { WriteCurrentService(fd, satfound, tpdone, updated, satstr, tI->second, cI->second, "add"); } else { if(strcmp(cI->second.getName().c_str(), ccI->second.getName().c_str()) || cI->second.scrambled != ccI->second.scrambled) { WriteCurrentService(fd, satfound, tpdone, updated, satstr, tI->second, cI->second, "replace"); } } } for (ccI = allchans.begin(); ccI != allchans.end(); ccI++) { if(ccI->second.getTransponderId() == tpid) { dI = curchans.find(ccI->second.getChannelID()); if(dI == curchans.end()) WriteCurrentService(fd, satfound, tpdone, updated, satstr, tI->second, ccI->second, "remove"); } } if(tpdone) { fprintf(fd, "\t\t</TS>\n"); fprintf(fd, "\t</sat>\n"); } else if(satfound) fprintf(fd, "\t</sat>\n"); if(fd1) { fgets(buffer, 255, fd1); while(!feof(fd1)) { fputs(buffer, fd); fgets(buffer, 255, fd1); } if(!satfound) fprintf(fd, "</zapit>\n"); fclose(fd1); } else fprintf(fd, "</zapit>\n"); fclose(fd); rename(CURRENTSERVICES_TMP, CURRENTSERVICES_XML); return updated; }
void CServiceManager::SaveServices(bool tocopy) { transponder_id_t tpid = 0; FILE * fd = 0; bool updated = 0; channel_map_iterator_t ccI; channel_map_iterator_t dI; transponder_list_t::iterator tI; bool tpdone = 0; bool satdone = 0; int processed = 0; sat_iterator_t spos_it; updated = 0; #ifdef SAVE_DEBUG set<t_channel_id> chans_processed; DBG("\nChannel size: %d\n", sizeof(CZapitChannel)); #endif printf("total channels: %d\n", allchans.size()); fd = fopen(SERVICES_TMP, "w"); if(!fd) { perror(SERVICES_TMP); return; } fprintf(fd, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<zapit api=\"3\">\n"); for (spos_it = satellitePositions.begin(); spos_it != satellitePositions.end(); spos_it++) { satdone = 0; #ifdef SAVE_DEBUG printf("Process sat: %s\n", spos_it->second.name.c_str()); printf("processed channels: %d\n", chans_processed.size()); printf("tp count: %d\n", transponders.size()); #endif for(tI = transponders.begin(); tI != transponders.end(); tI++) { t_satellite_position satpos = GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first) & 0xFFF; tpdone = 0; if(GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first) & 0xF000) satpos = -satpos; if(satpos != spos_it->first) { #ifdef SAVE_DEBUG printf("Sat position %d not found !!\n", satpos); #endif continue; } tpid = tI->first; for (ccI = allchans.begin(); ccI != allchans.end(); ccI++) { if(ccI->second.getTransponderId() == tpid) { if(!satdone) { WriteSatHeader(fd, spos_it->second); satdone = 1; } if(!tpdone) { WriteTransponderHeader(fd, tI->second); tpdone = 1; } ccI->second.dumpServiceXml(fd); processed++; #ifdef SAVE_DEBUG chans_processed.insert(ccI->second.getChannelID()); #endif } } if(tpdone) fprintf(fd, "\t\t</TS>\n"); } if(satdone) { switch (CFrontend::getInstance()->getInfo()->type) { case FE_QPSK: fprintf(fd, "\t</sat>\n"); break; case FE_QAM: fprintf(fd, "\t</cable>\n"); break; default: break; } } } fprintf(fd, "</zapit>\n"); fclose(fd); if(tocopy) { CopyFile((char *) SERVICES_TMP, (char *) SERVICES_XML); unlink(SERVICES_TMP); } #ifdef SAVE_DEBUG printf("processed channels: %d\n", chans_processed.size()); int i = 0; for (channel_map_iterator_t it = allchans.begin(); it != allchans.end(); it++) if (chans_processed.find(it->first) == chans_processed.end()) printf("unused channel %d sat %d freq %d sid %04X: %s\n", ++i, it->second.getSatellitePosition(), it->second.getFreqId(), it->second.getServiceId(), it->second.getName().c_str()); chans_processed.clear(); #endif printf("processed channels: %d\n", processed); }
bool CServiceManager::LoadServices(bool only_current) { xmlDocPtr parser; static bool satcleared = 0;//clear only once, because menu is static service_count = 0; printf("[zapit] Loading services, channel size %d ..\n", sizeof(CZapitChannel)); fe_type_t frontendType = CFrontend::getInstance()->getInfo()->type; if(only_current) goto do_current; TIMER_START(); allchans.clear(); transponders.clear(); select_transponders.clear(); fake_tid = fake_nid = 0; if (ParseScanXml()) { t_satellite_position position = 0; if(!satcleared) satellitePositions.clear(); satcleared = 1; xmlNodePtr search = xmlDocGetRootElement(scanInputParser)->xmlChildrenNode; while (search) { if (!(strcmp(xmlGetName(search), "sat"))) { position = xmlGetSignedNumericAttribute(search, "position", 10); char * name = xmlGetAttribute(search, "name"); /* FIXME reuse this */ if(satellitePositions.find(position) == satellitePositions.end()) { InitSatPosition(position); } satellitePositions[position].name = name; } else if(!(strcmp(xmlGetName(search), "cable"))) { char * name = xmlGetAttribute(search, "name"); if(satellitePositions.find(position) == satellitePositions.end()) { InitSatPosition(position); } satellitePositions[position].name = name; } ParseSatTransponders(frontendType, search, position); position++; search = search->xmlNextNode; } } parser = parseXmlFile(SERVICES_XML); if (parser != NULL) { xmlNodePtr search = xmlDocGetRootElement(parser)->xmlChildrenNode; while (search) { if (!(strcmp(xmlGetName(search), "sat"))) { t_satellite_position position = xmlGetSignedNumericAttribute(search, "position", 10); char * name = xmlGetAttribute(search, "name"); if(satellitePositions.find(position) == satellitePositions.end()) { InitSatPosition(position); satellitePositions[position].name = name; } } search = search->xmlNextNode; } FindTransponder(xmlDocGetRootElement(parser)->xmlChildrenNode); xmlFreeDoc(parser); } if(frontendType == FE_QPSK) { LoadMotorPositions(); } printf("[zapit] %d services loaded (%d)...\n", service_count, allchans.size()); TIMER_STOP("[zapit] service loading took"); if(0) { //zapit_debug) {//FIXME sat_iterator_t sit; for(sit = satellitePositions.begin(); sit != satellitePositions.end(); sit++) printf("satelliteName = %s (%d), satellitePosition = %d motor position = %d usals %d\n", sit->second.name.c_str(), sit->second.name.size(), sit->first, sit->second.motor_position, sit->second.use_usals); } do_current: DBG("Loading current..\n"); if (CZapit::getInstance()->scanSDT() && (parser = parseXmlFile(CURRENTSERVICES_XML))) { newfound = 0; printf("[getservices] " CURRENTSERVICES_XML " found.\n"); FindTransponder(xmlDocGetRootElement(parser)->xmlChildrenNode); xmlFreeDoc(parser); unlink(CURRENTSERVICES_XML); if(newfound) SaveServices(true); } if(!only_current) { parser = parseXmlFile(MYSERVICES_XML); if (parser != NULL) { FindTransponder(xmlDocGetRootElement(parser)->xmlChildrenNode); xmlFreeDoc(parser); } } return true; }
void CServiceManager::ParseTransponders(xmlNodePtr node, t_satellite_position satellitePosition, bool cable) { t_transport_stream_id transport_stream_id; t_original_network_id original_network_id; FrontendParameters feparams; uint8_t polarization = 0; uint16_t freq; tp_count = 0; memset(&feparams, 0, sizeof(FrontendParameters)); /* read all transponders */ while ((node = xmlGetNextOccurence(node, "TS")) != NULL) { transport_stream_id = xmlGetNumericAttribute(node, "id", 16); original_network_id = xmlGetNumericAttribute(node, "on", 16); feparams.frequency = xmlGetNumericAttribute(node, "frq", 0); feparams.inversion = (fe_spectral_inversion) xmlGetNumericAttribute(node, "inv", 0); if(cable) { feparams.u.qam.symbol_rate = xmlGetNumericAttribute(node, "sr", 0); feparams.u.qam.fec_inner = (fe_code_rate_t) xmlGetNumericAttribute(node, "fec", 0); feparams.u.qam.modulation = (fe_modulation_t) xmlGetNumericAttribute(node, "mod", 0); if (feparams.frequency > 1000*1000) feparams.frequency = feparams.frequency/1000; //transponderlist was read from tuxbox //feparams.frequency = (int) 1000 * (int) round ((double) feparams.frequency / (double) 1000); } else { feparams.u.qpsk.fec_inner = (fe_code_rate_t) xmlGetNumericAttribute(node, "fec", 0); feparams.u.qpsk.symbol_rate = xmlGetNumericAttribute(node, "sr", 0); polarization = xmlGetNumericAttribute(node, "pol", 0); if(feparams.u.qpsk.symbol_rate < 50000) feparams.u.qpsk.symbol_rate = feparams.u.qpsk.symbol_rate * 1000; if(feparams.frequency < 20000) feparams.frequency = feparams.frequency*1000; else feparams.frequency = (int) 1000 * (int) round ((double) feparams.frequency / (double) 1000); } if(cable) freq = feparams.frequency/100; else freq = feparams.frequency/1000; transponder_id_t tid = CREATE_TRANSPONDER_ID_FROM_SATELLITEPOSITION_ORIGINALNETWORK_TRANSPORTSTREAM_ID(freq, satellitePosition,original_network_id,transport_stream_id); pair<map<transponder_id_t, transponder>::iterator,bool> ret; ret = transponders.insert ( std::pair <transponder_id_t, transponder> ( tid, transponder (transport_stream_id, feparams, polarization, original_network_id) ) ); if (ret.second == false) printf("[zapit] duplicate transponder id %llx freq %d\n", tid, feparams.frequency); /* read channels that belong to the current transponder */ ParseChannels(node->xmlChildrenNode, transport_stream_id, original_network_id, satellitePosition, freq); /* hop to next transponder */ node = node->xmlNextNode; } return; }