]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts input: show idle tuners with cummulative errors, fixes #3090
authorJaroslav Kysela <perex@perex.cz>
Mon, 12 Oct 2015 19:46:06 +0000 (21:46 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 12 Oct 2015 19:46:06 +0000 (21:46 +0200)
src/api/api_status.c
src/input.c
src/input.h
src/input/mpegts.h
src/input/mpegts/linuxdvb/linuxdvb_frontend.c
src/input/mpegts/mpegts_input.c
src/input/mpegts/satip/satip_frontend.c
src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c

index 0f7cfef5d05327505ece41f0a946159efe46c94f..9adce24ad0c7a16cc006ef318a0d899c3fcc82cd 100644 (file)
@@ -128,11 +128,15 @@ static void
 input_clear_stats(const char *uuid)
 {
   tvh_input_instance_t *tii;
+  tvh_input_t *ti;
 
   pthread_mutex_lock(&global_lock);
   if ((tii = tvh_input_instance_find_by_uuid(uuid)) != NULL)
     if (tii->tii_clear_stats)
       tii->tii_clear_stats(tii);
+  if ((ti = tvh_input_find_by_uuid(uuid)) != NULL)
+    if (ti->ti_clear_stats)
+      ti->ti_clear_stats(ti);
   pthread_mutex_unlock(&global_lock);
 }
 
index 679e75e6e3ee51792ee59836c223b378d114563d..7b6be29b2715abd4691e14b7d38de0efca53ca96 100644 (file)
 tvh_input_list_t    tvh_inputs;
 tvh_hardware_list_t tvh_hardware;
 
+const idclass_t tvh_input_class =
+{
+  .ic_class      = "tvh_input",
+  .ic_caption    = N_("Input Base"),
+  .ic_perm_def   = ACCESS_ADMIN
+};
+
 const idclass_t tvh_input_instance_class =
 {
   .ic_class      = "tvh_input_instance",
index 469db467dfe36f099b2314956be351beca987f51..960360a16d526e0c9650655e05e75e1fedabdd89 100644 (file)
@@ -85,7 +85,8 @@ struct tvh_input {
 
   LIST_ENTRY(tvh_input) ti_link;
 
-  void (*ti_get_streams) (struct tvh_input *, tvh_input_stream_list_t*);
+  void (*ti_get_streams) (tvh_input_t *, tvh_input_stream_list_t*);
+  void (*ti_clear_stats) (tvh_input_t *);
 };
 
 /*
@@ -136,6 +137,10 @@ htsmsg_t * tvh_input_stream_create_msg ( tvh_input_stream_t *st );
 
 void tvh_input_stream_destroy ( tvh_input_stream_t *st );
 
+static inline tvh_input_t *
+tvh_input_find_by_uuid(const char *uuid)
+  { return (tvh_input_t*)idnode_find(uuid, &tvh_input_class, NULL); }
+
 static inline tvh_input_instance_t *
 tvh_input_instance_find_by_uuid(const char *uuid)
   { return (tvh_input_instance_t*)idnode_find(uuid, &tvh_input_instance_class, NULL); }
index e87817a9b8df4b23c46d05096ee5838bfbeef043..b5ff390f2306bdd4c0cd3d0c5ef9f44fcc707bde 100644 (file)
@@ -701,7 +701,8 @@ struct mpegts_input
   void (*mi_stopping_mux)   (mpegts_input_t*,mpegts_mux_instance_t*);
   void (*mi_stopped_mux)    (mpegts_input_t*,mpegts_mux_instance_t*);
   int  (*mi_has_subscription) (mpegts_input_t*, mpegts_mux_t *mm);
-  void (*mi_tuning_error)   (mpegts_input_t*,mpegts_mux_t *);
+  void (*mi_tuning_error)   (mpegts_input_t*, mpegts_mux_t *);
+  void (*mi_empty_status)   (mpegts_input_t*, tvh_input_stream_t *);
   idnode_set_t *(*mi_network_list) (mpegts_input_t*);
 };
 
@@ -758,6 +759,9 @@ 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, int flags );
 
+void mpegts_input_empty_status ( mpegts_input_t *mi, tvh_input_stream_t *st );
+
+
 /* TODO: exposing these class methods here is a bit of a hack */
 const void *mpegts_input_class_network_get  ( void *o );
 int         mpegts_input_class_network_set  ( void *o, const void *p );
index 7956e666d46fcb045ede024a09bdede20a89099e..16dce4d4c99b6b281233b3da2d05e450c0288f8d 100644 (file)
@@ -1638,6 +1638,7 @@ linuxdvb_frontend_tune1
   return r;
 }
 
+
 /* **************************************************************************
  * Creation/Config
  * *************************************************************************/
@@ -1733,6 +1734,7 @@ linuxdvb_frontend_create
   lfe->mi_network_list    = linuxdvb_frontend_network_list;
   lfe->mi_update_pids     = linuxdvb_frontend_update_pids;
   lfe->mi_enabled_updated = linuxdvb_frontend_enabled_updated;
+  lfe->mi_empty_status    = mpegts_input_empty_status;
 
   /* Adapter link */
   lfe->lfe_adapter = la;
index da1ab477038c802b21d96fd05f8a9a1290c37e0f..9930f201681dd7251f22a680bbdf6e5d07fa599a 100644 (file)
@@ -213,6 +213,7 @@ mpegts_input_class_linked_enum( void * self, const char *lang )
 
 const idclass_t mpegts_input_class =
 {
+  .ic_super      = &tvh_input_class,
   .ic_class      = "mpegts_input",
   .ic_caption    = N_("MPEG-TS Input"),
   .ic_event      = "mpegts_input",
@@ -1498,11 +1499,32 @@ mpegts_input_stream_status
   st->stats.bps   = atomic_exchange(&mmi->tii_stats.bps, 0) * 8;
 }
 
+void
+mpegts_input_empty_status
+  ( mpegts_input_t *mi, tvh_input_stream_t *st )
+{
+  char buf[512];
+  tvh_input_instance_t *mmi_;
+  mpegts_mux_instance_t *mmi;
+
+  st->uuid        = strdup(idnode_uuid_as_sstr(&mi->ti_id));
+  mi->mi_display_name(mi, buf, sizeof(buf));
+  st->input_name  = strdup(buf);
+  LIST_FOREACH(mmi_, &mi->mi_mux_instances, tii_input_link) {
+    mmi = (mpegts_mux_instance_t *)mmi_;
+    st->stats.unc += mmi->tii_stats.unc;
+    st->stats.cc += mmi->tii_stats.cc;
+    st->stats.te += mmi->tii_stats.te;
+    st->stats.ec_block += mmi->tii_stats.ec_block;
+    st->stats.tc_block += mmi->tii_stats.tc_block;
+  }
+}
+
 static void
 mpegts_input_get_streams
   ( tvh_input_t *i, tvh_input_stream_list_t *isl )
 {
-  tvh_input_stream_t *st;
+  tvh_input_stream_t *st = NULL;
   mpegts_input_t *mi = (mpegts_input_t*)i;
   mpegts_mux_instance_t *mmi;
 
@@ -1512,6 +1534,11 @@ mpegts_input_get_streams
     mpegts_input_stream_status(mmi, st);
     LIST_INSERT_HEAD(isl, st, link);
   }
+  if (st == NULL && mi->mi_empty_status) {
+    st = calloc(1, sizeof(tvh_input_stream_t));
+    mi->mi_empty_status(mi, st);
+    LIST_INSERT_HEAD(isl, st, link);
+  }
   pthread_mutex_unlock(&mi->mi_output_lock);
 }
 
index 97e9ea714c002eccc1bee88c228d99aa8829aafb..fb4c03749d1dce6988a6cf406e0d828323f8496e 100644 (file)
@@ -1770,6 +1770,7 @@ satip_frontend_create
   lfe->mi_stop_mux       = satip_frontend_stop_mux;
   lfe->mi_network_list   = satip_frontend_network_list;
   lfe->mi_update_pids    = satip_frontend_update_pids;
+  lfe->mi_empty_status   = mpegts_input_empty_status;
 
   /* Adapter link */
   lfe->sf_device = sd;
index e6e9af976b76d7c38a3f50aa9a089df29f62524a..a845a76459a67fbd379b1a882df499388cefc0a5 100644 (file)
@@ -680,6 +680,7 @@ tvhdhomerun_frontend_create(tvhdhomerun_device_t *hd, struct hdhomerun_discover_
   hfe->mi_stop_mux       = tvhdhomerun_frontend_stop_mux;
   hfe->mi_network_list   = tvhdhomerun_frontend_network_list;
   hfe->mi_update_pids    = tvhdhomerun_frontend_update_pids;
+  hfe->mi_empty_status   = mpegts_input_empty_status;
 
   /* Adapter link */
   hfe->hf_device = hd;