]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
service: Add possibility to disable automatic service checking per service
authorJaroslav Kysela <perex@perex.cz>
Fri, 5 Dec 2014 12:20:40 +0000 (13:20 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 5 Dec 2014 12:20:40 +0000 (13:20 +0100)
src/input/mpegts/dvb_psi.c
src/service.c
src/service.h

index 0b4e8a0d90f3bfaf6a6c5d254a0f752925a5bbdd..e6ff7e4dea3be84c84ec55620447c2ec0273ac49 100644 (file)
@@ -1035,9 +1035,10 @@ dvb_pat_callback
         last_seen = s->s_dvb_check_seen;
     for (s = LIST_FIRST(&mm->mm_services); s; s = snext) {
       snext = LIST_NEXT(s, s_dvb_mux_link);
-      if (s->s_enabled && s->s_dvb_check_seen + 24 * 3600 < last_seen) {
+      if (s->s_enabled && s->s_auto != SERVICE_AUTO_OFF &&
+          s->s_dvb_check_seen + 24 * 3600 < last_seen) {
         tvhinfo("mpegts", "disabling service %s (missing in PAT)", s->s_nicename ?: "<unknown>");
-        service_set_enabled((service_t *)s, 0);
+        service_set_enabled((service_t *)s, 0, SERVICE_AUTO_PAT_MISSING);
       }
     }
     mt->mt_opaque = mm;
index 5ccde9fb2c6725cf22cd252c9aada804135c6eca..5897d23be4ccd61d4b8a97f77436b68c8580ef92 100644 (file)
@@ -57,7 +57,10 @@ struct service_queue service_all;
 static void
 service_class_notify_enabled ( void *obj )
 {
-  bouquet_notify_service_enabled((service_t *)obj);
+  service_t *t = (service_t *)obj;
+  if (t->s_enabled && t->s_auto != SERVICE_AUTO_OFF)
+    t->s_auto = SERVICE_AUTO_NORMAL;
+  bouquet_notify_service_enabled(t);
 }
 
 static const void *
@@ -174,6 +177,17 @@ service_class_caid_get ( void *obj )
   return &s;
 }
 
+static htsmsg_t *
+service_class_auto_list ( void *o )
+{
+  static const struct strtab tab[] = {
+    { "",                   0 },
+    { "No Auto (Disabled)", 1 },
+    { "Missing In PAT",     2 }
+  };
+  return strtab2htsmsg(tab);
+}
+
 const idclass_t service_class = {
   .ic_class      = "service",
   .ic_caption    = "Service",
@@ -190,6 +204,13 @@ const idclass_t service_class = {
       .off      = offsetof(service_t, s_enabled),
       .notify   = service_class_notify_enabled,
     },
+    {
+      .type     = PT_INT,
+      .id       = "auto",
+      .name     = "Automatic Checking",
+      .list     = service_class_auto_list,
+      .off      = offsetof(service_t, s_auto),
+    },
     {
       .type     = PT_STR,
       .islist   = 1,
@@ -821,10 +842,11 @@ service_destroy(service_t *t, int delconf)
 }
 
 void
-service_set_enabled(service_t *t, int enabled)
+service_set_enabled(service_t *t, int enabled, int _auto)
 {
   if (t->s_enabled != !!enabled) {
     t->s_enabled = !!enabled;
+    t->s_auto = _auto;
     service_class_notify_enabled(t);
     service_request_save(t, 0);
     idnode_notify_simple(&t->s_id);
index 36f8fe606d6f0b5ea67967ee31d697e605fb7269..d4f4664cee2f6c277b1f5c038ccf669c00a1eaee 100644 (file)
@@ -191,6 +191,13 @@ typedef struct service_lcn {
 } service_lcn_t;
 
 
+/**
+ *
+ */
+#define SERVICE_AUTO_NORMAL       0
+#define SERVICE_AUTO_OFF          1
+#define SERVICE_AUTO_PAT_MISSING  2
+
 /**
  *
  */
@@ -280,6 +287,7 @@ typedef struct service {
    * subscription scheduling.
    */
   int s_enabled;
+  int s_auto;
 
   LIST_ENTRY(service) s_active_link;
 
@@ -521,7 +529,7 @@ int service_is_other(service_t *t);
 
 int service_is_encrypted ( service_t *t );
 
-void service_set_enabled ( service_t *t, int enabled );
+void service_set_enabled ( service_t *t, int enabled, int _auto );
 
 void service_destroy(service_t *t, int delconf);