mpegts: Added some new post start/stop routines to allow flexibility

This is required for DVB-S where the input object is actually acting as a
proxy for the frontend.
This commit is contained in:
Adam Sutton 2013-06-15 14:07:21 +01:00
parent 46f24f67c7
commit 696fcf9751
3 changed files with 36 additions and 18 deletions

View file

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

View file

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

View file

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