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:
parent
d4ee2016fe
commit
406b15afa6
3 changed files with 59 additions and 33 deletions
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue