{
}
-static int
-mpegts_mux_start1( mpegts_mux_instance_t *mmi )
-{
- char buf[256], buf2[256];
-
- if (mpegts_mux_instance_start(&mmi)) {
- mpegts_mux_nice_name(mmi->mmi_mux, buf, sizeof(buf));
- mmi->mmi_input->mi_display_name(mmi->mmi_input, buf2, sizeof(buf2));
- tvhwarn("mpegts", "%s - failed to start on %s, try another", buf, buf2);
- return 1;
- }
- return 0;
-}
-
-static int
-mpegts_mux_start
- ( mpegts_mux_t *mm, mpegts_input_t *_mi, const char *reason, int weight, int flags )
-{
- int havefree = 0, enabled = 0, index, index2, weight2, count, size = 0;
- char buf[256];
- mpegts_input_t *mi;
- mpegts_mux_t *mm2;
- mpegts_mux_instance_t *mmi, **all;
- int64_t aweight, *allw;
- int e, j;
-
- mpegts_mux_nice_name(mm, buf, sizeof(buf));
- tvhtrace("mpegts", "%s - starting for '%s' (weight %d, flags %04X)",
- buf, reason, weight, flags);
-
- /* Disabled */
- if (!mm->mm_is_enabled(mm)) {
- tvhwarn("mpegts", "%s - not enabled", buf);
- return SM_CODE_MUX_NOT_ENABLED;
- }
-
- /* Already tuned */
- if (mm->mm_active) {
- tvhtrace("mpegts", "%s - already active", buf);
- mpegts_mux_scan_active(mm, buf, mm->mm_active->mmi_input);
- return 0;
- }
-
- /* Create mux instances (where needed) */
- mm->mm_create_instances(mm);
- if (!LIST_FIRST(&mm->mm_instances)) {
- tvhtrace("mpegts", "%s - has no instances, tuners enabled?", buf);
- return SM_CODE_NO_VALID_ADAPTER;
- }
-
- /* Get the count of instances */
- LIST_FOREACH(mmi, &mm->mm_instances, mmi_mux_link)
- size++;
- all = alloca(sizeof(mpegts_mux_instance_t *) * size);
- allw = alloca(sizeof(int64_t) * size);
-
- /* Calculate priority+weight and sort */
- count = 0;
- LIST_FOREACH(mmi, &mm->mm_instances, mmi_mux_link) {
- mi = mmi->mmi_input;
- mm2 = mmi->mmi_mux;
- if (_mi && mi != _mi) continue;
- e = mi->mi_is_enabled(mi, mm, flags);
- tvhtrace("mpegts", "%s - mmi %p enabled %d", buf, mmi, e);
- if (!e) continue;
- enabled = 1;
-
- /* Already live? Try it... */
- if (e && mm2->mm_active == mmi) {
- if (!mpegts_mux_start1(mmi))
- return 0;
- continue;
- }
-
- if (mmi->mmi_tune_failed) continue;
-
- tvhtrace("mpegts", "%s - found mmi %p", buf, mmi);
-
- aweight = ((int64_t )mi->mi_get_priority(mi, mm2, flags) << 32) |
- mi->mi_get_weight(mi, flags);
-
- for (index = 0; index < count; index++)
- if (allw[index] >= aweight)
- break;
-
- for (j = count; j > index; j--) {
- allw[j] = allw[j - 1];
- all [j] = all [j - 1];
- }
-
- all [index] = mmi;
- allw[index] = aweight;
- count++;
- }
-
-#if ENABLE_TRACE
- for (index = 0; index < count; index++) {
- if (all[index]) {
- mi = all[index]->mmi_input;
- char buf2[256];
- mi->mi_display_name(mi, buf2, sizeof(buf2));
- tvhtrace("mpegts", "%s - %i [%s]: prio %li weight %li", buf, index, buf2,
- (long)(allw[index] >> 32), (long)(allw[index] & 0xffffffff));
- }
- }
-#endif
-
- /* Try free inputs */
- for (index = count - 1; index >= 0; index--) {
- mmi = all[index];
- mi = mmi->mmi_input;
- if (mi->mi_is_free(mi)) {
- all[index] = NULL;
- havefree = 1;
- tvhtrace("mpegts", "%s - found mmi %p to boot (free)", buf, mmi);
- if (!mpegts_mux_start1(mmi))
- return 0;
- }
- }
-
- /* Try the lowest weight */
- for (index = 0, index2 = -1, weight2 = weight; index < count; index++) {
- if (all[index] && weight2 > (allw[index] & 0xffffffff)) {
- weight2 = allw[index] & 0xffffffff;
- index2 = index;
- }
- }
-
- if (index2 >= 0) {
- mmi = all[index2];
- all[index2] = NULL;
- tvhtrace("mpegts", "%s - found mmi %p to boot (lowest)", buf, mmi);
- if (!mpegts_mux_start1(mmi))
- return 0;
- }
-
- /* Try the all lowest weights */
- for (index = 0; index < count; index++) {
- if (all[index] && weight > (allw[index] & 0xffffffff)) {
- mmi = all[index];
- all[index] = NULL;
- tvhtrace("mpegts", "%s - found mmi %p to boot", buf, mmi);
- if (!mpegts_mux_start1(mmi))
- return 0;
- }
- }
-
- LIST_FOREACH(mmi, &mm->mm_instances, mmi_mux_link) {
- if (!mmi->mmi_tune_failed) {
- if (!enabled) {
- tvhdebug("mpegts", "%s - no tuners enabled", buf);
- return SM_CODE_NO_VALID_ADAPTER;
- } else if (havefree) {
- tvhdebug("mpegts", "%s - no valid tuner available", buf);
- return SM_CODE_NO_VALID_ADAPTER;
- } else {
- tvhdebug("mpegts", "%s - no free tuner available", buf);
- return SM_CODE_NO_FREE_ADAPTER;
- }
- }
- }
- tvhdebug("mpegts", "%s - tuning failed, invalid config?", buf);
- return SM_CODE_TUNING_FAILED;
-}
-
static int
mpegts_mux_has_subscribers ( mpegts_mux_t *mm, const char *name )
{
mm->mm_is_epg = mpegts_mux_is_epg;
/* Start/stop */
- mm->mm_start = mpegts_mux_start;
mm->mm_stop = mpegts_mux_stop;
mm->mm_create_instances = mpegts_mux_create_instances;