diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index 4d6d4e05..e5a5d1e4 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -294,6 +294,7 @@ linuxdvb_frontend_stop_mux /* Not locked */ lfe->lfe_locked = 0; + lfe->lfe_status = 0; /* Ensure it won't happen immediately */ gtimer_arm(&lfe->lfe_monitor_timer, linuxdvb_frontend_monitor, lfe, 2); @@ -474,7 +475,19 @@ linuxdvb_frontend_monitor ( void *aux ) status = SIGNAL_NONE; /* Set default period */ - tvhtrace("linuxdvb", "%s - status %d", buf, status); + if (fe_status != lfe->lfe_status) { + tvhdebug("linuxdvb", "%s - status %7s (%s%s%s%s%s%s)", buf, + signal2str(status), + (fe_status & FE_HAS_SIGNAL) ? "SIGNAL" : "", + (fe_status & FE_HAS_CARRIER) ? " | CARRIER" : "", + (fe_status & FE_HAS_VITERBI) ? " | VITERBI" : "", + (fe_status & FE_HAS_SYNC) ? " | SYNC" : "", + (fe_status & FE_HAS_LOCK) ? " | SIGNAL" : "", + (fe_status & FE_TIMEDOUT) ? "TIMEOUT" : ""); + } else { + tvhtrace("linuxdvb", "%s - status %d (%04X)", buf, status, fe_status); + } + lfe->lfe_status = fe_status; /* Get current mux */ mm = mmi->mmi_mux; @@ -718,6 +731,8 @@ linuxdvb_frontend_tune0 return SM_CODE_TUNING_FAILED; } } + lfe->lfe_locked = 0; + lfe->lfe_status = 0; /* S2 tuning */ #if DVB_API_VERSION >= 5 diff --git a/src/input/mpegts/linuxdvb/linuxdvb_private.h b/src/input/mpegts/linuxdvb/linuxdvb_private.h index c43e7b56..06a44fff 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_private.h +++ b/src/input/mpegts/linuxdvb/linuxdvb_private.h @@ -134,6 +134,7 @@ struct linuxdvb_frontend * Tuning */ int lfe_locked; + fe_status_t lfe_status; time_t lfe_monitor; gtimer_t lfe_monitor_timer; diff --git a/src/tvheadend.h b/src/tvheadend.h index e369df09..a2f1550b 100644 --- a/src/tvheadend.h +++ b/src/tvheadend.h @@ -389,6 +389,20 @@ typedef enum SIGNAL_NONE } signal_state_t; +static struct strtab signal_statetab[] = { + { "GOOD", SIGNAL_GOOD }, + { "BAD", SIGNAL_BAD }, + { "FAINT", SIGNAL_BAD }, + { "NONE", SIGNAL_BAD }, +}; + +static inline const char * signal2str ( signal_state_t st ) +{ + const char *r = val2str(st, signal_statetab); + if (!r) r = "UNKNOWN"; + return r; +} + /** * Streaming messages are sent from the pad to its receivers */