1 #include <lib/dvb/settings.h>
2 #include <lib/dvb/edvb.h>
3 #include <lib/dvb/frontend.h>
5 typedef std::list
<eServiceReferenceDVB
>::iterator ServiceReferenceDVBIterator
;
7 eDVBSettings::eDVBSettings(eDVB
&dvb
): dvb(dvb
)
9 transponderlist
=new eTransponderList
;
12 CONNECT( transponderlist
->service_found
, eDVBSettings::service_found
);
13 CONNECT( transponderlist
->service_removed
, eDVBSettings::service_removed
);
16 void eDVBSettings::removeDVBBouquets()
18 for (std::map
<int, eBouquet
*>::iterator
i(bouquet_id_map
.begin()); i
!= bouquet_id_map
.end();)
22 // eDebug("removing bouquet '%s'", i->bouquet_name.c_str());
23 bouquet_name_map
.erase(i
->second
->bouquet_name
); // remove from name map
24 delete i
->second
; // release heap memory
25 bouquet_id_map
.erase(i
++); // remove from id map
30 // eDebug("leaving bouquet '%s'", i->bouquet_name.c_str());
36 void eDVBSettings::removeDVBBouquet(int bouquet_id
)
38 std::map
<int, eBouquet
*>::iterator
i(bouquet_id_map
.find(bouquet_id
));
39 if ( i
!= bouquet_id_map
.end() )
41 bouquet_name_map
.erase(i
->second
->bouquet_name
); // remove from name map
42 delete i
->second
; // release heap memory
43 bouquet_id_map
.erase(i
); // remove from id map
48 void eDVBSettings::renameDVBBouquet(int bouquet_id
, eString
& new_name
)
50 std::map
<int, eBouquet
*>::iterator
i(bouquet_id_map
.find(bouquet_id
));
51 if ( i
!= bouquet_id_map
.end() )
53 bouquet_name_map
.erase(i
->second
->bouquet_name
); // remove from name map
54 bouquet_name_map
[new_name
] = i
->second
;
55 i
->second
->bouquet_name
= new_name
;
60 void eDVBSettings::addDVBBouquet(eDVBNamespace origin
, const BAT
*bat
)
62 eDebug("wir haben da eine bat, id %x our id is %08x", bat
->bouquet_id
, -(bat
->bouquet_id
| 0xF000000));
63 eString bouquet_name
="Weiteres Bouquet";
64 for (ePtrList
<Descriptor
>::const_iterator
i(bat
->bouquet_descriptors
); i
!= bat
->bouquet_descriptors
.end(); ++i
)
66 if (i
->Tag()==DESCR_BOUQUET_NAME
)
68 bouquet_name
=((BouquetNameDescriptor
*)*i
)->name
;
69 bouquet_name
+=" (BAT)";
72 eBouquet
*bouquet
=createBouquet(-(bat
->bouquet_id
|0xF000000), bouquet_name
);
73 bouquet
->list
.clear();
74 for (ePtrList
<BATEntry
>::const_iterator
be(bat
->entries
); be
!= bat
->entries
.end(); ++be
)
75 for (ePtrList
<Descriptor
>::const_iterator
i(be
->transport_descriptors
); i
!= be
->transport_descriptors
.end(); ++i
)
76 if (i
->Tag()==DESCR_SERVICE_LIST
)
78 const ServiceListDescriptor
*s
=(ServiceListDescriptor
*)*i
;
79 for (ePtrList
<ServiceListDescriptorEntry
>::const_iterator
a(s
->entries
); a
!= s
->entries
.end(); ++a
)
84 eTransportStreamID(be
->transport_stream_id
),
85 eOriginalNetworkID(be
->original_network_id
),
86 eServiceID(a
->service_id
), a
->service_type
));
91 eBouquet
*eDVBSettings::getBouquet(int bouquet_id
)
93 std::map
<int, eBouquet
*>::iterator
i(bouquet_id_map
.find(bouquet_id
));
94 if ( i
!= bouquet_id_map
.end() )
99 static eString
beautifyBouquetName(eString bouquet_name
)
101 /* if ( (bouquet_name.find("ARD") != eString::npos)
102 || (bouquet_name.find("ZDF") != eString::npos)
103 || (bouquet_name.find("RTL") != eString::npos)
104 || (bouquet_name.find("n-tv") != eString::npos)
105 || (bouquet_name.find("ProSieben") != eString::npos)
106 || (bouquet_name.find("VIVA") != eString::npos) )
107 bouquet_name="German Free";
109 if ( bouquet_name
.upper().find("POLSAT") != eString::npos
110 || ( bouquet_name
.length() == 5
111 && (bouquet_name
.find("D11") != eString::npos
112 || bouquet_name
.find("D10") != eString::npos
) ) )
113 bouquet_name
="POLSAT";
114 else if (bouquet_name
.find("HRT") != eString::npos
)
115 bouquet_name
="HRT Zagreb";
116 else if (bouquet_name
.find("TVP") != eString::npos
)
118 else if (bouquet_name
.find("RVTS") != eString::npos
)
120 else if (bouquet_name
=="AB SAT")
121 bouquet_name
="ABSAT";
122 else if (bouquet_name
=="Astra-Net")
123 bouquet_name
="ASTRA";
124 else if (bouquet_name
=="CSAT")
125 bouquet_name
="CANALSATELLITE";
126 else if (bouquet_name
.find("SES")!=eString::npos
)
127 bouquet_name
="SES Multimedia";
128 else if (!bouquet_name
)
129 bouquet_name
="no name";
133 eBouquet
*eDVBSettings::getBouquet(eString
& bouquet_name
)
135 std::map
<eString
, eBouquet
*>::iterator
i(bouquet_name_map
.find(bouquet_name
));
136 if ( i
!= bouquet_name_map
.end() )
141 eBouquet
* eDVBSettings::createBouquet(int bouquet_id
, eString bouquet_name
)
143 eBouquet
*n
=getBouquet(bouquet_id
);
146 n
= new eBouquet(bouquet_id
, bouquet_name
);
147 bouquet_name_map
[bouquet_name
] = n
;
148 bouquet_id_map
[bouquet_id
] = n
;
154 eBouquet
*eDVBSettings::createBouquet(eString bouquet_name
)
156 eBouquet
*n
=getBouquet(bouquet_name
);
159 int bouquet_id
=getUnusedBouquetID(0);
160 n
= new eBouquet(bouquet_id
, bouquet_name
);
161 bouquet_name_map
[bouquet_name
] = n
;
162 bouquet_id_map
[bouquet_id
] = n
;
168 int eDVBSettings::getUnusedBouquetID(int range
)
177 while(true) // Evtl hier nochmal nachschauen....
179 if (!getBouquet(bouquet_id
))
186 void eDVBSettings::revalidateBouquets()
188 /*emit*/ dvb
.bouquetListChanged();
194 sortinChannel(eDVBSettings
&edvb
): edvb(edvb
)
197 void operator()(eServiceDVB
&service
)
199 eBouquet
*b
= edvb
.createBouquet(beautifyBouquetName(service
.service_provider
) );
200 b
->add(eServiceReferenceDVB(service
.dvb_namespace
, service
.transport_stream_id
, service
.original_network_id
, service
.service_id
, service
.service_type
));
204 void eDVBSettings::service_found( const eServiceReferenceDVB
&ref
, bool newAdded
)
206 if ( !eDVB::getInstance()->getScanAPI() && newAdded
)
208 eServiceDVB
*service
= transponderlist
->searchService(ref
);
211 eBouquet
*b
= createBouquet(beautifyBouquetName(service
->service_provider
));
212 if ( b
->bouquet_id
>=0 && !b
->list
.size() || std::find(b
->list
.begin(),b
->list
.end(),ref
) == b
->list
.end() )
215 /* emit */ eDVB::getInstance()->serviceListChanged();
221 void eDVBSettings::service_removed( const eServiceReferenceDVB
&ref
)
223 eServiceDVB
*service
= transponderlist
->searchService(ref
);
224 if ( !eDVB::getInstance()->getScanAPI() && service
)
226 eBouquet
*b
= createBouquet(beautifyBouquetName(service
->service_provider
));
227 if (b
->bouquet_id
>=0 )
229 std::list
<eServiceReferenceDVB
>::iterator it
=
230 std::find(b
->list
.begin(), b
->list
.end(), ref
);
231 if ( it
!= b
->list
.end() )
234 if ( !b
->list
.size()) // delete last service in bouquet
235 removeDVBBouquet(b
->bouquet_id
);
236 /* emit */ eDVB::getInstance()->serviceListChanged();
242 void eDVBSettings::sortInChannels()
244 eDebug("sorting in channels");
246 getTransponders()->forEachService(sortinChannel(*this));
247 revalidateBouquets();
253 saveService(FILE *out
): f(out
)
255 fprintf(f
, "services\n");
257 void operator()(eServiceDVB
& s
)
259 fprintf(f
, "%04x:%08x:%04x:%04x:%d:%d\n", s
.service_id
.get(), s
.dvb_namespace
.get(), s
.transport_stream_id
.get(), s
.original_network_id
.get(), s
.service_type
, s
.service_number
);
260 fprintf(f
, "%s\n", s
.service_name
.c_str());
262 fprintf(f
, "f:%x,", s
.dxflags
);
263 for (int i
=0; i
<eServiceDVB::cacheMax
; ++i
)
265 short val
= s
.get((eServiceDVB::cacheID
)i
);
267 fprintf(f
, "c:%02d%04x,", i
, val
);
270 prov
=s
.service_provider
;
271 for (eString::iterator i
=prov
.begin(); i
!= prov
.end(); ++i
)
275 fprintf(f
, "p:%s\n", prov
.c_str());
282 struct saveSubService
285 saveSubService(FILE *out
): f(out
)
287 fprintf(f
, "subservices\n");
289 void operator()(eServiceDVB
& s
)
291 bool bChanged
= false;
292 for (int i
=0; i
<eServiceDVB::cacheMax
; ++i
)
294 if (s
.get((eServiceDVB::cacheID
)i
) != -1)
300 if (!bChanged
) return;
301 fprintf(f
, "%04x:%08x:%04x:%04x\n", s
.service_id
.get(), s
.dvb_namespace
.get(), s
.transport_stream_id
.get(), s
.original_network_id
.get());
302 fprintf(f
, "%s\n", s
.service_name
.c_str());
304 fprintf(f
, "f:%x,", s
.dxflags
);
305 for (int i
=0; i
<eServiceDVB::cacheMax
; ++i
)
307 short val
= s
.get((eServiceDVB::cacheID
)i
);
309 fprintf(f
, "c:%02d%04x,", i
, val
);
312 prov
=s
.service_provider
;
313 for (eString::iterator i
=prov
.begin(); i
!= prov
.end(); ++i
)
317 fprintf(f
, "p:%s\n", prov
.c_str());
325 struct saveTransponder
328 saveTransponder(FILE *out
): f(out
)
330 fprintf(f
, "transponders\n");
332 void operator()(eTransponder
&t
)
334 if (t
.state
&eTransponder::stateOK
)
336 fprintf(f
, "%08x:%04x:%04x\n", t
.dvb_namespace
.get(), t
.transport_stream_id
.get(), t
.original_network_id
.get());
338 fprintf(f
, "\tc %d:%d:%d:%d:%d", t
.cable
.frequency
, t
.cable
.symbol_rate
, t
.cable
.inversion
, t
.cable
.modulation
, t
.cable
.fec_inner
);
339 if (t
.satellite
.valid
)
340 fprintf(f
, "\ts %d:%d:%d:%d:%d:%d", t
.satellite
.frequency
, t
.satellite
.symbol_rate
, t
.satellite
.polarisation
, t
.satellite
.fec
, t
.satellite
.orbital_position
, t
.satellite
.inversion
);
341 if (t
.terrestrial
.valid
)
342 fprintf(f
, "\tt %d:%d:%d:%d:%d:%d:%d:%d:%d",
343 t
.terrestrial
.centre_frequency
,
344 t
.terrestrial
.code_rate_hp
,
345 t
.terrestrial
.code_rate_lp
,
346 t
.terrestrial
.bandwidth
,
347 t
.terrestrial
.constellation
,
348 t
.terrestrial
.guard_interval
,
349 t
.terrestrial
.hierarchy_information
,
350 t
.terrestrial
.transmission_mode
,
351 t
.terrestrial
.inversion
);
352 fprintf(f
, ":%d\n/\n", t
.state
& eTransponder::stateOnlyFree
);
361 void eDVBSettings::saveServices()
363 FILE *f
=fopen(CONFIGDIR
"/enigma/services", "wt");
365 eFatal("couldn't open servicefile - create " CONFIGDIR
"/enigma!");
366 fprintf(f
, "eDVB services /2/\n");
368 getTransponders()->forEachTransponder(saveTransponder(f
));
369 getTransponders()->forEachService(saveService(f
));
370 getTransponders()->forEachSubService(saveSubService(f
));
371 fprintf(f
, "Have a lot of fun!\n");
375 void eDVBSettings::loadServices()
377 FILE *f
=fopen(CONFIGDIR
"/enigma/services", "rt");
381 if ((!fgets(line
, 256, f
)) || strncmp(line
, "eDVB services", 13))
383 eDebug("not a servicefile");
386 eDebug("reading services");
387 if ((!fgets(line
, 256, f
)) || strcmp(line
, "transponders\n"))
389 eDebug("services invalid, no transponders");
393 transponderlist
->clearAllTransponders();
397 if (!fgets(line
, 256, f
))
399 if (!strcmp(line
, "end\n"))
401 int dvb_namespace
=-1, transport_stream_id
=-1, original_network_id
=-1;
402 sscanf(line
, "%x:%x:%x", &dvb_namespace
, &transport_stream_id
, &original_network_id
);
403 if (original_network_id
== -1)
405 eTransponder
&t
=transponderlist
->createTransponder(eDVBNamespace(dvb_namespace
), eTransportStreamID(transport_stream_id
), eOriginalNetworkID(original_network_id
));
406 t
.state
=eTransponder::stateOK
;
410 if (!strcmp(line
, "/\n"))
415 int frequency
, symbol_rate
, polarisation
, fec
, sat
, inversion
=INVERSION_OFF
;
416 sscanf(line
+2, "%d:%d:%d:%d:%d:%d:%d", &frequency
, &symbol_rate
, &polarisation
, &fec
, &sat
, &inversion
, &onlyFree
);
417 t
.setSatellite(frequency
, symbol_rate
, polarisation
, fec
, sat
, inversion
);
421 int frequency
, symbol_rate
, inversion
=INVERSION_OFF
, modulation
=3, fec_inner
=0;
422 int ret
= sscanf(line
+2, "%d:%d:%d:%d:%d:%d", &frequency
, &symbol_rate
, &inversion
, &modulation
, &fec_inner
, &onlyFree
);
425 onlyFree
= fec_inner
;
428 t
.setCable(frequency
, symbol_rate
, inversion
, modulation
, fec_inner
);
432 int centre_frequency
, code_rate_hp
, code_rate_lp
, bandwidth
, constellation
, guard_interval
, hierarchy_information
, transmission_mode
, inversion
=INVERSION_OFF
;
433 sscanf(line
+2, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d", ¢re_frequency
, &code_rate_hp
, &code_rate_lp
, &bandwidth
, &constellation
, &guard_interval
, &hierarchy_information
, &transmission_mode
, &inversion
, &onlyFree
);
434 t
.setTerrestrial(centre_frequency
, bandwidth
, constellation
, hierarchy_information
, code_rate_hp
, code_rate_lp
, guard_interval
, transmission_mode
, inversion
);
437 t
.state
|= eTransponder::stateOnlyFree
;
441 if ((!fgets(line
, 256, f
)) || strcmp(line
, "services\n"))
443 eDebug("services invalid, no services");
448 transponderlist
->clearAllServices();
454 if (!fgets(line
, 256, f
))
456 if (!strcmp(line
, "end\n"))
459 int service_id
=-1, dvb_namespace
, transport_stream_id
=-1, original_network_id
=-1, service_type
=-1, service_number
=-1;
460 sscanf(line
, "%x:%x:%x:%x:%d:%d", &service_id
, &dvb_namespace
, &transport_stream_id
, &original_network_id
, &service_type
, &service_number
);
461 if (service_number
== -1)
463 eServiceDVB
&s
=transponderlist
->createService(
464 eServiceReferenceDVB(
465 eDVBNamespace(dvb_namespace
),
466 eTransportStreamID(transport_stream_id
),
467 eOriginalNetworkID(original_network_id
),
468 eServiceID(service_id
),
469 service_type
), service_number
);
471 s
.service_type
=service_type
;
474 line
[strlen(line
)-1]=0;
478 line
[strlen(line
)-1]=0;
482 if (str
[1]!=':') // old ... (only service_provider)
484 s
.service_provider
=line
;
486 while ((!str
.empty()) && str
[1]==':') // new: p:, f:, c:%02d...
488 unsigned int c
=str
.find(',');
491 if (c
== eString::npos
)
500 // eDebug("%c ... %s", p, v.c_str());
502 s
.service_provider
=v
;
506 sscanf(v
.c_str(), "%x", &dummyval
);
507 s
.dxflags
= dummyval
;
511 sscanf(v
.c_str(), "%02d%04x", &cid
, &val
);
512 if (cid
< eServiceDVB::cacheMax
)
513 s
.set((eServiceDVB::cacheID
)cid
,val
);
518 eDebug("loaded %d services", count
);
520 if ((!fgets(line
, 256, f
)) || strcmp(line
, "subservices\n"))
522 eDebug("subservices invalid, no subservices");
527 transponderlist
->clearAllSubServices();
533 if (!fgets(line
, 256, f
))
535 if (!strcmp(line
, "end\n"))
538 int service_id
=-1, dvb_namespace
, transport_stream_id
=-1, original_network_id
=-1;
539 sscanf(line
, "%x:%x:%x:%x", &service_id
, &dvb_namespace
, &transport_stream_id
, &original_network_id
);
540 eServiceDVB
&s
=transponderlist
->createSubService(
541 eServiceReferenceDVB(
542 eDVBNamespace(dvb_namespace
),
543 eTransportStreamID(transport_stream_id
),
544 eOriginalNetworkID(original_network_id
),
545 eServiceID(service_id
),7
551 line
[strlen(line
)-1]=0;
555 line
[strlen(line
)-1]=0;
559 if (str
[1]!=':') // old ... (only service_provider)
561 s
.service_provider
=line
;
563 while ((!str
.empty()) && str
[1]==':') // new: p:, f:, c:%02d...
565 unsigned int c
=str
.find(',');
568 if (c
== eString::npos
)
577 // eDebug("%c ... %s", p, v.c_str());
579 s
.service_provider
=v
;
582 sscanf(v
.c_str(), "%x", &s
.dxflags
);
586 sscanf(v
.c_str(), "%02d%04x", &cid
, &val
);
587 if (cid
< eServiceDVB::cacheMax
)
588 s
.set((eServiceDVB::cacheID
)cid
,val
);
593 eDebug("loaded %d subservices", count
);
598 void eDVBSettings::saveBouquets()
600 if ( !bouquetsChanged
)
603 eDebug("saving bouquets...");
606 FILE *f
=fopen(CONFIGDIR
"/enigma/bouquets", "wt");
608 eFatal("couldn't open bouquetfile - create " CONFIGDIR
"/enigma!");
609 fprintf(f
, "eDVB bouquets /2/\n");
610 fprintf(f
, "bouquets\n");
611 for (std::map
<int,eBouquet
*>::iterator
i(bouquet_id_map
.begin()); i
!= bouquet_id_map
.end(); ++i
)
613 eBouquet
*b
= i
->second
;
614 fprintf(f
, "%0d\n", b
->bouquet_id
);
615 fprintf(f
, "%s\n", b
->bouquet_name
.c_str());
616 for (ServiceReferenceDVBIterator s
= b
->list
.begin(); s
!= b
->list
.end(); s
++)
617 fprintf(f
, "%04x:%08x:%04x:%04x:%d\n", s
->getServiceID().get(), s
->getDVBNamespace().get(), s
->getTransportStreamID().get(), s
->getOriginalNetworkID().get(), s
->getServiceType());
621 fprintf(f
, "Have a lot of fun!\n");
626 void eDVBSettings::loadBouquets()
628 FILE *f
=fopen(CONFIGDIR
"/enigma/bouquets", "rt");
633 if ((!fgets(line
, 256, f
)) || strncmp(line
, "eDVB bouquets", 13))
635 eDebug("not a bouquetfile");
638 eDebug("reading bouquets");
639 if ((!fgets(line
, 256, f
)) || strcmp(line
, "bouquets\n"))
641 eDebug("settings invalid, no transponders");
645 bouquet_id_map
.clear();
646 for (std::map
<eString
, eBouquet
*>::iterator
it(bouquet_name_map
.begin()); it
!= bouquet_name_map
.end(); ++it
)
648 bouquet_name_map
.clear();
652 if (!fgets(line
, 256, f
))
654 if (!strcmp(line
, "end\n"))
657 sscanf(line
, "%d", &bouquet_id
);
658 if (!fgets(line
, 256, f
))
660 line
[strlen(line
)-1]=0;
661 eBouquet
*bouquet
=createBouquet(bouquet_id
, line
);
665 if (!strcmp(line
, "/\n"))
667 int service_id
=-1, dvb_namespace
=-1, transport_stream_id
=-1, original_network_id
=-1, service_type
=-1;
668 sscanf(line
, "%x:%x:%x:%x:%d", &service_id
, &dvb_namespace
, &transport_stream_id
, &original_network_id
, &service_type
);
669 if (service_type
== -1)
672 eServiceReferenceDVB(
673 eDVBNamespace(dvb_namespace
),
674 eTransportStreamID(transport_stream_id
),
675 eOriginalNetworkID(original_network_id
),
676 eServiceID(service_id
),
681 eDebug("loaded %d bouquets", getBouquets()->size());
685 revalidateBouquets();
689 void eDVBSettings::clearList()
693 transponderlist
->clearAllTransponders();
694 transponderlist
->clearAllServices();
695 removeDVBBouquets(); // user Bouquets do not delete...
698 /*emit*/ dvb
.bouquetListChanged();
701 void eDVBSettings::removeOrbitalPosition(int orbital_position
)
705 transponderlist
->removeOrbitalPosition(orbital_position
);
710 /*emit*/ dvb
.bouquetListChanged();
713 int eDVBSettings::importSatcoDX(eString line
)
715 // hier versuchen wir das komische "SatcoDX"-format zu parsen, was wahrlich noch aus analog-tv zeiten stammt...
716 if (line
.left(7) != "SATCODX")
718 eDebug("SatcoDX: header invalid.");
722 if (line
.mid(7, 1) != "1")
724 eDebug("SatcoDX: unsupported page.");
727 if (line
.mid(8, 2) != "03")
729 eDebug("SatcoDX: must be version 03");
732 // denn damals kam man wohl mit 20 zeichen fuer den kanalnamen aus, und somit festen strukturen. dvb2k laesst gruessen.
733 if (line
.size() != 128)
735 eDebug("SatcoDX: invalid line length.");
738 // also definieren wir den satelliten-NAMEN. bloss nicht zu kompliziert. darf natuerlich nur begrenzt lang sein, klar.
739 eString satname
=line
.mid(10, 18);
740 // und den TYP. Ah! Doch etsi? service_type? nee quatsch. T fuer TV, R fuer Radio, D fuer Data (ist mpeg nicht auch data? *wunder*) und _ fuer "package transponder". HAE? naja gut.
741 eString type
=line
.mid(28, 1);
742 // oh und das broadcasting system. so wie im etsi? klar. TRAEUM WEITER. hier gibts es:
743 // (langweilig) 422_, ADR_, BMAC_, D2MAC (wie das in 4 zeichen passt ist mir WIRKLICH unklar.), DIC1, DIC2, ISDB, und jetzt kommts:
744 // MPG1 ... ok, MPEG-1 halt.
745 // MP15 MPEG-1.5 (HAEEE???? was issen das? mpeg 2.5 mag es ja noch geben (wer auch immer SOLCHE low bitrate services ueber dvb macht.. pah)
748 // MUSE, NTSC, PAL_, SECM (ich sag ja, analog.)
749 eString system
=line
.mid(29, 4);
750 // oh die frequenz. in ascii.
751 eString frequency
=line
.mid(33, 9);
752 // ooh! laut DVB? ne quatsch, man brauch mal wieder ne lookup table. 0 ist vertikal, 1 horiz, 2 ist linksdrehend und 3 ist im joghurt. (oder so)
753 eString polarization
=line
.mid(42, 1);
754 // der anfang vom ende. der kanalname. WELCH EIN WUNDER dass hier nicht noch die kanalNUMMER steht.
755 eString channelname
=line
.mid(43, 8);
756 // orbital position. JUHUU. endlich mal was brauchbares.
757 eString orbital_position
=line
.mid(51, 4);
758 // coverage mit dem man nix anfangen kann.
759 eString coverage
=line
.mid(55, 8);
760 // audio frequency ;))
761 eString audio_freq
=line
.mid(63, 6);
763 eString symbolrate
=line
.mid(69, 5);
764 // FEC, gaenzlich unkonform aber naja. 0 fuer KEINE FEC .. (??), 1, 2, 3, 5, 7 fuer 1/2, 2/3, 3/4, 5/6, 7/8)
765 eString fec
=line
.mid(74, 1);
766 // die pids. in hex. .... .... Satcodx? nein, natuerlich IN ASCII.
767 eString vpid
=line
.mid(75, 4);
768 eString apid
=line
.mid(79, 4);
769 eString pcrpid
=line
.mid(83, 4);
771 eString sid
=line
.mid(87, 5);
772 // die nid. (JA, die jungs kennen sich aus.)
773 eString onid
=line
.mid(92, 5);
774 // die tsid (JA, die jungs kennen sich WIRKLICH aus.)
775 eString tsid
=line
.mid(97, 5);
776 // die primary language. ok, wenn die danach filtern wollen, sollen sie es tun. meinetwegen.
777 eString lang
=line
.mid(102, 3);
778 // der mighty underscore
779 if (line
[105] != '_')
781 eDebug("SatcoDX: underscore missing.");
785 eString cc
=line
.mid(106, 2);
786 eString lang2
=line
.mid(108, 2);
787 eString crypt
=line
.mid(111, 4);
788 // und der rest vom ende.
789 channelname
+=line
.mid(115, 12);
790 if (line
[127] != '\r')
792 eDebug("SatcoDX: missing CR.");
798 if (system
.left(3) != "MPG")
804 else if (type
== "R")
807 eDVBNamespace dvb_namespace
;
809 // create transponder.
811 int my_orbital_position
=atoi(orbital_position
.c_str());
812 if (my_orbital_position
>= 1800) // convert 0..3599 to -1800..1799
813 my_orbital_position
-=3600;
815 dvb_namespace
=eDVBNamespace(orbital_position
<< 16);
817 eServiceDVB
&dvbservice
=transponderlist
->createService(
818 eServiceReferenceDVB(
820 eTransportStreamID(atoi(tsid
.c_str())), eOriginalNetworkID(atoi(onid
.c_str())), eServiceID(atoi(sid
.c_str())),
823 dvbservice
.service_type
=service_type
;
824 dvbservice
.service_name
=channelname
;
825 dvbservice
.service_provider
=satname
; // HA! jetzt hab ich's den lamern aber gegeben!
826 dvbservice
.dxflags
=eServiceDVB::dxNoDVB
; // ists ja auch nicht.
828 dvbservice
.set(eServiceDVB::cVPID
, atoi(vpid
.c_str()));
830 dvbservice
.set(eServiceDVB::cAPID
, atoi(apid
.c_str()));
831 if (pcrpid
[0] != '_')
832 dvbservice
.set(eServiceDVB::cPCRPID
, atoi(pcrpid
.c_str()));
834 eTransponder
&t
=transponderlist
->createTransponder(dvb_namespace
, eTransportStreamID(atoi(tsid
.c_str())), eOriginalNetworkID(atoi(onid
.c_str())));
835 t
.state
=eTransponder::stateOK
;
838 switch (atoi(fec
.c_str()))
863 t
.setSatellite(atoi(frequency
.c_str()), atoi(symbolrate
.c_str())*1000, atoi(polarization
.c_str())^1, myfec
, my_orbital_position
, 0);
868 eDVBSettings::~eDVBSettings()
872 for (std::map
<int, eBouquet
*>::iterator
it(bouquet_id_map
.begin()); it
!= bouquet_id_map
.end(); ++it
)
875 delete transponderlist
;