diff --git a/src/input/mpegts.h b/src/input/mpegts.h index c991517a..89fd4dbc 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -395,6 +395,8 @@ struct mpegts_input void (*mi_create_mux_instance) (mpegts_input_t*,mpegts_mux_t*); const idclass_t *(*mi_network_class) (mpegts_input_t *mi); mpegts_network_t *(*mi_network_create) (mpegts_input_t *mi, htsmsg_t *c); + void (*mi_started_mux) (mpegts_input_t*,mpegts_mux_instance_t*); + void (*mi_stopped_mux) (mpegts_input_t*,mpegts_mux_instance_t*); }; #endif /* __TVH_MPEGTS_H__ */ diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 71fa4ca8..796f9765 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -164,6 +164,35 @@ mpegts_input_create_mux_instance (void)mpegts_mux_instance_create(mpegts_mux_instance, NULL, mi, mm); } +static void +mpegts_input_started_mux + ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi ) +{ + mmi->mmi_mux->mm_active = mmi; + LIST_INSERT_HEAD(&mi->mi_mux_active, mmi, mmi_active_link); +} + +static void +mpegts_input_stopped_mux + ( mpegts_input_t *mi, mpegts_mux_instance_t *mmi ) +{ + char buf[256]; + service_t *s, *t; + mmi->mmi_mux->mm_active = NULL; + LIST_REMOVE(mmi, mmi_mux_link); + + mi->mi_display_name(mi, buf, sizeof(buf)); + tvhtrace("mpegts", "%s - flush subscribers", buf); + s = LIST_FIRST(&mi->mi_transports); + while (s) { + t = s; + s = LIST_NEXT(t, s_active_link); + if (((mpegts_service_t*)s)->s_dvb_mux != mmi->mmi_mux) + continue; + service_remove_subscriber(s, NULL, SM_CODE_SUBSCRIPTION_OVERRIDDEN); + } +} + /* ************************************************************************** * Data processing * *************************************************************************/ @@ -177,7 +206,7 @@ mpegts_input_recv_packets int len = l; int i = 0, table_wakeup = 0; mpegts_mux_t *mm = mmi->mmi_mux; - assert(mmi->mmi_input == mi); + //assert(mmi->mmi_input == mi); assert(mm != NULL); assert(name != NULL); @@ -335,6 +364,8 @@ mpegts_input_create0 mi->mi_network_class = mpegts_input_network_class; mi->mi_network_create = mpegts_input_network_create; mi->mi_create_mux_instance = mpegts_input_create_mux_instance; + mi->mi_started_mux = mpegts_input_started_mux; + mi->mi_stopped_mux = mpegts_input_stopped_mux; /* Index */ mi->mi_instance = ++mpegts_input_idx; diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 629d3c1a..33562a4e 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -78,9 +78,7 @@ mpegts_mux_instance_start ( mpegts_mux_instance_t **mmiptr ) /* Start */ tvhdebug("mpegts", "%s - started", buf); - LIST_INSERT_HEAD(&mmi->mmi_input->mi_mux_active, mmi, - mmi_active_link); - mm->mm_active = mmi; + mmi->mmi_input->mi_started_mux(mmi->mmi_input, mmi); /* Initial scanning */ if (mm->mm_initial_scan_status == MM_SCAN_PENDING) { @@ -263,7 +261,6 @@ static void mpegts_mux_stop ( mpegts_mux_t *mm ) { char buf[256]; - service_t *s, *t; mpegts_mux_instance_t *mmi = mm->mm_active; mpegts_input_t *mi; @@ -273,19 +270,7 @@ mpegts_mux_stop ( mpegts_mux_t *mm ) if (mmi) { mi = mmi->mmi_input; mi->mi_stop_mux(mi, mmi); - mm->mm_active = NULL; - LIST_REMOVE(mmi, mmi_active_link); - - /* Flush all subscribers */ - tvhtrace("mpegts", "%s - flush subscribers", buf); - s = LIST_FIRST(&mi->mi_transports); - while (s) { - t = s; - s = LIST_NEXT(t, s_active_link); - if (((mpegts_service_t*)s)->s_dvb_mux != mm) - continue; - service_remove_subscriber(s, NULL, SM_CODE_SUBSCRIPTION_OVERRIDDEN); - } + mi->mi_stopped_mux(mi, mmi); } /* Flush all tables */