]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts inputs: allow to disable init/idle scan per tuner/input, fixes #2475
authorJaroslav Kysela <perex@perex.cz>
Fri, 14 Nov 2014 14:07:37 +0000 (15:07 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 14 Nov 2014 14:07:37 +0000 (15:07 +0100)
14 files changed:
src/epggrab/otamux.c
src/input/mpegts.h
src/input/mpegts/linuxdvb/linuxdvb_adapter.c
src/input/mpegts/linuxdvb/linuxdvb_frontend.c
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_mux_dvb.c
src/input/mpegts/mpegts_network.c
src/input/mpegts/mpegts_network_scan.c
src/input/mpegts/mpegts_network_scan.h
src/input/mpegts/mpegts_service.c
src/input/mpegts/satip/satip_frontend.c
src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c
src/subscriptions.h

index 4a219f1df8e7c0e58a30fdb4e2c76f8a0e4b7a7c..c36b15470540ef177cd022cb5d4c2818de5f951f 100644 (file)
@@ -532,7 +532,8 @@ next_one:
 
   /* Subscribe to the mux */
   om->om_requeue = 1;
-  if ((r = mpegts_mux_subscribe(mm, "epggrab", SUBSCRIPTION_PRIO_EPG))) {
+  if ((r = mpegts_mux_subscribe(mm, "epggrab", SUBSCRIPTION_PRIO_EPG,
+                                SUBSCRIPTION_EPG))) {
     TAILQ_INSERT_TAIL(&epggrab_ota_pending, om, om_q_link);
     om->om_q_type = EPGGRAB_OTA_MUX_PENDING;
     if (r == SM_CODE_NO_FREE_ADAPTER)
index b424b5e4bf5cf60f4e67123b34a1e79d7dde62ca..cf899a82848b3c4ee62d49b3bcbde7f17486929e 100644 (file)
@@ -355,6 +355,7 @@ struct mpegts_mux
 
   mpegts_mux_scan_result_t mm_scan_result;  ///< Result of last scan
   int                      mm_scan_weight;  ///< Scan priority
+  int                      mm_scan_flags;   ///< Subscription flags
   int                      mm_scan_init;    ///< Flag to timeout handler
   gtimer_t                 mm_scan_timeout; ///< Timer to handle timeout
   TAILQ_ENTRY(mpegts_mux)  mm_scan_link;    ///< Link to Queue
@@ -539,6 +540,9 @@ struct mpegts_input
 
   int mi_ota_epg;
 
+  int mi_initscan;
+  int mi_idlescan;
+
   LIST_ENTRY(mpegts_input) mi_global_link;
 
   mpegts_network_link_list_t mi_networks;
@@ -588,7 +592,7 @@ struct mpegts_input
   /*
    * Functions
    */
-  int  (*mi_is_enabled)     (mpegts_input_t*, mpegts_mux_t *mm, const char *reason);
+  int  (*mi_is_enabled)     (mpegts_input_t*, mpegts_mux_t *mm, int flags);
   void (*mi_enabled_updated)(mpegts_input_t*);
   void (*mi_display_name)   (mpegts_input_t*, char *buf, size_t len);
   int  (*mi_is_free)        (mpegts_input_t*);
@@ -661,7 +665,7 @@ void mpegts_input_status_timer ( void *p );
 
 int mpegts_input_grace ( mpegts_input_t * mi, mpegts_mux_t * mm );
 
-int mpegts_input_is_enabled ( mpegts_input_t * mi, mpegts_mux_t *mm, const char *reason );
+int mpegts_input_is_enabled ( mpegts_input_t * mi, mpegts_mux_t *mm, int flags );
 
 /* TODO: exposing these class methods here is a bit of a hack */
 const void *mpegts_input_class_network_get  ( void *o );
@@ -747,7 +751,7 @@ void mpegts_mux_open_table ( mpegts_mux_t *mm, mpegts_table_t *mt, int subscribe
 void mpegts_mux_close_table ( mpegts_mux_t *mm, mpegts_table_t *mt );
 
 void mpegts_mux_remove_subscriber(mpegts_mux_t *mm, th_subscription_t *s, int reason);
-int  mpegts_mux_subscribe(mpegts_mux_t *mm, const char *name, int weight);
+int  mpegts_mux_subscribe(mpegts_mux_t *mm, const char *name, int weight, int flags);
 void mpegts_mux_unsubscribe_by_name(mpegts_mux_t *mm, const char *name);
 
 void mpegts_mux_scan_done ( mpegts_mux_t *mm, const char *buf, int res );
index 1e58c83d8656f653b2601f990dc7c07a02eb79bf..b34c1cb02791fa7b6bc8469baaf3bd02f78a3d91 100644 (file)
@@ -120,7 +120,7 @@ linuxdvb_adapter_is_enabled ( linuxdvb_adapter_t *la )
 {
   linuxdvb_frontend_t *lfe;
   LIST_FOREACH(lfe, &la->la_frontends, lfe_link) {
-    if (lfe->mi_is_enabled((mpegts_input_t*)lfe, NULL, "adapter"))
+    if (lfe->mi_is_enabled((mpegts_input_t*)lfe, NULL, 0))
       return 1;
   }
   return 0;
index 81ce6c15674d18fcc4e8f36d9e2ad608fd1c8323..83159ce457d7769e3f8cbeadc85975763675b7fe 100644 (file)
@@ -263,12 +263,11 @@ linuxdvb_frontend_get_grace ( mpegts_input_t *mi, mpegts_mux_t *mm )
 }
 
 static int
-linuxdvb_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
-                               const char *reason )
+linuxdvb_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
 {
   linuxdvb_frontend_t *lfe = (linuxdvb_frontend_t*)mi;
   if (lfe->lfe_fe_path == NULL) return 0;
-  if (!mpegts_input_is_enabled(mi, mm, reason)) return 0;
+  if (!mpegts_input_is_enabled(mi, mm, flags)) return 0;
   if (access(lfe->lfe_fe_path, R_OK | W_OK)) return 0;
   if (lfe->lfe_in_setup) return 0;
   return 1;
index b5e46c6738a9c77ebd43642e643afd2568535636..8605d9d940c9775eadd32560a53fd5b3d5c14439 100644 (file)
@@ -185,6 +185,22 @@ const idclass_t mpegts_input_class =
       .off      = offsetof(mpegts_input_t, mi_ota_epg),
       .def.i    = 1,
     },
+    {
+      .type     = PT_BOOL,
+      .id       = "initscan",
+      .name     = "Initial Scan",
+      .off      = offsetof(mpegts_input_t, mi_initscan),
+      .def.i    = 1,
+      .opts     = PO_ADVANCED,
+    },
+    {
+      .type     = PT_BOOL,
+      .id       = "idlescan",
+      .name     = "Idle Scan",
+      .off      = offsetof(mpegts_input_t, mi_idlescan),
+      .def.i    = 1,
+      .opts     = PO_ADVANCED,
+    },
     {
       .type     = PT_STR,
       .id       = "networks",
@@ -204,10 +220,13 @@ const idclass_t mpegts_input_class =
  * *************************************************************************/
 
 int
-mpegts_input_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
-                          const char *reason )
+mpegts_input_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
 {
-  if (!strcmp(reason, "epggrab") && !mi->mi_ota_epg)
+  if ((flags & SUBSCRIPTION_EPG) != 0 && !mi->mi_ota_epg)
+    return 0;
+  if ((flags & SUBSCRIPTION_INITSCAN) != 0 && !mi->mi_initscan)
+    return 0;
+  if ((flags & SUBSCRIPTION_IDLESCAN) != 0 && !mi->mi_idlescan)
     return 0;
   return mi->mi_enabled;
 }
@@ -1123,6 +1142,8 @@ mpegts_input_create0
 
   /* Defaults */
   mi->mi_ota_epg = 1;
+  mi->mi_initscan = 1;
+  mi->mi_idlescan = 1;
 
   /* Add to global list */
   LIST_INSERT_HEAD(&mpegts_input_all, mi, mi_global_link);
index a5295475ed713b78771b23d2ddfaf26b51be9eca..d4a647b0dfc9b2bd530396813c0943f3a9daa599 100644 (file)
@@ -275,7 +275,8 @@ mpegts_mux_class_scan_state_set ( void *o, const void *p )
       return 0;
 
     /* Start */
-    mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_USER, 0);
+    mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_USER,
+                                  SUBSCRIPTION_USERSCAN, 0);
 
   /* Stop */
   } else if (state == MM_SCAN_STATE_IDLE) {
@@ -570,7 +571,7 @@ mpegts_mux_start
   /* Calculate priority+weight and sort */
   count = 0;
   LIST_FOREACH(mmi, &mm->mm_instances, mmi_mux_link) {
-    int e = mmi->mmi_input->mi_is_enabled(mmi->mmi_input, mm, reason);
+    int e = mmi->mmi_input->mi_is_enabled(mmi->mmi_input, mm, flags);
     tvhtrace("mpegts", "%s -   mmi %p enabled %d", buf, mmi, e);
     if (!e) continue;
     enabled = 1;
@@ -979,9 +980,11 @@ mpegts_mux_create0
 
   /* Initial scan */
   if (mm->mm_scan_result == MM_SCAN_NONE || !mn->mn_skipinitscan)
-    mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT, 10);
+    mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT,
+                                  SUBSCRIPTION_INITSCAN, 10);
   else if (mm->mm_network->mn_idlescan)
