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.
This commit is contained in:
parent
ec5de47b49
commit
38a16f8088
10 changed files with 98 additions and 312 deletions
|
@ -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);
|
||||
|
|
56
dvb.c
56
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
3
dvb.h
3
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);
|
||||
|
||||
|
|
40
dvb_dvr.c
40
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;
|
||||
|
|
7
dvb_fe.c
7
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 */
|
||||
|
||||
|
|
115
dvb_muxconfig.c
115
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
22
dvb_tables.c
22
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;
|
||||
}
|
||||
|
||||
|
|
8
htmlui.c
8
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, "<br><b>%s</b><br>%s<br>",
|
||||
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"
|
||||
"</span>",
|
||||
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:
|
||||
|
|
116
htsclient.c
116
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");
|
||||
}
|
||||
}
|
||||
|
|
39
tvhead.h
39
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
|
||||
|
|
Loading…
Add table
Reference in a new issue