{
th_dvb_adapter_t *tda = aux;
th_dvb_mux_instance_t *tdmi;
- int i, v, vv;
+ int i, v, vv, n;
const char *s;
+ int savemux = 0;
dtimer_arm(&tda->tda_fec_monitor_timer, dvb_fec_monitor, tda, 1);
}
}
-
- if(dvb_mux_status(tdmi, 1) != NULL) {
+ n = dvb_mux_badness(tdmi);
+ if(n > 0) {
if(tdmi->tdmi_quality > -50) {
- tdmi->tdmi_quality--;
+ tdmi->tdmi_quality -= n;
dvb_notify_mux_quality(tdmi);
+ savemux = 1;
}
} else {
if(tdmi->tdmi_quality < 0) {
tdmi->tdmi_quality++;
dvb_notify_mux_quality(tdmi);
+ savemux = 1;
}
}
- s = dvb_mux_status(tdmi, 0);
-
- if(s != tdmi->tdmi_last_status) {
- tdmi->tdmi_last_status = s;
+ s = dvb_mux_status(tdmi);
+ if(strcmp(s, tdmi->tdmi_last_status)) {
+ free(tdmi->tdmi_last_status);
+ tdmi->tdmi_last_status = strdup(s);
dvb_notify_mux_status(tdmi);
+ savemux = 1;
}
+
+ if(savemux)
+ dvb_mux_save(tdmi);
}
tdmi->tdmi_transport_stream_id = tsid;
tdmi->tdmi_adapter = tda;
tdmi->tdmi_network = network ? strdup(network) : NULL;
+ tdmi->tdmi_last_status = strdup("Initializing");
if(entries_before == 0 && tda->tda_rootpath != NULL) {
/* First mux on adapter with backing hardware, start scanner */
htsmsg_t *m = htsmsg_create();
+ htsmsg_add_u32(m, "quality", -tdmi->tdmi_quality);
+ htsmsg_add_str(m, "status", tdmi->tdmi_last_status);
+
htsmsg_add_u32(m, "transportstreamid", tdmi->tdmi_transport_stream_id);
if(tdmi->tdmi_network != NULL)
htsmsg_add_str(m, "network", tdmi->tdmi_network);
static const char *
tdmi_create_by_msg(th_dvb_adapter_t *tda, htsmsg_t *m)
{
+ th_dvb_mux_instance_t *tdmi;
struct dvb_frontend_parameters f;
const char *s;
int r;
int polarisation = 0;
unsigned int switchport = 0;
- unsigned int tsid;
+ unsigned int tsid, u32;
memset(&f, 0, sizeof(f));
if(htsmsg_get_u32(m, "transportstreamid", &tsid))
tsid = 0xffff;
- dvb_mux_create(tda, &f, polarisation, switchport,
- tsid, htsmsg_get_str(m, "network"), NULL);
+ tdmi = dvb_mux_create(tda, &f, polarisation, switchport,
+ tsid, htsmsg_get_str(m, "network"), NULL);
+ if(tdmi != NULL) {
+ s = htsmsg_get_str(m, "status");
+ if(s != NULL) {
+ free((void *)tdmi->tdmi_last_status);
+ tdmi->tdmi_last_status = strdup(s);
+ }
+
+ if(!htsmsg_get_u32(m, "quality", &u32))
+ tdmi->tdmi_quality = -u32;
+ }
return NULL;
}
/**
- *
+ * Return a readable status text for the given mux
*/
const char *
-dvb_mux_status(th_dvb_mux_instance_t *tdmi, int nullisok)
+dvb_mux_status(th_dvb_mux_instance_t *tdmi)
{
- int i, v, vv;
- const char *txt = tdmi->tdmi_status ?: (nullisok ? NULL : "Ok");
-
- v = vv = 0;
- for(i = 0; i < TDMI_FEC_ERR_HISTOGRAM_SIZE; i++) {
- if(tdmi->tdmi_fec_err_histogram[i] > DVB_FEC_ERROR_LIMIT)
- v++;
- vv += tdmi->tdmi_fec_err_histogram[i];
- }
- vv /= TDMI_FEC_ERR_HISTOGRAM_SIZE;
+ int i, v = 0;
+
+ for(i = 0; i < TDMI_FEC_ERR_HISTOGRAM_SIZE; i++)
+ v += tdmi->tdmi_fec_err_histogram[i] > DVB_FEC_ERROR_LIMIT;
if(v == TDMI_FEC_ERR_HISTOGRAM_SIZE)
- txt = "Constant FEC";
+ return "Constant FEC";
else if(v > 0)
- txt = "Bursty FEC";
+ return "Bursty FEC";
+
+ return tdmi->tdmi_status ?: "OK";
+}
- return txt;
+
+/**
+ * Return a badness value (0-3)
+ */
+int
+dvb_mux_badness(th_dvb_mux_instance_t *tdmi)
+{
+ int i, v = 0;
+
+ if(tdmi->tdmi_status)
+ return 3;
+
+ for(i = 0; i < TDMI_FEC_ERR_HISTOGRAM_SIZE; i++)
+ v += tdmi->tdmi_fec_err_histogram[i] > DVB_FEC_ERROR_LIMIT;
+
+ if(v == TDMI_FEC_ERR_HISTOGRAM_SIZE)
+ return 2;
+ else if(v > 0)
+ return 1;
+
+ return 0;
}
const char *dvb_polarisation_to_str(int pol);
th_dvb_adapter_t *dvb_adapter_find_by_identifier(const char *identifier);
th_dvb_mux_instance_t *dvb_mux_find_by_identifier(const char *identifier);
-const char *dvb_mux_status(th_dvb_mux_instance_t *tdmi, int nullisok);
void dvb_mux_nicename(char *buf, size_t size, th_dvb_mux_instance_t *tdmi);
int dvb_quality_to_percent(int qual);
+int dvb_mux_badness(th_dvb_mux_instance_t *tdmi);
+const char *dvb_mux_status(th_dvb_mux_instance_t *tdmi);
+
#endif /* DVB_SUPPORT_H */
dtimer_t tdmi_initial_scan_timer;
const char *tdmi_status;
- const char *tdmi_last_status; /* For notification updates */
+ char *tdmi_last_status; /* For notification updates */
int tdmi_quality;
extjs_dvbtree_node(out, 0,
tdmi->tdmi_identifier, buf, "DVB Mux",
- dvb_mux_status(tdmi, 0),
+ tdmi->tdmi_last_status,
100 + tdmi->tdmi_quality * 2, "mux");
}
} else if((tdmi = dvb_mux_find_by_identifier(s)) != NULL) {