-    mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE, 10);
+    mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE,
+                                  SUBSCRIPTION_IDLESCAN, 10);
 
   mpegts_mux_nice_name(mm, buf, sizeof(buf));
   tvhtrace("mpegts", "%s - created", buf);
@@ -1079,7 +1082,7 @@ mpegts_mux_remove_subscriber
 
 int
 mpegts_mux_subscribe
-  ( mpegts_mux_t *mm, const char *name, int weight )
+  ( mpegts_mux_t *mm, const char *name, int weight, int flags )
 {
   int err = 0;
   profile_chain_t prch;
@@ -1087,7 +1090,7 @@ mpegts_mux_subscribe
   memset(&prch, 0, sizeof(prch));
   prch.prch_id = mm;
   s = subscription_create_from_mux(&prch, weight, name,
-                                   SUBSCRIPTION_NONE,
+                                   SUBSCRIPTION_NONE | flags,
                                    NULL, NULL, NULL, &err);
   return s ? 0 : err;
 }
index 0c6074f4c1229ab3947e114ba7709b1b7a285570..7784c613175f1f9d43f1296fb94042212fb5cd54 100644 (file)
@@ -600,7 +600,7 @@ dvb_mux_create_instances ( mpegts_mux_t *mm )
   mpegts_network_link_t *mnl;
   LIST_FOREACH(mnl, &mm->mm_network->mn_inputs, mnl_mn_link) {
     mpegts_input_t *mi = mnl->mnl_input;
-    if (mi->mi_is_enabled(mi, mm, "service"))
+    if (mi->mi_is_enabled(mi, mm, 0))
       mi->mi_create_mux_instance(mi, mm);
   }
 }
