mpegts: sort out tuning of muxes from multiple points

There is now a common routine for starting a mux instance, it is assumed
that certain checks have already been performed before calling this
routine. However it does perform a double check that this mux is not
already tuned on another instance. If it is it updates the passed ptr
with that instance.
This commit is contained in:
Adam Sutton 2013-06-08 12:24:35 +01:00
parent d4ee2016fe
commit 406b15afa6
3 changed files with 59 additions and 33 deletions

View file

@ -458,6 +458,7 @@ mpegts_mux_instance_t *mpegts_mux_instance_create0
(struct type*)mpegts_mux_instance_create0(calloc(1, sizeof(struct type)),\
&type##_class, uuid,\
mi, mm);
int mpegts_mux_instance_start ( mpegts_mux_instance_t **mmiptr );
int mpegts_mux_set_tsid ( mpegts_mux_t *mm, uint16_t tsid );
int mpegts_mux_set_onid ( mpegts_mux_t *mm, uint16_t onid );

View file

@ -55,6 +55,50 @@ mpegts_mux_instance_create0
return mmi;
}
int
mpegts_mux_instance_start ( mpegts_mux_instance_t **mmiptr )
{
int r;
char buf[256], buf2[256];;
mpegts_mux_instance_t *mmi = *mmiptr;
mpegts_mux_t *mm = mmi->mmi_mux;
mpegts_network_t *mn = mm->mm_network;
mm->mm_display_name(mm, buf, sizeof(buf));
/* Already active */
if (mm->mm_active) {
*mmiptr = mm->mm_active;
tvhdebug("mpegts", "%s - already active", buf);
return 0;
}
/* Start */
mmi->mmi_input->mi_display_name(mmi->mmi_input, buf2, sizeof(buf2));
tvhinfo("mpegts", "%s - tuning on %s", buf, buf2);
r = mmi->mmi_input->mi_start_mux(mmi->mmi_input, mmi);
if (!r) return r;
/* Start */
tvhdebug("mpegts", "%s - started", buf);
LIST_INSERT_HEAD(&mmi->mmi_input->mi_mux_active, mmi,
mmi_active_link);
mm->mm_active = mmi;
/* Initial scanning */
if (mm->mm_initial_scan_status == MM_SCAN_PENDING) {
tvhtrace("mpegts", "%s - adding to current scan Q", buf);
TAILQ_REMOVE(&mn->mn_initial_scan_pending_queue, mm,
mm_initial_scan_link);
mm->mm_initial_scan_status = MM_SCAN_CURRENT;
TAILQ_INSERT_TAIL(&mn->mn_initial_scan_current_queue, mm,
mm_initial_scan_link);
gtimer_arm(&mm->mm_initial_scan_timeout,
mpegts_mux_initial_scan_timeout, mm, 30);
}
return 0;
}
/* ****************************************************************************
* Class definition
* ***************************************************************************/
@ -117,8 +161,7 @@ static int
mpegts_mux_start ( mpegts_mux_t *mm, const char *reason, int weight )
{
int pass, fail;
char buf[256], buf2[256];
mpegts_network_t *mn = mm->mm_network;
char buf[256];
mpegts_mux_instance_t *mmi, *tune;
mm->mm_display_name(mm, buf, sizeof(buf));
@ -175,18 +218,9 @@ mpegts_mux_start ( mpegts_mux_t *mm, const char *reason, int weight )
/* Tune */
if (tune) {
tune->mmi_input->mi_display_name(tune->mmi_input, buf2, sizeof(buf2));
tvhinfo("mpegts", "%s - tuning on %s", buf, buf2);
if (!tune->mmi_input->mi_start_mux(tune->mmi_input, mmi)) {
tvhdebug("mpegts", "%s - started", buf);
LIST_INSERT_HEAD(&tune->mmi_input->mi_mux_active, tune,
mmi_active_link);
mm->mm_active = tune;
break;
}
tvhwarn("mpegts", "%s - failed to start, try another", buf);
if (!(fail = mpegts_mux_instance_start(&tune))) break;
tune = NULL;
fail = 1;
tvhwarn("mpegts", "%s - failed to start, try another", buf);
}
/* Next */
@ -199,15 +233,6 @@ mpegts_mux_start ( mpegts_mux_t *mm, const char *reason, int weight )
return SM_CODE_NO_FREE_ADAPTER;
}
/* Initial scanning */
if (mm->mm_initial_scan_status == MM_SCAN_PENDING) {
tvhtrace("mpegts", "%s - adding to current scan Q", buf);
TAILQ_REMOVE(&mn->mn_initial_scan_pending_queue, mm, mm_initial_scan_link);
mm->mm_initial_scan_status = MM_SCAN_CURRENT;
TAILQ_INSERT_TAIL(&mn->mn_initial_scan_current_queue, mm, mm_initial_scan_link);
gtimer_arm(&mm->mm_initial_scan_timeout, mpegts_mux_initial_scan_timeout, mm, 30);
}
return 0;
}

View file

@ -105,7 +105,7 @@ mpegts_service_start(service_t *t, int instance)
int r;
mpegts_service_t *s = (mpegts_service_t*)t;
mpegts_mux_t *m = s->s_dvb_mux;
mpegts_mux_instance_t *mi;
mpegts_mux_instance_t *mmi;
/* Validate */
assert(s->s_status == SERVICE_IDLE);
@ -113,27 +113,27 @@ mpegts_service_start(service_t *t, int instance)
lock_assert(&global_lock);
/* Find */
LIST_FOREACH(mi, &m->mm_instances, mmi_mux_link)
if (mi->mmi_input->mi_instance == instance)
LIST_FOREACH(mmi, &m->mm_instances, mmi_mux_link)
if (mmi->mmi_input->mi_instance == instance)
break;
assert(mi != NULL);
if (mi == NULL)
assert(mmi != NULL);
if (mmi == NULL)
return SM_CODE_UNDEFINED_ERROR;
/* Start Mux */
r = mi->mmi_input->mi_start_mux(mi->mmi_input, mi);
r = mpegts_mux_instance_start(&mmi);
/* Start */
if (!r) {
/* Add to active set */
pthread_mutex_lock(&mi->mmi_input->mi_delivery_mutex);
LIST_INSERT_HEAD(&mi->mmi_input->mi_transports, t, s_active_link);
s->s_dvb_active_input = mi->mmi_input;
pthread_mutex_unlock(&mi->mmi_input->mi_delivery_mutex);
pthread_mutex_lock(&mmi->mmi_input->mi_delivery_mutex);
LIST_INSERT_HEAD(&mmi->mmi_input->mi_transports, t, s_active_link);
s->s_dvb_active_input = mmi->mmi_input;
pthread_mutex_unlock(&mmi->mmi_input->mi_delivery_mutex);
/* Open service */
mi->mmi_input->mi_open_service(mi->mmi_input, s);
mmi->mmi_input->mi_open_service(mmi->mmi_input, s);
}
return r;