diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h index 94b2616b..51392357 100644 --- a/src/dvb/dvb.h +++ b/src/dvb/dvb.h @@ -93,7 +93,6 @@ typedef struct th_dvb_mux_instance { RB_ENTRY(th_dvb_mux_instance) tdmi_global_link; LIST_ENTRY(th_dvb_mux_instance) tdmi_adapter_link; - LIST_ENTRY(th_dvb_mux_instance) tdmi_adapter_hash_link; struct th_dvb_adapter *tdmi_adapter; @@ -166,6 +165,21 @@ typedef struct dvb_table_feed { +/** + * + */ +typedef struct dvb_network { + + struct th_dvb_mux_instance_list dn_muxes; + + struct th_dvb_mux_instance_queue dn_initial_scan_queue; + int dn_initial_num_mux; + + int dn_fe_type; + +} dvb_network_t; + + /** * DVB Adapter (one of these per physical adapter) */ @@ -175,10 +189,7 @@ typedef struct th_dvb_adapter { TAILQ_ENTRY(th_dvb_adapter) tda_global_link; - struct th_dvb_mux_instance_list tda_muxes; - - struct th_dvb_mux_instance_queue tda_initial_scan_queue; - int tda_initial_num_mux; + dvb_network_t *tda_dn; th_dvb_mux_instance_t *tda_mux_current; char *tda_tune_reason; // Reason for last tune @@ -203,10 +214,11 @@ typedef struct th_dvb_adapter { int32_t tda_full_mux_rx; char *tda_displayname; + int tda_type; + struct dvb_frontend_info *tda_fe_info; // result of FE_GET_INFO ioctl() + char *tda_fe_path; int tda_fe_fd; - int tda_type; - struct dvb_frontend_info *tda_fe_info; int tda_adapter_num; @@ -230,8 +242,6 @@ typedef struct th_dvb_adapter { struct dvb_satconf_queue tda_satconfs; - struct th_dvb_mux_instance_list tda_mux_list; - uint32_t tda_last_fec; int tda_unc_is_delta; /* 1 if we believe FE_READ_UNCORRECTED_BLOCKS diff --git a/src/dvb/dvb_adapter.c b/src/dvb/dvb_adapter.c index 8a088340..c0a3c9cf 100644 --- a/src/dvb/dvb_adapter.c +++ b/src/dvb/dvb_adapter.c @@ -57,9 +57,11 @@ static th_dvb_adapter_t * tda_alloc(void) { th_dvb_adapter_t *tda = calloc(1, sizeof(th_dvb_adapter_t)); + dvb_network_t *dn = calloc(1, sizeof(dvb_network_t)); pthread_mutex_init(&tda->tda_delivery_mutex, NULL); - TAILQ_INIT(&tda->tda_initial_scan_queue); + tda->tda_dn = dn; + TAILQ_INIT(&dn->dn_initial_scan_queue); TAILQ_INIT(&tda->tda_satconfs); streaming_pad_init(&tda->tda_streaming_pad); return tda; @@ -711,7 +713,7 @@ dvb_adapter_mux_scanner(void *aux) gtimer_arm(&tda->tda_mux_scanner_timer, dvb_adapter_mux_scanner, tda, 20); /* No muxes */ - if(LIST_FIRST(&tda->tda_muxes) == NULL) { + if(LIST_FIRST(&tda->tda_dn->dn_muxes) == NULL) { dvb_adapter_poweroff(tda); return; } @@ -725,7 +727,7 @@ dvb_adapter_mux_scanner(void *aux) return; // Someone is doing full mux dump /* Check if we have muxes pending for quickscan, if so, choose them */ - if((tdmi = TAILQ_FIRST(&tda->tda_initial_scan_queue)) != NULL) { + if((tdmi = TAILQ_FIRST(&tda->tda_dn->dn_initial_scan_queue)) != NULL) { dvb_fe_tune(tdmi, "Initial autoscan"); return; } @@ -764,10 +766,10 @@ dvb_adapter_clone(th_dvb_adapter_t *dst, th_dvb_adapter_t *src) lock_assert(&global_lock); - while((tdmi_dst = LIST_FIRST(&dst->tda_muxes)) != NULL) + while((tdmi_dst = LIST_FIRST(&dst->tda_dn->dn_muxes)) != NULL) dvb_mux_destroy(tdmi_dst); - LIST_FOREACH(tdmi_src, &src->tda_muxes, tdmi_adapter_link) + LIST_FOREACH(tdmi_src, &src->tda_dn->dn_muxes, tdmi_adapter_link) dvb_mux_copy(dst, tdmi_src, NULL); tda_save(dst); @@ -789,7 +791,7 @@ dvb_adapter_destroy(th_dvb_adapter_t *tda) hts_settings_remove("dvbadapters/%s", tda->tda_identifier); - while((tdmi = LIST_FIRST(&tda->tda_muxes)) != NULL) + while((tdmi = LIST_FIRST(&tda->tda_dn->dn_muxes)) != NULL) dvb_mux_destroy(tdmi); TAILQ_REMOVE(&dvb_adapters, tda, tda_global_link); @@ -992,7 +994,7 @@ dvb_adapter_build_msg(th_dvb_adapter_t *tda) htsmsg_add_str(m, "name", tda->tda_displayname); // XXX: bad bad bad slow slow slow - LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) { + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) { nummux++; LIST_FOREACH(t, &tdmi->tdmi_transports, s_group_link) { numsvc++; @@ -1003,7 +1005,7 @@ dvb_adapter_build_msg(th_dvb_adapter_t *tda) htsmsg_add_u32(m, "services", numsvc); htsmsg_add_u32(m, "muxes", nummux); - htsmsg_add_u32(m, "initialMuxes", tda->tda_initial_num_mux); + htsmsg_add_u32(m, "initialMuxes", tda->tda_dn->dn_initial_num_mux); if(tda->tda_mux_current != NULL) { th_dvb_mux_instance_t *tdmi = tda->tda_mux_current; diff --git a/src/dvb/dvb_fe.c b/src/dvb/dvb_fe.c index d8b5ba27..a7494810 100644 --- a/src/dvb/dvb_fe.c +++ b/src/dvb/dvb_fe.c @@ -269,7 +269,7 @@ dvb_fe_stop(th_dvb_mux_instance_t *tdmi, int retune) if(tdmi->tdmi_table_initial) { tdmi->tdmi_table_initial = 0; - tda->tda_initial_num_mux--; + tda->tda_dn->dn_initial_num_mux--; dvb_mux_save(tdmi); } @@ -497,7 +497,7 @@ dvb_fe_tune(th_dvb_mux_instance_t *tdmi, const char *reason) /* Remove from initial scan set */ if(tdmi->tdmi_table_initial) { tdmi->tdmi_table_initial = 0; - tda->tda_initial_num_mux--; + tda->tda_dn->dn_initial_num_mux--; } /* Mark as bad */ diff --git a/src/dvb/dvb_multiplex.c b/src/dvb/dvb_multiplex.c index 7efb6f36..8972226e 100644 --- a/src/dvb/dvb_multiplex.c +++ b/src/dvb/dvb_multiplex.c @@ -67,9 +67,9 @@ static void tdmi_set_enable(th_dvb_mux_instance_t *tdmi, int enabled); static void mux_link_initial(th_dvb_adapter_t *tda, th_dvb_mux_instance_t *tdmi) { - int was_empty = TAILQ_FIRST(&tda->tda_initial_scan_queue) == NULL; + int was_empty = TAILQ_FIRST(&tda->tda_dn->dn_initial_scan_queue) == NULL; - tdmi->tdmi_scan_queue = &tda->tda_initial_scan_queue; + tdmi->tdmi_scan_queue = &tda->tda_dn->dn_initial_scan_queue; TAILQ_INSERT_TAIL(tdmi->tdmi_scan_queue, tdmi, tdmi_scan_link); if(was_empty && (tda->tda_mux_current == NULL || @@ -163,7 +163,7 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc, lock_assert(&global_lock); /* HACK - we hash/compare based on 2KHz spacing and compare on +/-500Hz */ - LIST_FOREACH(tdmi, &tda->tda_mux_list, tdmi_adapter_hash_link) { + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) { if(tdmi_compare_key(&tdmi->tdmi_conf, dmc)) break; /* Mux already exist */ } @@ -280,8 +280,7 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc, tdmi, tdmi_satconf_link); } - LIST_INSERT_HEAD(&tda->tda_mux_list, tdmi, tdmi_adapter_hash_link); - LIST_INSERT_HEAD(&tda->tda_muxes, tdmi, tdmi_adapter_link); + LIST_INSERT_HEAD(&tda->tda_dn->dn_muxes, tdmi, tdmi_adapter_link); tdmi->tdmi_table_initial = initialscan; if(source != NULL) { @@ -296,7 +295,7 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc, dvb_mux_notify(tdmi); if(enabled && tdmi->tdmi_table_initial) { - tda->tda_initial_num_mux++; + tda->tda_dn->dn_initial_num_mux++; mux_link_initial(tda, tdmi); } @@ -334,13 +333,12 @@ dvb_mux_destroy(th_dvb_mux_instance_t *tdmi) RB_REMOVE(&dvb_muxes, tdmi, tdmi_global_link); LIST_REMOVE(tdmi, tdmi_adapter_link); - LIST_REMOVE(tdmi, tdmi_adapter_hash_link); if(tdmi->tdmi_scan_queue != NULL) TAILQ_REMOVE(tdmi->tdmi_scan_queue, tdmi, tdmi_scan_link); if(tdmi->tdmi_table_initial) - tda->tda_initial_num_mux--; + tda->tda_dn->dn_initial_num_mux--; epggrab_mux_delete(tdmi); @@ -1254,7 +1252,7 @@ th_dvb_mux_instance_t *dvb_mux_find { th_dvb_mux_instance_t *tdmi; if (tda) { - LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) { + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) { if (enabled && !tdmi->tdmi_enabled) continue; if (onid && onid != tdmi->tdmi_network_id) continue; if (tsid && tsid != tdmi->tdmi_transport_stream_id) continue; diff --git a/src/dvb/dvb_service.c b/src/dvb/dvb_service.c index 82621227..821e9a30 100644 --- a/src/dvb/dvb_service.c +++ b/src/dvb/dvb_service.c @@ -352,7 +352,7 @@ dvb_service_find3 if (sid == svc->s_dvb_service_id) return svc; } } else if (tda) { - LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) { + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) { if (enabled && !tdmi->tdmi_enabled) continue; if (onid && onid != tdmi->tdmi_network_id) continue; if (tsid && tsid != tdmi->tdmi_transport_stream_id) continue; diff --git a/src/dvb/dvb_tables.c b/src/dvb/dvb_tables.c index 529f5c50..29ac020e 100644 --- a/src/dvb/dvb_tables.c +++ b/src/dvb/dvb_tables.c @@ -61,7 +61,7 @@ dvb_table_fastswitch(th_dvb_mux_instance_t *tdmi) return; tdmi->tdmi_table_initial = 0; - tda->tda_initial_num_mux--; + tda->tda_dn->dn_initial_num_mux--; dvb_mux_save(tdmi); @@ -267,7 +267,7 @@ dvb_bat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len, j = 0; /* Find TDMI */ - LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id == onid) break; @@ -337,7 +337,7 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, if(!tdmi->tdmi_network_id) dvb_mux_set_onid(tdmi, onid); } else { - LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id != onid) break; @@ -495,7 +495,7 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, // Make sure this TSID is not already known on another mux // That might indicate that we have accedentally received a PAT // from another mux - LIST_FOREACH(other, &tda->tda_muxes, tdmi_adapter_link) + LIST_FOREACH(other, &tda->tda_dn->dn_muxes, tdmi_adapter_link) if(other != tdmi && other->tdmi_conf.dmc_satconf == tdmi->tdmi_conf.dmc_satconf && other->tdmi_transport_stream_id == tsid && @@ -755,7 +755,7 @@ dvb_table_local_channel(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, th_dvb_adapter_t *tda = tdmi->tdmi_adapter; service_t *t; - LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id == onid) break; @@ -935,7 +935,7 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, onid = (ptr[24] << 8) | ptr[25]; /* Search all muxes on adapter */ - LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id == onid); break; diff --git a/src/epggrab/otamux.c b/src/epggrab/otamux.c index c4242079..16def861 100644 --- a/src/epggrab/otamux.c +++ b/src/epggrab/otamux.c @@ -255,7 +255,7 @@ void epggrab_ota_create_and_register_by_id th_dvb_mux_instance_t *tdmi; epggrab_ota_mux_t *ota; TAILQ_FOREACH(tda, &dvb_adapters, tda_global_link) { - LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) { + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) { if (tdmi->tdmi_transport_stream_id != tsid) continue; if (onid && tdmi->tdmi_network_id != onid) continue; if (networkname && (!tdmi->tdmi_network || strcmp(networkname, tdmi->tdmi_network))) continue; diff --git a/src/webui/extjs_dvb.c b/src/webui/extjs_dvb.c index 3f007529..e8948351 100644 --- a/src/webui/extjs_dvb.c +++ b/src/webui/extjs_dvb.c @@ -237,7 +237,7 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque) tvhlog(LOG_NOTICE, "web interface", "Service probe started on \"%s\"", tda->tda_displayname); - LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) { + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) { LIST_FOREACH(t, &tdmi->tdmi_transports, s_group_link) { if(t->s_enabled) serviceprobe_enqueue(t); @@ -334,7 +334,7 @@ extjs_dvbmuxes(http_connection_t *hc, const char *remain, void *opaque) if(!strcmp(op, "get")) { array = htsmsg_create_list(); - LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) htsmsg_add_msg(array, NULL, dvb_mux_build_msg(tdmi)); htsmsg_add_msg(out, "entries", array); @@ -415,7 +415,7 @@ extjs_dvbservices(http_connection_t *hc, const char *remain, void *opaque) out = htsmsg_create_map(); array = htsmsg_create_list(); - LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) { + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) { LIST_FOREACH(t, &tdmi->tdmi_transports, s_group_link) { count++; } @@ -423,7 +423,7 @@ extjs_dvbservices(http_connection_t *hc, const char *remain, void *opaque) tvec = alloca(sizeof(service_t *) * count); - LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) { + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) { LIST_FOREACH(t, &tdmi->tdmi_transports, s_group_link) { tvec[i++] = t; } diff --git a/src/webui/statedump.c b/src/webui/statedump.c index a9758e6f..10d12977 100644 --- a/src/webui/statedump.c +++ b/src/webui/statedump.c @@ -134,7 +134,7 @@ dumpdvbadapters(htsbuf_queue_t *hq) htsbuf_qprintf(hq, "%s (%s)\n", tda->tda_displayname, tda->tda_identifier); outputtitle(hq, 4, "Multiplexes"); - LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) { + LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) { char tdminame[64]; dvb_mux_nicename(tdminame, sizeof(tdminame), tdmi); htsbuf_qprintf(hq, " %s (%s)\n",