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 {
}
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;
}
}
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*);
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;
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
*/
/* 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;
}
/* 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) {
/* 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)
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;
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
{
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
{
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);
}
}
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);
}
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;
mpegts_network_scan_mux_cancel(mm, 1);
/* Events */
- mpegts_fire_event(mm, ml_mux_stop);
+ mpegts_fire_event1(mm, ml_mux_stop, reason);
}
tvhtrace("mpegts", "%s - remove subscriber", buf);
#endif
subscription_unlink_mux(s, reason);
- mm->mm_stop(mm, 0);
+ mm->mm_stop(mm, 0, reason);
}
int