From f20bab4aeda29f86536c0deaa1b4e7d8e7846e23 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Fri, 5 Dec 2014 13:20:40 +0100 Subject: [PATCH] service: Add possibility to disable automatic service checking per service --- src/input/mpegts/dvb_psi.c | 5 +++-- src/service.c | 26 ++++++++++++++++++++++++-- src/service.h | 10 +++++++++- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 0b4e8a0d..e6ff7e4d 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -1035,9 +1035,10 @@ dvb_pat_callback last_seen = s->s_dvb_check_seen; for (s = LIST_FIRST(&mm->mm_services); s; s = snext) { snext = LIST_NEXT(s, s_dvb_mux_link); - if (s->s_enabled && s->s_dvb_check_seen + 24 * 3600 < last_seen) { + if (s->s_enabled && s->s_auto != SERVICE_AUTO_OFF && + s->s_dvb_check_seen + 24 * 3600 < last_seen) { tvhinfo("mpegts", "disabling service %s (missing in PAT)", s->s_nicename ?: ""); - service_set_enabled((service_t *)s, 0); + service_set_enabled((service_t *)s, 0, SERVICE_AUTO_PAT_MISSING); } } mt->mt_opaque = mm; diff --git a/src/service.c b/src/service.c index 5ccde9fb..5897d23b 100644 --- a/src/service.c +++ b/src/service.c @@ -57,7 +57,10 @@ struct service_queue service_all; static void service_class_notify_enabled ( void *obj ) { - bouquet_notify_service_enabled((service_t *)obj); + service_t *t = (service_t *)obj; + if (t->s_enabled && t->s_auto != SERVICE_AUTO_OFF) + t->s_auto = SERVICE_AUTO_NORMAL; + bouquet_notify_service_enabled(t); } static const void * @@ -174,6 +177,17 @@ service_class_caid_get ( void *obj ) return &s; } +static htsmsg_t * +service_class_auto_list ( void *o ) +{ + static const struct strtab tab[] = { + { "", 0 }, + { "No Auto (Disabled)", 1 }, + { "Missing In PAT", 2 } + }; + return strtab2htsmsg(tab); +} + const idclass_t service_class = { .ic_class = "service", .ic_caption = "Service", @@ -190,6 +204,13 @@ const idclass_t service_class = { .off = offsetof(service_t, s_enabled), .notify = service_class_notify_enabled, }, + { + .type = PT_INT, + .id = "auto", + .name = "Automatic Checking", + .list = service_class_auto_list, + .off = offsetof(service_t, s_auto), + }, { .type = PT_STR, .islist = 1, @@ -821,10 +842,11 @@ service_destroy(service_t *t, int delconf) } void -service_set_enabled(service_t *t, int enabled) +service_set_enabled(service_t *t, int enabled, int _auto) { if (t->s_enabled != !!enabled) { t->s_enabled = !!enabled; + t->s_auto = _auto; service_class_notify_enabled(t); service_request_save(t, 0); idnode_notify_simple(&t->s_id); diff --git a/src/service.h b/src/service.h index 36f8fe60..d4f4664c 100644 --- a/src/service.h +++ b/src/service.h @@ -191,6 +191,13 @@ typedef struct service_lcn { } service_lcn_t; +/** + * + */ +#define SERVICE_AUTO_NORMAL 0 +#define SERVICE_AUTO_OFF 1 +#define SERVICE_AUTO_PAT_MISSING 2 + /** * */ @@ -280,6 +287,7 @@ typedef struct service { * subscription scheduling. */ int s_enabled; + int s_auto; LIST_ENTRY(service) s_active_link; @@ -521,7 +529,7 @@ int service_is_other(service_t *t); int service_is_encrypted ( service_t *t ); -void service_set_enabled ( service_t *t, int enabled ); +void service_set_enabled ( service_t *t, int enabled, int _auto ); void service_destroy(service_t *t, int delconf);