index 5e95da3b0074a7a69e2021eed2a2fd8f57ebb288..4a0ac58fcd0976e8078fbadf7401f25d0aa8c581 100644 (file)
@@ -118,10 +118,13 @@ mpegts_network_class_idlescan_notify ( void *p )
   mpegts_mux_t *mm;
   LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link) {
     if (mn->mn_idlescan)
-      mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE, 0);
+      mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE,
+                                    SUBSCRIPTION_IDLESCAN, 0);
     else if (mm->mm_scan_state  == MM_SCAN_STATE_PEND &&
-             mm->mm_scan_weight == SUBSCRIPTION_PRIO_SCAN_IDLE)
+             mm->mm_scan_weight == SUBSCRIPTION_PRIO_SCAN_IDLE) {
+      mm->mm_scan_flags = 0;
       mpegts_network_scan_queue_del(mm);
+    }
   }
 }
 
index 5021fdd287340ed90ce7ef03772e5411a486c038..1657bbab43bb978f6100ad45d6955684207a0b1e 100644 (file)
@@ -50,7 +50,8 @@ mpegts_network_scan_timer_cb ( void *p )
     assert(mm->mm_scan_state == MM_SCAN_STATE_PEND);
 
     /* Attempt to tune */
-    r = mpegts_mux_subscribe(mm, "scan", mm->mm_scan_weight);
+    printf("mm->mm_scan_flags = 0x%x\n", mm->mm_scan_flags);
+    r = mpegts_mux_subscribe(mm, "scan", mm->mm_scan_weight, mm->mm_scan_flags);
 
     /* Started */
     if (!r) {
@@ -123,7 +124,7 @@ mpegts_network_scan_mux_done0
 
   /* Re-enable? */
   if (weight > 0)
-    mpegts_network_scan_queue_add(mm, weight, 10);
+    mpegts_network_scan_queue_add(mm, weight, mm->mm_scan_flags, 10);
 }
 
 /* Failed - couldn't start */
@@ -137,6 +138,7 @@ mpegts_network_scan_mux_fail    ( mpegts_mux_t *mm )
 void
 mpegts_network_scan_mux_done    ( mpegts_mux_t *mm )
 {
+  mm->mm_scan_flags = 0;
   mpegts_network_scan_mux_done0(mm, MM_SCAN_OK, 0);
 }
 
@@ -154,6 +156,9 @@ mpegts_network_scan_mux_cancel  ( mpegts_mux_t *mm, int reinsert )
   if (mm->mm_scan_state != MM_SCAN_STATE_ACTIVE)
     return;
 
+  if (!reinsert)
+    mm->mm_scan_flags = 0;
+
   mpegts_network_scan_mux_done0(mm, MM_SCAN_NONE,
                                 reinsert ? mm->mm_scan_weight : 0);
 }
@@ -196,7 +201,8 @@ mpegts_network_scan_queue_del ( mpegts_mux_t *mm )
 }
 
 void
-mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight, int delay )
+mpegts_network_scan_queue_add
+  ( mpegts_mux_t *mm, int weight, int flags, int delay )
 {
   int reload = 0;
   char buf[256], buf2[256];;
@@ -228,7 +234,10 @@ mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight, int delay )
            buf2, buf, weight);
 
   /* Add new entry */
