From 8174eb953dd85319aea5e99ec441491bc28890e0 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 21 Jan 2015 12:02:50 +0100 Subject: [PATCH] mux stop: pass the stop reason for OTA epggrab to avoid re-tuning on muxes with no data --- src/epggrab/otamux.c | 9 ++++++--- src/input/mpegts.h | 11 +++++++++-- src/input/mpegts/iptv/iptv.c | 2 +- src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 2 +- src/input/mpegts/mpegts_input.c | 8 ++++---- src/input/mpegts/mpegts_mux.c | 10 +++++----- 6 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/epggrab/otamux.c b/src/epggrab/otamux.c index 80cb3c00..3caacff0 100644 --- a/src/epggrab/otamux.c +++ b/src/epggrab/otamux.c @@ -192,7 +192,7 @@ epggrab_ota_done ( epggrab_ota_mux_t *om, int reason ) om->om_q_type = EPGGRAB_OTA_MUX_IDLE; if (reason == EPGGRAB_OTA_DONE_STOLEN) { /* Do not requeue completed muxes */ - if (!om->om_done && om->om_requeue && mm->mm_scan_result != MM_SCAN_FAIL) { + if (!om->om_done && om->om_requeue) { TAILQ_INSERT_HEAD(&epggrab_ota_pending, om, om_q_link); om->om_q_type = EPGGRAB_OTA_MUX_PENDING; } else { @@ -295,15 +295,18 @@ epggrab_mux_start ( mpegts_mux_t *mm, void *p ) } static void -epggrab_mux_stop ( mpegts_mux_t *mm, void *p ) +epggrab_mux_stop ( mpegts_mux_t *mm, void *p, int reason ) { epggrab_ota_mux_t *ota; const char *uuid = idnode_uuid_as_str(&mm->mm_id); + int done = EPGGRAB_OTA_DONE_STOLEN; + if (reason == SM_CODE_NO_INPUT) + done = EPGGRAB_OTA_DONE_NO_DATA; tvhtrace("epggrab", "mux %p (%s) stop", mm, uuid); TAILQ_FOREACH(ota, &epggrab_ota_active, om_q_link) if (!strcmp(ota->om_mux_uuid, uuid)) { - epggrab_ota_done(ota, EPGGRAB_OTA_DONE_STOLEN); + epggrab_ota_done(ota, done); break; } } diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 0a26eeec..3c8a4916 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -415,7 +415,7 @@ struct mpegts_mux void (*mm_display_name) (mpegts_mux_t*, char *buf, size_t len); int (*mm_is_enabled) (mpegts_mux_t *mm); int (*mm_start) (mpegts_mux_t *mm, mpegts_input_t *mi, const char *r, int w, int flags); - void (*mm_stop) (mpegts_mux_t *mm, int force); + void (*mm_stop) (mpegts_mux_t *mm, int force, int reason); void (*mm_open_table) (mpegts_mux_t*,mpegts_table_t*,int subscribe); void (*mm_close_table) (mpegts_mux_t*,mpegts_table_t*); void (*mm_create_instances) (mpegts_mux_t*); @@ -913,7 +913,7 @@ typedef struct mpegts_listener LIST_ENTRY(mpegts_listener) ml_link; void *ml_opaque; void (*ml_mux_start) (mpegts_mux_t *mm, void *p); - void (*ml_mux_stop) (mpegts_mux_t *mm, void *p); + void (*ml_mux_stop) (mpegts_mux_t *mm, void *p, int reason); void (*ml_mux_create) (mpegts_mux_t *mm, void *p); void (*ml_mux_delete) (mpegts_mux_t *mm, void *p); } mpegts_listener_t; @@ -933,6 +933,13 @@ LIST_HEAD(,mpegts_listener) mpegts_listeners; if (ml->op) ml->op(t, ml->ml_opaque);\ } (void)0 +#define mpegts_fire_event1(t, op, arg1)\ +{\ + mpegts_listener_t *ml;\ + LIST_FOREACH(ml, &mpegts_listeners, ml_link)\ + if (ml->op) ml->op(t, ml->ml_opaque, arg1);\ +} (void)0 + /* * Misc */ diff --git a/src/input/mpegts/iptv/iptv.c b/src/input/mpegts/iptv/iptv.c index ce36fceb..9aac168d 100644 --- a/src/input/mpegts/iptv/iptv.c +++ b/src/input/mpegts/iptv/iptv.c @@ -208,7 +208,7 @@ iptv_input_warm_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi ) /* Stop */ if (s) - s->mmi_mux->mm_stop(s->mmi_mux, 1); + s->mmi_mux->mm_stop(s->mmi_mux, 1, SM_CODE_ABORTED); } return 0; } diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index bc2c5347..286534ca 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -510,7 +510,7 @@ linuxdvb_frontend_monitor ( void *aux ) /* Disabled */ if (!lfe->mi_enabled && mmi) - mmi->mmi_mux->mm_stop(mmi->mmi_mux, 1); + mmi->mmi_mux->mm_stop(mmi->mmi_mux, 1, SM_CODE_ABORTED); /* Close FE */ if (lfe->lfe_fe_fd > 0 && !mmi && lfe->lfe_powersave) { diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index d077ac3a..1ebd901c 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -133,7 +133,7 @@ mpegts_input_enabled_notify ( void *p ) /* Stop */ LIST_FOREACH(mmi, &mi->mi_mux_active, mmi_active_link) - mmi->mmi_mux->mm_stop(mmi->mmi_mux, 1); + mmi->mmi_mux->mm_stop(mmi->mmi_mux, 1, SM_CODE_ABORTED); /* Alert */ if (mi->mi_enabled_updated) @@ -382,7 +382,7 @@ mpegts_input_warm_mux ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi ) return 0; /* Stop current */ - cur->mmi_mux->mm_stop(cur->mmi_mux, 1); + cur->mmi_mux->mm_stop(cur->mmi_mux, 1, SM_CODE_SUBSCRIPTION_OVERRIDDEN); } if (LIST_FIRST(&mi->mi_mux_active)) return SM_CODE_TUNING_FAILED; @@ -540,7 +540,7 @@ mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s ) pthread_mutex_unlock(&mi->mi_output_lock); /* Stop mux? */ - s->s_dvb_mux->mm_stop(s->s_dvb_mux, 0); + s->s_dvb_mux->mm_stop(s->s_dvb_mux, 0, SM_CODE_OK); } static void @@ -1393,7 +1393,7 @@ mpegts_input_stop_all ( mpegts_input_t *mi ) { mpegts_mux_instance_t *mmi; while ((mmi = LIST_FIRST(&mi->mi_mux_active))) - mmi->mmi_mux->mm_stop(mmi->mmi_mux, 1); + mmi->mmi_mux->mm_stop(mmi->mmi_mux, 1, SM_CODE_OK); } void diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 1f744e94..771eabde 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -427,7 +427,7 @@ mpegts_mux_class_enabled_notify ( void *p ) { mpegts_mux_t *mm = p; if (!mm->mm_is_enabled(mm)) { - mm->mm_stop(mm, 1); + mm->mm_stop(mm, 1, SM_CODE_MUX_NOT_ENABLED); mpegts_network_scan_mux_cancel(mm, 0); } } @@ -583,7 +583,7 @@ mpegts_mux_delete ( mpegts_mux_t *mm, int delconf ) tvhinfo("mpegts", "%s (%p) - deleting", buf, mm); /* Stop */ - mm->mm_stop(mm, 1); + mm->mm_stop(mm, 1, SM_CODE_ABORTED); /* Remove from network */ LIST_REMOVE(mm, mm_network_link); @@ -815,7 +815,7 @@ mpegts_mux_has_subscribers ( mpegts_mux_t *mm, const char *name ) } static void -mpegts_mux_stop ( mpegts_mux_t *mm, int force ) +mpegts_mux_stop ( mpegts_mux_t *mm, int force, int reason ) { char buf[256], *s; mpegts_mux_instance_t *mmi = mm->mm_active, *mmi2; @@ -895,7 +895,7 @@ mpegts_mux_stop ( mpegts_mux_t *mm, int force ) mpegts_network_scan_mux_cancel(mm, 1); /* Events */ - mpegts_fire_event(mm, ml_mux_stop); + mpegts_fire_event1(mm, ml_mux_stop, reason); } @@ -1275,7 +1275,7 @@ mpegts_mux_remove_subscriber tvhtrace("mpegts", "%s - remove subscriber", buf); #endif subscription_unlink_mux(s, reason); - mm->mm_stop(mm, 0); + mm->mm_stop(mm, 0, reason); } int