( mpegts_input_t *mi, mpegts_mux_t *mm, int flags, int weight )
{
if (!mpegts_input_is_enabled(mi, mm, flags, weight)) return 0;
- return iptv_input_is_free(mi, mm, 0, weight, NULL) == NULL;
+ return iptv_input_is_free(mi, mm, 0, weight, NULL) == NULL ? 1 : -1;
}
static int
( service_t *t, tvh_input_t *ti, struct service_instance_list *sil,
int flags, int weight )
{
- int p = 0, w;
+ int p, w, r, added = 0, errcnt = 0;
mpegts_service_t *s = (mpegts_service_t*)t;
mpegts_input_t *mi;
mpegts_mux_t *m = s->s_dvb_mux;
if (ti && (tvh_input_t *)mi != ti)
continue;
- if (!mi->mi_is_enabled(mi, mmi->mmi_mux, flags, weight)) continue;
+ r = mi->mi_is_enabled(mi, mmi->mmi_mux, flags, weight);
+ if (!r)
+ continue;
+ if (r < 0) {
+ /* temporary error - retry later */
+ errcnt++;
+ continue;
+ }
/* Set weight to -1 (forced) for already active mux */
if (mmi->mmi_mux->mm_active == mmi) {
}
service_instance_add(sil, t, mi->mi_instance, mi->mi_name, p, w);
+ added++;
}
- return 0;
+ return added ? 0 : (errcnt ? SM_CODE_NO_FREE_ADAPTER : 0);
}
/*
r1 = s->s_enlist(s, ti, sil, flags, weight);
if (r1 == 0)
enlisted++;
- else if (enlisted == 0)
+ else if (r == 0)
r = r1;
}
}
r1 = s->s_enlist(s, ti, sil, flags, weight);
if (r1 == 0)
enlisted++;
- else if (enlisted == 0)
+ else if (r == 0)
r = r1;
}
}
}
+ if (enlisted)
+ r = 0;
} else {
r = s->s_enlist(s, ti, sil, flags, weight);
}
- if (r) {
- if (*error < r)
- *error = r;
- return NULL;
- }
-
/* Clean */
for(si = TAILQ_FIRST(sil); si != NULL; si = next) {
next = TAILQ_NEXT(si, si_link);
service_instance_destroy(sil, si);
}
+ /* Error handling */
+ if (r) {
+ if (*error < r)
+ *error = r;
+ return NULL;
+ }
+
if (TAILQ_EMPTY(sil)) {
if (*error < SM_CODE_NO_ADAPTERS)
*error = SM_CODE_NO_ADAPTERS;