-  mm->mm_scan_state = MM_SCAN_STATE_PEND;
+  mm->mm_scan_state  = MM_SCAN_STATE_PEND;
+  mm->mm_scan_flags |= flags;
+  if (mm->mm_scan_flags == 0)
+    mm->mm_scan_flags = SUBSCRIPTION_IDLE;
   TAILQ_INSERT_SORTED_R(&mn->mn_scan_pend, mpegts_mux_queue,
                         mm, mm_scan_link, mm_cmp);
   gtimer_arm(&mn->mn_scan_timer, mpegts_network_scan_timer_cb, mn, delay);
index 349d7878a212d205c3d58982bfc3107da08fb51a..7f44d3c8b7c9d4c622a9831fdfad1d416fe96d71 100644 (file)
@@ -33,7 +33,8 @@ void mpegts_network_scan_timer_cb ( void *p );
 /*
  * Registration functions
  */
-void mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight, int delay );
+void mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight,
+                                     int flags, int delay );
 void mpegts_network_scan_queue_del ( mpegts_mux_t *mm );
 
 /*
index 034594ea51a7f9ba10d7343ad169a09eb0caca2e..1d561e09f30456d8446aa45dbd10e106effc5984 100644 (file)
@@ -242,7 +242,7 @@ mpegts_service_enlist(service_t *t, struct service_instance_list *sil, int flags
 
     mi = mmi->mmi_input;
 
-    if (!mi->mi_is_enabled(mi, mmi->mmi_mux, "service")) continue;
+    if (!mi->mi_is_enabled(mi, mmi->mmi_mux, flags)) continue;
 
     /* Set weight to -1 (forced) for already active mux */
     if (mmi->mmi_mux->mm_active == mmi) {
index 703d49a04e79e418d181805c3b6f70f5204de91a..53a8f4d1a3728440ca1ffd4c54e40acd2b350d96 100644 (file)
@@ -366,8 +366,7 @@ satip_frontend_match_satcfg ( satip_frontend_t *lfe2, mpegts_mux_t *mm2 )
 }
 
 static int
-satip_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
-                            const char *reason )
+satip_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
 {
   satip_frontend_t *lfe = (satip_frontend_t*)mi;
   satip_frontend_t *lfe2;
@@ -375,7 +374,7 @@ satip_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
 
   lock_assert(&global_lock);
 
-  if (!mpegts_input_is_enabled(mi, mm, reason)) return 0;
+  if (!mpegts_input_is_enabled(mi, mm, flags)) return 0;
   if (lfe->sf_device->sd_dbus_allow <= 0) return 0;
   if (lfe->sf_type != DVB_TYPE_S) return 1;
   /* check if the position is enabled */
index 07fcc89436bd76569b4200b97c08a160a83bced7..e0ac5dfd87bd832ed70ae7f9fc6acddc3e24d446 100644 (file)
@@ -64,12 +64,9 @@ tvhdhomerun_frontend_get_grace ( mpegts_input_t *mi, mpegts_mux_t *mm )
 }
 
 static int
-tvhdhomerun_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
-                                                                 const char *reason )
+tvhdhomerun_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
 {
-  tvhdhomerun_frontend_t *hfe = (tvhdhomerun_frontend_t*)mi;
-  if (!hfe->mi_enabled) return 0;
-  return 1;
+  return mpegts_input_is_enabled(mi, mm, flags);
 }
 
 static void *
index d6461444fb0391000f769f6b4e81644ff217f5bf..968da66cf832b1add3dc2ad2fae221358aeaa7dc 100644 (file)
@@ -25,11 +25,15 @@ struct profile_chain;
 
 extern struct th_subscription_list subscriptions;
 
-#define SUBSCRIPTION_RAW_MPEGTS 0x01
-#define SUBSCRIPTION_NONE       0x02
-#define SUBSCRIPTION_FULLMUX    0x04
-#define SUBSCRIPTION_STREAMING  0x08
-#define SUBSCRIPTION_RESTART    0x10
+#define SUBSCRIPTION_RAW_MPEGTS 0x001
+#define SUBSCRIPTION_NONE       0x002
+#define SUBSCRIPTION_FULLMUX    0x004
+#define SUBSCRIPTION_STREAMING  0x008
+#define SUBSCRIPTION_RESTART    0x010
+#define SUBSCRIPTION_INITSCAN   0x020 ///< for mux subscriptions
+#define SUBSCRIPTION_IDLESCAN   0x040 ///< for mux subscriptions
+#define SUBSCRIPTION_USERSCAN   0x080 ///< for mux subscriptions
+#define SUBSCRIPTION_EPG        0x100 ///< for mux subscriptions
 
 /* Some internal prioties */
 #define SUBSCRIPTION_PRIO_SCAN_IDLE   1 ///< Idle scanning