diff --git a/src/input/mpegts.h b/src/input/mpegts.h index a30501cf..40d74f47 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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 ); diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 829e0b92..e8f9d5c9 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -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; } diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index c7f63de6..abad1230 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -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;