From 38a16f808801b57bdbfce94c28662b3d4aff13d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Wed, 9 Jan 2008 13:14:34 +0000 Subject: [PATCH] Scrap the notion of "dvb mux instance" and "dvb mux". Instead use 'transport' to instansiate the same channel multiple times, even if it's seen on multiple adapters on the same DVB network. --- channels.c | 4 -- dvb.c | 56 +++++++++-------------- dvb.h | 3 -- dvb_dvr.c | 40 +++++++---------- dvb_fe.c | 7 ++- dvb_muxconfig.c | 115 ++++++++++++++--------------------------------- dvb_tables.c | 22 ++------- htmlui.c | 8 ++-- htsclient.c | 116 +++--------------------------------------------- tvhead.h | 39 +++++----------- 10 files changed, 98 insertions(+), 312 deletions(-) diff --git a/channels.c b/channels.c index 318a7d28..1aae6760 100644 --- a/channels.c +++ b/channels.c @@ -222,10 +222,6 @@ service_load(struct config_head *head) t->tht_prio = atoi(config_get_str_sub(head, "prio", "")); if(0) { -#ifdef ENABLE_INPUT_DVB - } else if((v = config_get_str_sub(head, "dvbmux", NULL)) != NULL) { - r = dvb_configure_transport(t, v, name); -#endif #ifdef ENABLE_INPUT_IPTV } else if((v = config_get_str_sub(head, "iptv", NULL)) != NULL) { r = iptv_configure_transport(t, v, head, name); diff --git a/dvb.c b/dvb.c index 762ce959..19f0bfa9 100644 --- a/dvb.c +++ b/dvb.c @@ -75,7 +75,7 @@ dvb_add_adapter(const char *path) return; } tda = calloc(1, sizeof(th_dvb_adapter_t)); - tda->tda_path = strdup(path); + tda->tda_rootpath = strdup(path); tda->tda_demux_path = malloc(256); snprintf(tda->tda_demux_path, 256, "%s/demux0", path); tda->tda_dvr_path = malloc(256); @@ -137,7 +137,7 @@ dvb_init(void) if(tdmi == NULL) { syslog(LOG_WARNING, "No muxes configured on \"%s\" DVB adapter unused", - tda->tda_path); + tda->tda_rootpath); startupcounter--; } else { dvb_start_initial_scan(tdmi); @@ -148,18 +148,23 @@ dvb_init(void) /** - * Based on the gived transport id and service id, try to locate the transport + * Based on the gived transport id and service id on the given mux + * try to locate the transport. + * + * If it cannot be found we create it */ th_transport_t * dvb_find_transport(th_dvb_mux_instance_t *tdmi, uint16_t tid, uint16_t sid, int pmt_pid) { th_transport_t *t; - th_dvb_mux_t *tdm = tdmi->tdmi_mux; char tmp[100]; + /* XXX: Minimize this search */ + LIST_FOREACH(t, &all_transports, tht_global_link) { - if(t->tht_dvb_transport_id == tid && + if(t->tht_dvb_mux_instance == tdmi && + t->tht_dvb_transport_id == tid && t->tht_dvb_service_id == sid) return t; } @@ -176,13 +181,13 @@ dvb_find_transport(th_dvb_mux_instance_t *tdmi, uint16_t tid, t->tht_type = TRANSPORT_DVB; t->tht_start_feed = dvb_start_feed; t->tht_stop_feed = dvb_stop_feed; - t->tht_dvb_mux = tdm; + t->tht_dvb_mux_instance = tdmi; - snprintf(tmp, sizeof(tmp), "%s:%04x:%04x", tdm->tdm_name, tid, sid); + snprintf(tmp, sizeof(tmp), "%s/%04x", tdmi->tdmi_uniquename, sid); free((void *)t->tht_uniquename); t->tht_uniquename = strdup(tmp); - t->tht_name = strdup(tdm->tdm_title); + t->tht_name = strdup(tmp); LIST_INSERT_HEAD(&all_transports, t, tht_global_link); dvb_table_add_transport(tdmi, t, pmt_pid); @@ -213,7 +218,7 @@ tdmi_activate(th_dvb_mux_instance_t *tdmi) startupcounter--; syslog(LOG_INFO, "\"%s\" Initial scan completed, adapter available", - tda->tda_path); + tda->tda_rootpath); /* no more muxes to probe, link adapter to the world */ LIST_REMOVE(tda, tda_link); LIST_INSERT_HEAD(&dvb_adapters_running, tda, tda_link); @@ -231,7 +236,6 @@ static void tdmi_initial_scan_timeout(void *aux, int64_t now) { th_dvb_mux_instance_t *tdmi = aux; - th_dvb_adapter_t *tda = tdmi->tdmi_adapter; const char *err; #if 0 th_dvb_table_t *tdt; @@ -246,8 +250,8 @@ tdmi_initial_scan_timeout(void *aux, int64_t now) else err = "Missing PSI tables, scan will continue"; - syslog(LOG_DEBUG, "\"%s\" mux \"%s\" Initial scan timed out -- %s", - tda->tda_path, tdmi->tdmi_mux->tdm_name, err); + syslog(LOG_DEBUG, "\"%s\" Initial scan timed out -- %s", + tdmi->tdmi_uniquename, err); tdmi_activate(tdmi); } @@ -260,11 +264,9 @@ void tdmi_check_scan_status(th_dvb_mux_instance_t *tdmi) { th_dvb_table_t *tdt; - th_dvb_adapter_t *tda = tdmi->tdmi_adapter; if(tdmi->tdmi_state >= TDMI_IDLE) return; - LIST_FOREACH(tdt, &tdmi->tdmi_tables, tdt_link) if(tdt->tdt_count == 0) @@ -272,8 +274,8 @@ tdmi_check_scan_status(th_dvb_mux_instance_t *tdmi) /* All tables seen at least once */ - syslog(LOG_DEBUG, "\"%s\" on \"%s\" Initial scan completed", - tda->tda_path, tdmi->tdmi_mux->tdm_name); + syslog(LOG_DEBUG, "\"%s\" Initial scan completed", + tdmi->tdmi_uniquename); tdmi_activate(tdmi); } @@ -292,17 +294,6 @@ dvb_start_initial_scan(th_dvb_mux_instance_t *tdmi) } - -/** - * - */ -static int -mux_sort_quality(th_dvb_mux_instance_t *a, th_dvb_mux_instance_t *b) -{ - return a->tdmi_fec_err_per_sec - b->tdmi_fec_err_per_sec; -} - - /** * */ @@ -311,7 +302,6 @@ dvb_fec_monitor(void *aux, int64_t now) { th_dvb_adapter_t *tda = aux; th_dvb_mux_instance_t *tdmi; - th_dvb_mux_t *tdm; dtimer_arm(&tda->tda_fec_monitor_timer, dvb_fec_monitor, tda, 1); @@ -322,18 +312,12 @@ dvb_fec_monitor(void *aux, int64_t now) if(tdmi->tdmi_fec_err_per_sec > DVB_FEC_ERROR_LIMIT) { if(LIST_FIRST(&tda->tda_transports) != NULL) { - syslog(LOG_ERR, "%s: on %s: Too many FEC errors (%d / s), " + syslog(LOG_ERR, "\"%s\": Too many FEC errors (%d / s), " "flushing subscribers\n", - tdmi->tdmi_mux->tdm_name, tda->tda_path, - tdmi->tdmi_fec_err_per_sec); + tdmi->tdmi_uniquename, tdmi->tdmi_fec_err_per_sec); dvb_adapter_clean(tdmi->tdmi_adapter); } } - - tdm = tdmi->tdmi_mux; - LIST_REMOVE(tdmi, tdmi_mux_link); - LIST_INSERT_SORTED(&tdm->tdm_instances, tdmi, tdmi_mux_link, - mux_sort_quality); } } diff --git a/dvb.h b/dvb.h index 4ebdf856..4468dbf0 100644 --- a/dvb.h +++ b/dvb.h @@ -27,9 +27,6 @@ extern struct th_dvb_mux_list dvb_muxes; void dvb_init(void); -int dvb_configure_transport(th_transport_t *t, const char *muxname, - const char *channel_name); - void dvb_tune_tdmi(th_dvb_mux_instance_t *tdmi, int maylog, tdmi_state_t state); diff --git a/dvb_dvr.c b/dvb_dvr.c index 7114651e..6b5b4d1d 100644 --- a/dvb_dvr.c +++ b/dvb_dvr.c @@ -122,7 +122,6 @@ dvb_stop_feed(th_transport_t *t) { th_stream_t *st; - t->tht_dvb_adapter = NULL; LIST_REMOVE(t, tht_adapter_link); LIST_FOREACH(st, &t->tht_streams, st_link) { close(st->st_demuxer_fd); @@ -133,45 +132,41 @@ dvb_stop_feed(th_transport_t *t) /* + * Switch the adapter (which is implicitly tied to our transport) + * to receive the given transport. * + * But we only do this if 'weight' is higher than all of the current + * transports that is subscribing to the adapter */ int dvb_start_feed(th_transport_t *t, unsigned int weight, int status) { - th_dvb_adapter_t *tda; struct dmx_pes_filter_params dmx_param; th_stream_t *st; int w, fd, pid; + th_dvb_adapter_t *tda = t->tht_dvb_mux_instance->tdmi_adapter; + th_dvb_mux_instance_t *tdmi = tda->tda_mux_current; - th_dvb_mux_instance_t *tdmi, *cand = NULL; - th_dvb_mux_t *mux = t->tht_dvb_mux; + /* Check if adapter is idle, or already tuned */ - LIST_FOREACH(tdmi, &mux->tdm_instances, tdmi_mux_link) { + if(tdmi != NULL && tdmi == t->tht_dvb_mux_instance) { - if(tdmi->tdmi_state == TDMI_RUNNING) - goto gotmux; + /* Nope .. */ if(tdmi->tdmi_status != NULL) - continue; /* no lock */ + return 1; /* no lock on adapter, cant use it */ if(tdmi->tdmi_fec_err_per_sec > DVB_FEC_ERROR_LIMIT / 3) - continue; /* too much errors to even consider */ + return 1; /* too many errors for using it */ w = transport_compute_weight(&tdmi->tdmi_adapter->tda_transports); - if(w < weight && cand == NULL) - cand = tdmi; + if(w >= weight) + return 1; /* We are outranked by weight, cant use it */ + + tdmi = t->tht_dvb_mux_instance; + dvb_adapter_clean(tda); } - if(cand == NULL) - return 1; - - tdmi = cand; - - dvb_adapter_clean(tdmi->tdmi_adapter); - - gotmux: - tda = tdmi->tdmi_adapter; - LIST_FOREACH(st, &t->tht_streams, st_link) { fd = open(tda->tda_demux_path, O_RDWR); @@ -206,8 +201,7 @@ dvb_start_feed(th_transport_t *t, unsigned int weight, int status) } LIST_INSERT_HEAD(&tda->tda_transports, t, tht_adapter_link); - t->tht_dvb_adapter = tda; - t->tht_status = TRANSPORT_RUNNING; + t->tht_status = status; dvb_tune_tdmi(tdmi, 1, TDMI_RUNNING); return 0; diff --git a/dvb_fe.c b/dvb_fe.c index 83503568..7f1f0f18 100644 --- a/dvb_fe.c +++ b/dvb_fe.c @@ -81,13 +81,12 @@ dvb_fe_manager(void *aux) tdmi = c->tdmi; - i = ioctl(tda->tda_fe_fd, FE_SET_FRONTEND, - tdmi->tdmi_mux->tdm_fe_params); + i = ioctl(tda->tda_fe_fd, FE_SET_FRONTEND, tdmi->tdmi_fe_params); if(i != 0) { syslog(LOG_ERR, "\"%s\" tuning to %dHz" " -- Front configuration failed -- %s", - tda->tda_path, tdmi->tdmi_mux->tdm_fe_params->frequency, + tda->tda_rootpath, tdmi->tdmi_fe_params->frequency, strerror(errno)); } free(c); @@ -195,7 +194,7 @@ dvb_tune_tdmi(th_dvb_mux_instance_t *tdmi, int maylog, tdmi_state_t state) if(maylog) syslog(LOG_DEBUG, "\"%s\" tuning to mux \"%s\"", - tda->tda_path, tdmi->tdmi_mux->tdm_title); + tda->tda_rootpath, tdmi->tdmi_shortname); /* Add tables which will be activated once the tuning is completed */ diff --git a/dvb_muxconfig.c b/dvb_muxconfig.c index 65778162..5193e773 100644 --- a/dvb_muxconfig.c +++ b/dvb_muxconfig.c @@ -33,34 +33,16 @@ #include "transports.h" -static void -dvb_add_mux_instance(th_dvb_adapter_t *tda, th_dvb_mux_t *tdm) -{ - th_dvb_mux_instance_t *tdmi; - - tdmi = calloc(1, sizeof(th_dvb_mux_instance_t)); - - pthread_mutex_init(&tdmi->tdmi_table_lock, NULL); - - tdmi->tdmi_status = TDMI_CONFIGURED; - - tdmi->tdmi_mux = tdm; - tdmi->tdmi_adapter = tda; - - LIST_INSERT_HEAD(&tda->tda_muxes_configured, tdmi, tdmi_adapter_link); - LIST_INSERT_HEAD(&tdm->tdm_instances, tdmi, tdmi_mux_link); -} - static void -dvb_add_mux(struct dvb_frontend_parameters *fe_param, const char *name, - fe_type_t type) +dvb_add_mux(struct dvb_frontend_parameters *fe_param, fe_type_t type) { - th_dvb_mux_t *tdm; th_dvb_adapter_t *tda; char buf[100]; char *typetxt; + th_dvb_mux_instance_t *tdmi; + switch(type) { case FE_QPSK: typetxt = "DVB-S"; @@ -78,37 +60,39 @@ dvb_add_mux(struct dvb_frontend_parameters *fe_param, const char *name, return; } - tdm = calloc(1, sizeof(th_dvb_mux_t)); - tdm->tdm_type = type; - - tdm->tdm_fe_params = malloc(sizeof(struct dvb_frontend_parameters)); - - memcpy(tdm->tdm_fe_params, fe_param, - sizeof(struct dvb_frontend_parameters)); - - if(name == NULL) { - snprintf(buf, sizeof(buf), "%s-%d", typetxt, fe_param->frequency); - - tdm->tdm_name = strdup(buf); - - snprintf(buf, sizeof(buf), "%s: %.1f MHz", typetxt, - (float)fe_param->frequency / 1000000.0f); - } else { - tdm->tdm_name = strdup(name); - snprintf(buf, sizeof(buf), "%s: %.1f MHz (%s)", typetxt, - (float)fe_param->frequency / 1000000.0f, name); - } - - tdm->tdm_title = strdup(buf); - - LIST_INSERT_HEAD(&dvb_muxes, tdm, tdm_global_link); - LIST_FOREACH(tda, &dvb_adapters_probing, tda_link) { - if(tda->tda_fe_info->type == type) - dvb_add_mux_instance(tda, tdm); + if(tda->tda_fe_info->type != type) + continue; /* Does not match frontend */ + + tdmi = calloc(1, sizeof(th_dvb_mux_instance_t)); + pthread_mutex_init(&tdmi->tdmi_table_lock, NULL); + + tdmi->tdmi_status = TDMI_CONFIGURED; + tdmi->tdmi_adapter = tda; + LIST_INSERT_HEAD(&tda->tda_muxes_configured, tdmi, tdmi_adapter_link); + + tdmi->tdmi_type = type; + + tdmi->tdmi_fe_params = malloc(sizeof(struct dvb_frontend_parameters)); + + memcpy(tdmi->tdmi_fe_params, fe_param, + sizeof(struct dvb_frontend_parameters)); + + /* Generate names */ + + snprintf(buf, sizeof(buf), "%s/%s/%.1fMHz", + tda->tda_rootpath, typetxt, + (float)fe_param->frequency / 1000000.0f); + tdmi->tdmi_uniquename = strdup(buf); + + snprintf(buf, sizeof(buf), "%s/%.1fMHz", + typetxt, (float)fe_param->frequency / 1000000.0f); + tdmi->tdmi_shortname = strdup(buf); } } + + static struct strtab fectab[] = { { "NONE", FEC_NONE }, { "1/2", FEC_1_2 }, @@ -196,7 +180,7 @@ dvb_t_config(const char *l) r = str2val(fec2, fectab); f.u.ofdm.code_rate_LP = r == FEC_NONE ? FEC_AUTO : r; - dvb_add_mux(&f, NULL, FE_OFDM); + dvb_add_mux(&f, FE_OFDM); } @@ -223,7 +207,7 @@ dvb_c_config(const char *l) f.u.qam.fec_inner = str2val(fec, fectab); f.u.qam.modulation = str2val(qam, qamtab); - dvb_add_mux(&f, NULL, FE_QAM); + dvb_add_mux(&f, FE_QAM); } @@ -280,34 +264,3 @@ dvb_mux_setup(void) dvb_muxfile_add(ce->ce_value); } - - -/* - * - */ - -int -dvb_configure_transport(th_transport_t *t, const char *muxname, - const char *channel_name) -{ - th_dvb_mux_t *tdm; - - LIST_FOREACH(tdm, &dvb_muxes, tdm_global_link) - if(!strcmp(tdm->tdm_name, muxname)) - break; - - if(tdm == NULL) - return -1; - - t->tht_type = TRANSPORT_DVB; - t->tht_start_feed = dvb_start_feed; - t->tht_stop_feed = dvb_stop_feed; - t->tht_dvb_mux = tdm; - t->tht_name = strdup(tdm->tdm_title); - - transport_link(t, channel_find(channel_name, 1, NULL), THT_MPEG_TS); - return 0; -} - - - diff --git a/dvb_tables.c b/dvb_tables.c index c6dd41d9..3b149e44 100644 --- a/dvb_tables.c +++ b/dvb_tables.c @@ -310,7 +310,6 @@ static int dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, uint8_t tableid, void *opaque) { - th_dvb_mux_t *tdm = tdmi->tdmi_mux; th_transport_t *t; int version; int current_next_indicator; @@ -330,7 +329,7 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, uint8_t stype; int ret = 0, l; - if(tdm->tdm_network == NULL) + if(tdmi->tdmi_network == NULL) return -1; if(len < 8) @@ -419,7 +418,7 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, t->tht_provider = strdup(provider); free((void *)t->tht_network); - t->tht_network = strdup(tdm->tdm_network); + t->tht_network = strdup(tdmi->tdmi_network); if(t->tht_channel == NULL) { /* Not yet mapped to a channel */ @@ -521,8 +520,6 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, uint8_t tag, tlen; int ntl; char networkname[256]; - th_dvb_mux_t *tdm = tdmi->tdmi_mux; - ptr += 5; len -= 5; @@ -547,19 +544,8 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, if(dvb_get_string(networkname, sizeof(networkname), ptr, tlen, "UTF8")) return 0; - if(tdm->tdm_network != NULL) { - if(strcmp(tdm->tdm_network, networkname)) { - syslog(LOG_ALERT, - "DVB Mux conflict \"%s\" on \"%s\" says it's \"%s\", " - "but is has alrady been reported as \"%s\"", - tdm->tdm_name, - tdmi->tdmi_adapter->tda_path, - networkname, - tdm->tdm_network); - } - } else { - tdm->tdm_network = strdup(networkname); - } + free((void *)tdmi->tdmi_network); + tdmi->tdmi_network = strdup(networkname); break; } diff --git a/htmlui.c b/htmlui.c index 835fe7ee..9aabc455 100644 --- a/htmlui.c +++ b/htmlui.c @@ -949,7 +949,7 @@ page_status(http_connection_t *hc, const char *remain, void *opaque) } else { LIST_FOREACH(tda, &dvb_adapters_running, tda_link) { tcp_qprintf(&tq, "
%s
%s
", - tda->tda_path, tda->tda_info); + tda->tda_rootpath, tda->tda_info); LIST_FOREACH(tdmi, &tda->tda_muxes_active, tdmi_adapter_link) { tcp_qprintf(&tq, @@ -957,7 +957,7 @@ page_status(http_connection_t *hc, const char *remain, void *opaque) "width: 160px; float: left\">" "%s" "", - tdmi->tdmi_mux->tdm_title); + tdmi->tdmi_shortname); txt = tdmi->tdmi_status ?: "Ok"; if(tdmi->tdmi_fec_err_per_sec > DVB_FEC_ERROR_LIMIT) @@ -1110,8 +1110,8 @@ page_status(http_connection_t *hc, const char *remain, void *opaque) break; case TRANSPORT_DVB: - t1 = t->tht_dvb_mux->tdm_name; - t2 = t->tht_dvb_adapter->tda_path; + t1 = t->tht_dvb_mux_instance->tdmi_shortname; + t2 = t->tht_dvb_mux_instance->tdmi_adapter->tda_rootpath; break; case TRANSPORT_AVGEN: diff --git a/htsclient.c b/htsclient.c index aec800ce..046981d3 100644 --- a/htsclient.c +++ b/htsclient.c @@ -194,7 +194,6 @@ cr_show(client_t *c, char **argv, int argc) th_transport_t *t; th_channel_t *ch; th_dvb_adapter_t *tda; - th_dvb_mux_t *tdm; th_dvb_mux_instance_t *tdmi; event_t *e; char *tmp; @@ -305,26 +304,10 @@ cr_show(client_t *c, char **argv, int argc) return 0; } - if(!strcasecmp(subcmd, "dvbmuxes")) { - LIST_FOREACH(tdm, &dvb_muxes, tdm_global_link) { - - cprintf(c, "\"%s\"\n", tdm->tdm_title); - - LIST_FOREACH(tdmi, &tdm->tdm_instances, tdmi_mux_link) { - cprintf(c, "%20s: ", tdmi->tdmi_adapter->tda_path); - - print_tdmi(c, tdmi); - - - } - } - return 0; - } - if(!strcasecmp(subcmd, "dvbadapters")) { LIST_FOREACH(tda, &dvb_adapters_running, tda_link) { - cprintf(c, "%20s: ", tda->tda_path); + cprintf(c, "%20s: ", tda->tda_rootpath); tdmi = tda->tda_mux_current; @@ -333,7 +316,7 @@ cr_show(client_t *c, char **argv, int argc) continue; } - cprintf(c, "Tuned to \"%s\"\n", tdmi->tdmi_mux->tdm_title); + cprintf(c, "Tuned to \"%s\"\n", tdmi->tdmi_shortname); cprintf(c, "\t\t "); print_tdmi(c, tda->tda_mux_current); @@ -870,12 +853,8 @@ client_status_update(void *aux, int64_t now) { client_t *c = aux; th_channel_t *ch; - th_dvb_adapter_t *tda; - th_v4l_adapter_t *v4l; - th_dvb_mux_instance_t *tdmi; th_subscription_t *s; th_transport_t *t; - int ccerr, rate; dtimer_arm(&c->c_status_timer, client_status_update, c, 1); @@ -891,93 +870,8 @@ client_status_update(void *aux, int64_t now) continue; } - ccerr = avgstat_read(&t->tht_cc_errors, 60, dispatch_clock); - rate = avgstat_read_and_expire(&t->tht_rate, dispatch_clock); - rate = rate * 8 / 1000 / 10; /* convert to kbit / s */ - - switch(t->tht_type) { - default: - break; - - case TRANSPORT_DVB: - if((tda = t->tht_dvb_adapter) == NULL) { - csprintf(c, ch, - "status = 0\n" - "info = No adapter available" - "transport = %s\n", - t->tht_name); - break; - } - if((tdmi = tda->tda_mux_current) == NULL) { - csprintf(c, ch, - "status = 0\n" - "info = No mux available" - "transport = %s\n", - t->tht_name); - break; - } - - if(tdmi->tdmi_status == NULL) { - csprintf(c, ch, - "status = 1\n" - "info = Signal ok\n" - "adapter = %s\n" - "transport = %s\n" - "uncorrected-blocks = %d\n" - "rate = %d\n" - "cc-errors = %d\n", - tda->tda_path, - t->tht_name, - tdmi->tdmi_uncorrected_blocks, - rate, ccerr); - - - } else { - csprintf(c, ch, - "status = 0" - "info = %s" - "adapter = %s\n" - "transport = %s\n", - tdmi->tdmi_status, - tda->tda_path, - t->tht_name); - } - break; - - case TRANSPORT_IPTV: - csprintf(c, ch, - "status = 1\n" - "info = Signal ok\n" - "transport = %s\n" - "rate = %d\n" - "cc-errors = %d\n", - t->tht_name, - rate, ccerr); - break; - - case TRANSPORT_V4L: - v4l = t->tht_v4l_adapter; - if(v4l == NULL) { - csprintf(c, ch, - "status = 0\n" - "info = No adapter available" - "transport = %s\n", - t->tht_name); - continue; - } - - csprintf(c, ch, - "status = 1\n" - "info = Signal ok\n" - "adapter = %s\n" - "transport = %s\n" - "rate = %d\n" - "cc-errors = %d\n", - v4l->tva_name, - t->tht_name, - rate, ccerr); - break; - - } + csprintf(c, ch, + "status = 0\n" + "info = Running"); } } diff --git a/tvhead.h b/tvhead.h index 44d366af..8d826bae 100644 --- a/tvhead.h +++ b/tvhead.h @@ -145,10 +145,8 @@ typedef enum { * DVB Mux instance */ typedef struct th_dvb_mux_instance { - LIST_ENTRY(th_dvb_mux_instance) tdmi_mux_link; LIST_ENTRY(th_dvb_mux_instance) tdmi_adapter_link; - struct th_dvb_mux *tdmi_mux; struct th_dvb_adapter *tdmi_adapter; uint16_t tdmi_snr, tdmi_signal; @@ -169,8 +167,16 @@ typedef struct th_dvb_mux_instance { time_t tdmi_got_adapter; time_t tdmi_lost_adapter; + int tdmi_type; /* really fe_type_t */ + struct dvb_frontend_parameters *tdmi_fe_params; + + const char *tdmi_shortname; /* Only unique for the specific adapter */ + const char *tdmi_uniquename; /* Globally unique */ + const char *tdmi_network; /* Name of network, from NIT table */ } th_dvb_mux_instance_t; + + /* * */ @@ -189,27 +195,6 @@ typedef struct th_dvb_table { } th_dvb_table_t; -/* - * DVB Mux (more or less the DVB frontend configuration on) - */ -typedef struct th_dvb_mux { - LIST_ENTRY(th_dvb_mux) tdm_global_link; - - struct th_dvb_mux_instance_list tdm_instances; - - struct dvb_frontend_parameters *tdm_fe_params; - - /* XXX: One of these shoud go, there has to be limits */ - - const char *tdm_name; - const char *tdm_title; - const char *tdm_network; - - int tdm_type; /* really fe_type_t */ - -} th_dvb_mux_t; - - /* * DVB Adapter (one of these per physical adapter) */ @@ -222,7 +207,7 @@ typedef struct th_dvb_adapter { struct th_dvb_mux_instance_list tda_muxes_active; th_dvb_mux_instance_t *tda_mux_current; - const char *tda_path; + const char *tda_rootpath; const char *tda_info; LIST_ENTRY(th_dvb_adapter) tda_link; @@ -408,8 +393,7 @@ typedef struct th_transport { union { struct { - struct th_dvb_mux *mux; - struct th_dvb_adapter *adapter; + struct th_dvb_mux_instance *mux_instance; } dvb; struct { @@ -459,8 +443,7 @@ typedef struct th_transport { #define tht_v4l_frequency u.v4l.frequency #define tht_v4l_adapter u.v4l.adapter -#define tht_dvb_mux u.dvb.mux -#define tht_dvb_adapter u.dvb.adapter +#define tht_dvb_mux_instance u.dvb.mux_instance #define tht_iptv_group_addr u.iptv.group_addr #define tht_iptv_interface_addr u.iptv.interface_addr