From: Jaroslav Kysela Date: Sat, 30 May 2015 20:06:06 +0000 (+0200) Subject: linuxdvb: add proper support for multiple frontends in one adapter directory X-Git-Tag: v4.2.1~2414 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f27ac40cb170ef561cbc989d252fe4c43949e261;p=thirdparty%2Ftvheadend.git linuxdvb: add proper support for multiple frontends in one adapter directory --- diff --git a/src/input/mpegts/linuxdvb/linuxdvb_adapter.c b/src/input/mpegts/linuxdvb/linuxdvb_adapter.c index 4c5935023..6f80e55a1 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_adapter.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_adapter.c @@ -453,11 +453,22 @@ linuxdvb_adapter_add ( const char *path ) memset(fetypes, 0, sizeof(fetypes)); LIST_FOREACH(lfe, &la->la_frontends, lfe_link) fetypes[lfe->lfe_type]++; - for (i = 0; i < ARRAY_SIZE(fetypes); i++) + for (i = j = r = 0; i < ARRAY_SIZE(fetypes); i++) { if (fetypes[i] > 1) - tvhwarn("linuxdvb", "adapter %d has multiple tuners %d for type %s, " - "only one can be used at a time", - a, fetypes[i], dvb_type2str(i)); + r++; + else if (fetypes[i] > 0) + j++; + } + if (r && j) { + la->la_exclusive = 1; + for (i = 0; i < ARRAY_SIZE(fetypes); i++) + if (fetypes[i] > 0) + tvhwarn("linuxdvb", "adapter %d has tuner count %d for type %s (wrong config)", + a, fetypes[i], dvb_type2str(i)); + } else if (!r && j > 1) { + la->la_exclusive = 1; + tvhinfo("linuxdvb", "adapter %d setting exlusive flag", a); + } #endif /* Save configuration */ diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index 60f7f196f..8d2dd4dca 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -271,8 +271,12 @@ linuxdvb_frontend_get_weight ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags ) int weight = 0; linuxdvb_adapter_t *la = ((linuxdvb_frontend_t*)mi)->lfe_adapter; linuxdvb_frontend_t *lfe; - LIST_FOREACH(lfe, &la->la_frontends, lfe_link) - weight = MAX(weight, mpegts_input_get_weight((mpegts_input_t*)lfe, mm, flags)); + if (la->la_exclusive) { + LIST_FOREACH(lfe, &la->la_frontends, lfe_link) + weight = MAX(weight, mpegts_input_get_weight((mpegts_input_t*)lfe, mm, flags)); + } else { + weight = mpegts_input_get_weight(mi, mm, flags); + } return weight; } diff --git a/src/input/mpegts/linuxdvb/linuxdvb_private.h b/src/input/mpegts/linuxdvb/linuxdvb_private.h index 6ba2cf694..291447e20 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_private.h +++ b/src/input/mpegts/linuxdvb/linuxdvb_private.h @@ -78,6 +78,7 @@ struct linuxdvb_adapter char *la_name; char *la_rootpath; int la_dvb_number; + int la_exclusive; /* one frontend at a time */ /* * Frontends