bouquet: fix the per-bouquet LCN handling

This commit is contained in:
Jaroslav Kysela 2014-11-06 12:40:25 +01:00
parent 1af5f9f5d1
commit bdaab51c30
4 changed files with 27 additions and 24 deletions

View 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);
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));
}

View 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);

View 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);
}

View 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;