Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
mpegts input: show idle tuners with cummulative errors, fixes #3090
  • Loading branch information
perexg committed Oct 12, 2015
1 parent 5e3b560 commit 1b682a4
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 3 deletions.
4 changes: 4 additions & 0 deletions src/api/api_status.c
Expand Up @@ -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);
}

Expand Down
7 changes: 7 additions & 0 deletions src/input.c
Expand Up @@ -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",
Expand Down
7 changes: 6 additions & 1 deletion src/input.h
Expand Up @@ -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 *);
};

/*
Expand Down Expand Up @@ -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); }
Expand Down
6 changes: 5 additions & 1 deletion src/input/mpegts.h
Expand Up @@ -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*);
};

Expand Down Expand Up @@ -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 );
Expand Down
2 changes: 2 additions & 0 deletions src/input/mpegts/linuxdvb/linuxdvb_frontend.c
Expand Up @@ -1638,6 +1638,7 @@ linuxdvb_frontend_tune1
return r;
}


/* **************************************************************************
* Creation/Config
* *************************************************************************/
Expand Down Expand Up @@ -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;
Expand Down
29 changes: 28 additions & 1 deletion src/input/mpegts/mpegts_input.c
Expand Up @@ -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",
Expand Down Expand Up @@ -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;

Expand All @@ -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);
}

Expand Down
1 change: 1 addition & 0 deletions src/input/mpegts/satip/satip_frontend.c
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c
Expand Up @@ -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;
Expand Down

0 comments on commit 1b682a4

Please sign in to comment.