int tda_unc_is_delta; /* 1 if we believe FE_READ_UNCORRECTED_BLOCKS
* return dela values */
+ uint32_t tda_extrapriority; // extra priority for choosing the best adapter/service
+
} th_dvb_adapter_t;
htsmsg_t *dvb_fe_opts(th_dvb_adapter_t *tda, const char *which);
+void dvb_adapter_set_extrapriority(th_dvb_adapter_t *tda, int extrapriority);
+
/**
* DVB Multiplex
*/
htsmsg_add_u32(m, "dump_muxes", tda->tda_dump_muxes);
htsmsg_add_u32(m, "nitoid", tda->tda_nitoid);
htsmsg_add_u32(m, "diseqc_version", tda->tda_diseqc_version);
+ htsmsg_add_u32(m, "extrapriority", tda->tda_extrapriority);
hts_settings_save(m, "dvbadapters/%s", tda->tda_identifier);
htsmsg_destroy(m);
}
tda_save(tda);
}
+/**
+ *
+ */
+void
+dvb_adapter_set_extrapriority(th_dvb_adapter_t *tda, int extrapriority)
+{
+ lock_assert(&global_lock);
+
+ if(tda->tda_extrapriority == extrapriority)
+ return;
+
+ tvhlog(LOG_NOTICE, "dvb", "Adapter \"%s\" extra priority \"%d\" changed to \"%d\"",
+ tda->tda_displayname, tda->tda_extrapriority, extrapriority);
+
+ tda->tda_extrapriority = extrapriority;
+ tda_save(tda);
+}
/**
*
htsmsg_get_u32(c, "dump_muxes", &tda->tda_dump_muxes);
htsmsg_get_u32(c, "nitoid", &tda->tda_nitoid);
htsmsg_get_u32(c, "diseqc_version", &tda->tda_diseqc_version);
+ htsmsg_get_u32(c, "extrapriority", &tda->tda_extrapriority);
}
htsmsg_destroy(l);
}
static int
dvb_extra_prio(th_dvb_adapter_t *tda)
{
- return tda->tda_hostconnection * 10;
+ return tda->tda_extrapriority + tda->tda_hostconnection * 10;
}
/**
service_t *a = *(service_t **)A;
service_t *b = *(service_t **)B;
- int q = service_get_quality(a) - service_get_quality(b);
+ /* only check quality if both adapters have the same prio
+ *
+ * there needs to be a much more sophisticated algorithm to take priority and quality into account
+ * additional, it may be problematic, since a higher priority value lowers the ranking
+ *
+ */
+ if (dvb_extra_prio(a->s_dvb_mux_instance->tdmi_adapter) == dvb_extra_prio(b->s_dvb_mux_instance->tdmi_adapter)) {
+
+ int q = service_get_quality(a) - service_get_quality(b);
- if(q != 0)
- return q; /* Quality precedes priority */
+ if(q != 0)
+ return q; /* Quality precedes priority */
+ }
return service_get_prio(a) - service_get_prio(b);
}
continue;
}
vec[cnt++] = t;
+ tvhlog(LOG_DEBUG, "Service",
+ "%s: Adding adapter \"%s\" for service \"%s\"",
+ loginfo, t->s_dvb_mux_instance->tdmi_identifier, service_nicename(t));
}
/* Sort services, lower priority should come come earlier in the vector
/* First, try all services without stealing */
for(i = off; i < cnt; i++) {
t = vec[i];
+ tvhlog(LOG_DEBUG, "Service", "%s: Probing adapter \"%s\" without stealing for service \"%s\"",
+ loginfo, t->s_dvb_mux_instance->tdmi_identifier, service_nicename(t));
+
if(t->s_status == SERVICE_RUNNING)
return t;
if((r = service_start(t, 0, 0)) == 0)
for(i = off; i < cnt; i++) {
t = vec[i];
+ tvhlog(LOG_DEBUG, "Service", "%s: Probing adapter \"%s\" with weight %d for service \"%s\"",
+ loginfo, t->s_dvb_mux_instance->tdmi_identifier, weight, service_nicename(t));
+
if((r = service_start(t, weight, 0)) == 0)
return t;
*errorp = r;
((const char *[]){"DiSEqC 1.0 / 2.0",
"DiSEqC 1.1 / 2.1"})
[tda->tda_diseqc_version % 2]);
+ htsmsg_add_u32(r, "extrapriority", tda->tda_extrapriority);
out = json_single_record(r, "dvbadapters");
} else if(!strcmp(op, "save")) {
dvb_adapter_set_diseqc_version(tda, 1);
}
+ if((s = http_arg_get(&hc->hc_req_args, "extrapriority")) != NULL)
+ dvb_adapter_set_extrapriority(tda, atoi(s));
+
out = htsmsg_create_map();
htsmsg_add_u32(out, "success", 1);
} else if(!strcmp(op, "addnetwork")) {
var confreader = new Ext.data.JsonReader({
root: 'dvbadapters'
}, ['name', 'automux', 'idlescan', 'diseqcversion', 'qmon',
- 'dumpmux', 'nitoid']);
+ 'dumpmux', 'nitoid','extrapriority']);
function saveConfForm () {
fieldLabel: 'NIT-o Network ID',
name: 'nitoid',
width: 50
+ },
+ {
+ fieldLabel: 'Extra priority',
+ name: 'extrapriority',
+ width: 50
}
];