mux stop: pass the stop reason for OTA epggrab to avoid re-tuning on muxes with no data

This commit is contained in:
Jaroslav Kysela 2015-01-21 12:02:50 +01:00
parent abea248bab
commit 8174eb953d
6 changed files with 26 additions and 16 deletions

View file

@ -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;
}
}

View file

@ -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
*/

View file

@ -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;
}

View file

@ -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) {

View file

@ -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

View file

@ -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