From: Jaroslav Kysela Date: Mon, 12 Oct 2015 19:46:06 +0000 (+0200) Subject: mpegts input: show idle tuners with cummulative errors, fixes #3090 X-Git-Tag: v4.2.1~1932 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1b682a46a11ea821c4ed183a274bc78993ef40a0;p=thirdparty%2Ftvheadend.git mpegts input: show idle tuners with cummulative errors, fixes #3090 --- diff --git a/src/api/api_status.c b/src/api/api_status.c index 0f7cfef5d..9adce24ad 100644 --- a/src/api/api_status.c +++ b/src/api/api_status.c @@ -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); } diff --git a/src/input.c b/src/input.c index 679e75e6e..7b6be29b2 100644 --- a/src/input.c +++ b/src/input.c @@ -23,6 +23,13 @@ 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", diff --git a/src/input.h b/src/input.h index 469db467d..960360a16 100644 --- a/src/input.h +++ b/src/input.h @@ -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); } diff --git a/src/input/mpegts.h b/src/input/mpegts.h index e87817a9b..b5ff390f2 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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 ); diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index 7956e666d..16dce4d4c 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -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; diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index da1ab4770..9930f2016 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -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); } diff --git a/src/input/mpegts/satip/satip_frontend.c b/src/input/mpegts/satip/satip_frontend.c index 97e9ea714..fb4c03749 100644 --- a/src/input/mpegts/satip/satip_frontend.c +++ b/src/input/mpegts/satip/satip_frontend.c @@ -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; diff --git a/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c b/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c index e6e9af976..a845a7645 100644 --- a/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c +++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c @@ -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;