]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb: added extra priority per adapter 94/head
authorMartin Mrvka <mmrvka@gmail.com>
Mon, 18 Jun 2012 21:00:54 +0000 (23:00 +0200)
committerMartin Mrvka <mmrvka@gmail.com>
Mon, 18 Jun 2012 21:00:54 +0000 (23:00 +0200)
src/dvb/dvb.h
src/dvb/dvb_adapter.c
src/service.c
src/webui/extjs_dvb.c
src/webui/static/app/dvb.js

index 80ff45566ebbc68a86c5ade4617b6a80d138b751..8fac101379fe628923d03076180b67c65436a1d4 100644 (file)
@@ -205,6 +205,8 @@ typedef struct th_dvb_adapter {
   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;
 
 
@@ -247,6 +249,8 @@ htsmsg_t *dvb_adapter_build_msg(th_dvb_adapter_t *tda);
 
 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
  */
index 433107aed48199cc3c1f03ff25026d9bc1d2eb99..0337aa9d63778bba2cc438bc6f222b67bda8770b 100644 (file)
@@ -86,6 +86,7 @@ tda_save(th_dvb_adapter_t *tda)
   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);
 }
@@ -232,6 +233,23 @@ dvb_adapter_set_diseqc_version(th_dvb_adapter_t *tda, unsigned int v)
   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);
+}
 
 /**
  *
@@ -383,6 +401,7 @@ dvb_adapter_init(uint32_t adapter_mask)
       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);
   }
index 515c39796b2617233c6bfed5664e71e349c183ec..7b76ebfb0e5e778b86983e00de3701c31eb381cf 100644 (file)
@@ -231,7 +231,7 @@ service_start(service_t *t, unsigned int weight, int force_start)
 static int
 dvb_extra_prio(th_dvb_adapter_t *tda)
 {
-  return tda->tda_hostconnection * 10;
+  return tda->tda_extrapriority + tda->tda_hostconnection * 10;
 }
 
 /**
@@ -285,10 +285,19 @@ servicecmp(const void *A, const void *B)
   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);
 }
@@ -335,6 +344,9 @@ service_find(channel_t *ch, unsigned int weight, const char *loginfo,
       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
@@ -358,6 +370,9 @@ service_find(channel_t *ch, unsigned int weight, const char *loginfo,
   /* 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)
@@ -372,6 +387,9 @@ service_find(channel_t *ch, unsigned int weight, const char *loginfo,
 
   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;
index 4080868e645e873624186d2f52b3d93dc1fcc589..b9b918baf684018f4ab8f49aac99d359044a2dc8 100644 (file)
@@ -156,6 +156,7 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque)
                   ((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")) {
@@ -185,6 +186,9 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque)
        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")) {
index 5b7d057682a199e0b502a525d6eecf321c58e019..9c7b7761d1d8493543ed8490135fd7ad3f9bfbdb 100644 (file)
@@ -1106,7 +1106,7 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) {
     var confreader = new Ext.data.JsonReader({
        root: 'dvbadapters'
     }, ['name', 'automux', 'idlescan', 'diseqcversion', 'qmon',
-       'dumpmux', 'nitoid']);
+       'dumpmux', 'nitoid','extrapriority']);
 
     
     function saveConfForm () {
@@ -1150,6 +1150,11 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) {
            fieldLabel: 'NIT-o Network ID',
            name: 'nitoid',
            width: 50
+       },
+       {
+           fieldLabel: 'Extra priority',
+           name: 'extrapriority',
+           width: 50
        }
     ];