From 315b6e26b3258c97c029ad781819595c9a34d041 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Sun, 12 Mar 2017 21:21:17 +0100 Subject: [PATCH] linuxdvb: share file-descriptor across frontends in exclusive adapter mode, fixes #4278 --- src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index 65bb71117..410593703 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -416,7 +416,7 @@ static void linuxdvb_frontend_enabled_updated ( mpegts_input_t *mi ) { char buf[512]; - linuxdvb_frontend_t *lfe = (linuxdvb_frontend_t*)mi; + linuxdvb_frontend_t *lfe = (linuxdvb_frontend_t*)mi, *lfe2; mi->mi_display_name(mi, buf, sizeof(buf)); @@ -433,7 +433,19 @@ linuxdvb_frontend_enabled_updated ( mpegts_input_t *mi ) /* Ensure FE opened (if not powersave) */ } else if (!lfe->lfe_powersave && lfe->lfe_fe_fd <= 0 && lfe->lfe_fe_path) { - lfe->lfe_fe_fd = tvh_open(lfe->lfe_fe_path, O_RDWR | O_NONBLOCK, 0); + + /* Share FD across frontends */ + if (lfe->lfe_adapter->la_exclusive) { + LIST_FOREACH(lfe2, &lfe->lfe_adapter->la_frontends, lfe_link) { + if (lfe2->lfe_fe_fd > 0) { + lfe->lfe_fe_fd = dup(lfe2->lfe_fe_fd); + break; + } + } + } + + if (lfe->lfe_fe_fd <= 0) + lfe->lfe_fe_fd = tvh_open(lfe->lfe_fe_path, O_RDWR | O_NONBLOCK, 0); tvhtrace(LS_LINUXDVB, "%s - opening FE %s (%d)", buf, lfe->lfe_fe_path, lfe->lfe_fe_fd); } -- 2.47.2