From bdaab51c309bd529aaa1fb694ecdc116a1ec5c95 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 6 Nov 2014 12:40:25 +0100 Subject: [PATCH] bouquet: fix the per-bouquet LCN handling --- src/bouquet.c | 43 ++++++++++++++++++++------------------ src/bouquet.h | 2 +- src/input/mpegts/dvb_psi.c | 4 ++-- src/service.h | 2 +- 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/bouquet.c b/src/bouquet.c index 5308627b..9bd677b5 100644 --- a/src/bouquet.c +++ b/src/bouquet.c @@ -245,7 +245,7 @@ bouquet_map_channel(bouquet_t *bq, service_t *t) * */ void -bouquet_add_service(bouquet_t *bq, service_t *s, uint32_t lcn) +bouquet_add_service(bouquet_t *bq, service_t *s, uint64_t lcn) { service_lcn_t *tl; @@ -254,25 +254,28 @@ bouquet_add_service(bouquet_t *bq, service_t *s, uint32_t lcn) if (!idnode_set_exists(bq->bq_services, &s->s_id)) { tvhtrace("bouquet", "add service %s to %s", s->s_nicename, bq->bq_name ?: ""); idnode_set_add(bq->bq_services, &s->s_id, NULL); - - LIST_FOREACH(tl, &s->s_lcns, sl_link) - if (tl->sl_bouquet == bq) { - tl->sl_lcn = lcn; - break; - } - - if (!tl) { - tl = calloc(1, sizeof(*tl)); - tl->sl_bouquet = bq; - tl->sl_lcn = lcn; - LIST_INSERT_HEAD(&s->s_lcns, tl, sl_link); - } - tl->sl_seen = 1; - bq->bq_saveflag = 1; - if (bq->bq_enabled && bq->bq_maptoch) - bouquet_map_channel(bq, s); } + + LIST_FOREACH(tl, &s->s_lcns, sl_link) + if (tl->sl_bouquet == bq) + break; + + if (!tl) { + tl = calloc(1, sizeof(*tl)); + tl->sl_bouquet = bq; + LIST_INSERT_HEAD(&s->s_lcns, tl, sl_link); + bq->bq_saveflag = 1; + } else { + if (tl->sl_lcn != lcn) + bq->bq_saveflag = 1; + } + tl->sl_lcn = lcn; + tl->sl_seen = 1; + + if (bq->bq_enabled && bq->bq_maptoch) + bouquet_map_channel(bq, s); + if (!bq->bq_in_load && !idnode_set_exists(bq->bq_active_services, &s->s_id)) idnode_set_add(bq->bq_active_services, &s->s_id, NULL); @@ -407,7 +410,7 @@ bouquet_get_channel_number(bouquet_t *bq, service_t *t) LIST_FOREACH(tl, &t->s_lcns, sl_link) if (tl->sl_bouquet == bq) - return (int64_t)tl->sl_lcn * CHANNEL_SPLIT; + return (int64_t)tl->sl_lcn; return 0; } @@ -629,7 +632,7 @@ bouquet_class_services_get ( void *obj ) /* Add all */ for (z = 0; z < bq->bq_services->is_count; z++) { t = (service_t *)bq->bq_services->is_array[z]; - htsmsg_add_u32(m, idnode_uuid_as_str(&t->s_id), + htsmsg_add_s64(m, idnode_uuid_as_str(&t->s_id), bouquet_get_channel_number(bq, t)); } diff --git a/src/bouquet.h b/src/bouquet.h index 1ea5e612..1e2a59bd 100644 --- a/src/bouquet.h +++ b/src/bouquet.h @@ -77,7 +77,7 @@ bouquet_t * bouquet_find_by_source(const char *name, const char *src, int create void bouquet_map_to_channels(bouquet_t *bq); void bouquet_notify_channels(bouquet_t *bq); -void bouquet_add_service(bouquet_t *bq, service_t *s, uint32_t lcn); +void bouquet_add_service(bouquet_t *bq, service_t *s, uint64_t lcn); void bouquet_completed(bouquet_t *bq); uint64_t bouquet_get_channel_number(bouquet_t *bq, service_t *t); diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index f2ad99ff..d8eacf8a 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -524,7 +524,7 @@ dvb_freesat_add_service snprintf(name, sizeof(name), "%s: %s", bi->name, fr->name); fr->bouquet = bouquet_find_by_source(name, src, 1); } - bouquet_add_service(fr->bouquet, (service_t *)s, lcn); + bouquet_add_service(fr->bouquet, (service_t *)s, lcn * CHANNEL_SPLIT); } static void @@ -687,7 +687,7 @@ dvb_bskyb_local_channels if (!fs) { fs = calloc(1, sizeof(*fs)); fs->sid = sid; - fs->regionid = regionid == 0xff ? 0xffff : regionid; + fs->regionid = regionid != 0xff ? regionid : 0xffff; fs->lcn = lcn != 0xffff ? lcn : 0; TAILQ_INSERT_TAIL(&b->fservices, fs, link); } diff --git a/src/service.h b/src/service.h index dd8faab7..fde13e1f 100644 --- a/src/service.h +++ b/src/service.h @@ -186,7 +186,7 @@ void service_instance_list_clear(service_instance_list_t *sil); typedef struct service_lcn { LIST_ENTRY(service_lcn) sl_link; void *sl_bouquet; - uint32_t sl_lcn; + uint64_t sl_lcn; uint8_t sl_seen; } service_lcn_t;