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
* ***************************************************************************/
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));
/* 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 */
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;
}
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);
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;