void dvb_network_init ( void );
void dvb_network_done ( void );
+
static inline dvb_network_t *dvb_network_find_by_uuid(const char *uuid)
{ return idnode_find(uuid, &dvb_network_class, NULL); }
dvb_mux_t *dvb_network_find_mux
( dvb_network_t *ln, dvb_mux_conf_t *dmc, uint16_t onid, uint16_t tsid );
+const idclass_t *dvb_network_mux_class(mpegts_network_t *mn);
int dvb_network_get_orbital_pos(mpegts_network_t *mn);
/*
htsmsg_destroy(c);
}
-static const idclass_t *
+const idclass_t *
dvb_network_mux_class
( mpegts_network_t *mn )
{
satpos = dvb_network_get_orbital_pos(mn);
if (dvb_network_check_orbital_pos(satpos, dmc->u.dmc_fe_qpsk.orbital_pos)) {
LIST_FOREACH(mn, &mpegts_network_all, mn_global_link) {
+ if (!idnode_is_instance(&mn->mn_id, &dvb_network_dvbs_class)) continue;
satpos = dvb_network_get_orbital_pos(mn);
if (satpos == INT_MAX) continue;
if (!dvb_network_check_orbital_pos(satpos, dmc->u.dmc_fe_qpsk.orbital_pos))
if (!ln)
return INT_MAX;
+ if (tvhtrace_enabled()) {
+ if (!idnode_is_instance(&mn->mn_id, &dvb_network_dvbs_class)) {
+ tvhinfo("mpegts", "wrong dvb_network_get_orbital_pos() call");
+ return INT_MAX;
+ }
+ }
if (ln->mn_satpos != INT_MAX)
return ln->mn_satpos;
LIST_FOREACH(mm, &ln->mn_muxes, mm_network_link) {
#if ENABLE_MPEGTS_DVB
static int
-mpegts_service_match_network(mpegts_network_t *mn, uint32_t hash, const idclass_t **idc)
+mpegts_service_match_network(mpegts_network_t *mn, uint32_t hash, const idclass_t *idc)
{
- int pos = hash >> 16, pos2;
+ int pos, pos2;
+ if (idc != &dvb_mux_dvbs_class) return 1;
pos = hash >> 16;
- switch (pos) {
- case 0xFFFF: *idc = &dvb_mux_dvbc_class; return 1;
- case 0xEEEE: *idc = &dvb_mux_dvbt_class; return 1;
- case 0xDDDD: *idc = &dvb_mux_dvbt_class; return 1;
- default: *idc = &dvb_mux_dvbs_class; break;
- }
if (pos > 3600 || pos < 0) return 0;
pos = pos <= 1800 ? pos : pos - 3600;
if ((pos2 = dvb_network_get_orbital_pos(mn)) == INT_MAX) return 0;
lock_assert(&global_lock);
+ switch (hash & 0xFFFF0000) {
+ case 0xFFFF0000: idc = &dvb_mux_dvbc_class; break;
+ case 0xEEEE0000: idc = &dvb_mux_dvbt_class; break;
+ case 0xDDDD0000: idc = &dvb_mux_dvbt_class; break;
+ default: idc = &dvb_mux_dvbs_class; break;
+ }
LIST_FOREACH(mn, &mpegts_network_all, mn_global_link) {
if (!idnode_is_instance(&mn->mn_id, &dvb_network_class)) continue;
- if (!mpegts_service_match_network(mn, hash, &idc)) continue;
+ if (dvb_network_mux_class(mn) != idc) continue;
+ if (!mpegts_service_match_network(mn, hash, idc)) continue;
LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link) {
if (!idnode_is_instance(&mm->mm_id, idc)) continue;
if (mm->mm_tsid != tsid || mm->mm_onid != onid) continue;