dvb: Add dvb_network_t and start to migrate stuff there from dvb_adapter_t

This commit is contained in:
Andreas Öman 2012-12-04 16:47:28 +01:00
parent abde2507d8
commit d1051e6cc0
9 changed files with 51 additions and 41 deletions

View file

@ -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

View file

@ -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;

View file

@ -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 */

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;
}

View file

@ -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",