]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
bouquet: fix the per-bouquet LCN handling
authorJaroslav Kysela <perex@perex.cz>
Thu, 6 Nov 2014 11:40:25 +0000 (12:40 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sat, 8 Nov 2014 20:05:39 +0000 (21:05 +0100)
src/bouquet.c
src/bouquet.h
src/input/mpegts/dvb_psi.c
src/service.h

index 5308627b8f427312c9be88905d1614add3f5568f..9bd677b52778d38d8a2e2a0bf9f7c6469edc3aa0 100644 (file)
@@ -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 ?: "<unknown>");
     idnode_set_add(bq->bq_services, &s->s_id, NULL);
+    bq->bq_saveflag = 1;
+  }
 
-    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;
+  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;
-    if (bq->bq_enabled && bq->bq_maptoch)
-      bouquet_map_channel(bq, s);
+  } 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));
   }
 
index 1ea5e612395ad9d6615bbd4b26ed3edfc28b3730..1e2a59bd3bb02532f2972e8f2ea2d7369032093e 100644 (file)
@@ -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);
index f2ad99ffaf35dd903594e888fcd167e48e0782e2..d8eacf8a2034c1428451487dd6a4838417c2b811 100644 (file)
@@ -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);
     }
index dd8faab71b8d32a7ed08422e554e9234834e571f..fde13e1f2e9154c199939c49ccb3ee4b8a9b3110 100644 (file)
@@ -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;