Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
bouquet: freesat support
  • Loading branch information
perexg committed Nov 8, 2014
1 parent 8812f5c commit ab51ae2
Show file tree
Hide file tree
Showing 9 changed files with 459 additions and 55 deletions.
94 changes: 82 additions & 12 deletions src/bouquet.c
Expand Up @@ -112,12 +112,17 @@ void
bouquet_destroy_by_service(service_t *t)
{
bouquet_t *bq;
service_lcn_t *sl;

lock_assert(&global_lock);

RB_FOREACH(bq, &bouquets, bq_link)
if (idnode_set_exists(bq->bq_services, &t->s_id))
idnode_set_remove(bq->bq_services, &t->s_id);
while ((sl = LIST_FIRST(&t->s_lcns)) != NULL) {
LIST_REMOVE(sl, sl_link);
free(sl);
}
}

/**
Expand Down Expand Up @@ -150,8 +155,14 @@ bouquet_find_by_source(const char *name, const char *src, int create)

bqs.bq_src = (char *)src;
bq = RB_FIND(&bouquets, &bqs, bq_link, _bq_cmp);
if (bq)
if (bq) {
if (name && *name && strcmp(name, bq->bq_name)) {
tvhwarn("bouquet", "bouquet name '%s' changed to '%s'", bq->bq_name ?: "", name);
free(bq->bq_name);
bq->bq_name = strdup(name);
}
return bq;
}
if (create && name)
return bouquet_create(NULL, NULL, name, src);
return NULL;
Expand Down Expand Up @@ -227,13 +238,30 @@ bouquet_map_channel(bouquet_t *bq, service_t *t)
*
*/
void
bouquet_add_service(bouquet_t *bq, service_t *s)
bouquet_add_service(bouquet_t *bq, service_t *s, uint32_t lcn)
{
service_lcn_t *tl;

lock_assert(&global_lock);

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);
Expand Down Expand Up @@ -281,11 +309,17 @@ void
bouquet_completed(bouquet_t *bq)
{
idnode_set_t *remove;
service_t *s;
service_lcn_t *lcn, *lcn_next;
size_t z;

if (!bq)
return;

tvhtrace("bouquet", "completed: active=%zi old=%zi",
bq->bq_active_services->is_count, bq->bq_services->is_count);

/* Add/Remove services */
remove = idnode_set_create();
for (z = 0; z < bq->bq_services->is_count; z++)
if (!idnode_set_exists(bq->bq_active_services, bq->bq_services->is_array[z]))
Expand All @@ -294,8 +328,27 @@ bouquet_completed(bouquet_t *bq)
bouquet_remove_service(bq, (service_t *)remove->is_array[z]);
idnode_set_free(remove);

/* Remove no longer used LCNs */
for (z = 0; z < bq->bq_services->is_count; z++) {
s = (service_t *)bq->bq_services->is_array[z];
for (lcn = LIST_FIRST(&s->s_lcns); lcn; lcn = lcn_next) {
lcn_next = LIST_NEXT(lcn, sl_link);
if (lcn->sl_bouquet != bq) continue;
if (!lcn->sl_seen) {
LIST_REMOVE(lcn, sl_link);
free(lcn);
} else {
lcn->sl_seen = 0;
}
}
}


idnode_set_free(bq->bq_active_services);
bq->bq_active_services = idnode_set_create();

if (bq->bq_saveflag)
bouquet_save(bq, 1);
}

/*
Expand Down Expand Up @@ -335,6 +388,20 @@ bouquet_notify_channels(bouquet_t *bq)
}
}

/*
*
*/
uint64_t
bouquet_get_channel_number(bouquet_t *bq, service_t *t)
{
service_lcn_t *tl;

LIST_FOREACH(tl, &t->s_lcns, sl_link)
if (tl->sl_bouquet == bq)
return (int64_t)tl->sl_lcn * CHANNEL_SPLIT;
return 0;
}

/**
*
*/
Expand Down Expand Up @@ -524,15 +591,19 @@ bouquet_class_chtag_ref_set ( void *obj, const void *p )
static const void *
bouquet_class_services_get ( void *obj )
{
htsmsg_t *l = htsmsg_create_list();
htsmsg_t *m = htsmsg_create_map();
bouquet_t *bq = obj;
service_t *t;
size_t z;

/* Add all */
for (z = 0; z < bq->bq_services->is_count; z++)
htsmsg_add_str(l, NULL, idnode_uuid_as_str(bq->bq_services->is_array[z]));
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),
bouquet_get_channel_number(bq, t));
}

return l;
return m;
}

static char *
Expand Down Expand Up @@ -696,7 +767,7 @@ bouquet_service_resolve(void)
bouquet_t *bq;
htsmsg_field_t *f;
service_t *s;
const char *str;
uint32_t lcn;
int saveflag;

lock_assert(&global_lock);
Expand All @@ -706,11 +777,10 @@ bouquet_service_resolve(void)
continue;
saveflag = bq->bq_saveflag;
HTSMSG_FOREACH(f, bq->bq_services_waiting) {
if ((str = htsmsg_field_get_str(f))) {
s = service_find_by_identifier(str);
if (s)
bouquet_add_service(bq, s);
}
if (htsmsg_field_get_u32(f, &lcn)) continue;
s = service_find_by_identifier(f->hmf_name);
if (s)
bouquet_add_service(bq, s, lcn);
}
htsmsg_destroy(bq->bq_services_waiting);
bq->bq_services_waiting = NULL;
Expand Down
4 changes: 3 additions & 1 deletion src/bouquet.h
Expand Up @@ -76,9 +76,11 @@ 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);
void bouquet_add_service(bouquet_t *bq, service_t *s, uint32_t lcn);
void bouquet_completed(bouquet_t *bq);

uint64_t bouquet_get_channel_number(bouquet_t *bq, service_t *t);

void bouquet_save(bouquet_t *bq, int notify);

/**
Expand Down
7 changes: 6 additions & 1 deletion src/channels.c
Expand Up @@ -569,9 +569,13 @@ channel_get_number ( channel_t *ch )
if (ch->ch_number) {
n = ch->ch_number;
} else {
LIST_FOREACH(csm, &ch->ch_services, csm_chn_link)
LIST_FOREACH(csm, &ch->ch_services, csm_chn_link) {
if (ch->ch_bouquet &&
(n = bouquet_get_channel_number(ch->ch_bouquet, csm->csm_svc)))
break;
if ((n = service_get_channel_number(csm->csm_svc)))
break;
}
}
if (n) {
if (ch->ch_bouquet)
Expand Down Expand Up @@ -661,6 +665,7 @@ channel_get_icon ( channel_t *ch )
ch->ch_icon = strdup(icn);
channel_save(ch);
idnode_notify_simple(&ch->ch_id);
break;
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/input/mpegts.h
Expand Up @@ -111,7 +111,6 @@ typedef struct mpegts_table_state
int version;
int complete;
uint32_t sections[8];
void *bouquet;
RB_ENTRY(mpegts_table_state) link;
} mpegts_table_state_t;

Expand Down Expand Up @@ -172,6 +171,7 @@ struct mpegts_table
char *mt_name;

void *mt_opaque;
void *mt_bat;
mpegts_table_callback_t mt_callback;

RB_HEAD(,mpegts_table_state) mt_state;
Expand Down
7 changes: 6 additions & 1 deletion src/input/mpegts/dvb.h
Expand Up @@ -131,6 +131,9 @@ struct mpegts_mux;
#define DVB_DESC_AAC 0x7C
#define DVB_DESC_LOCAL_CHAN 0x83

#define DVB_DESC_FREESAT_LCN 0xD3
#define DVB_DESC_FREESAT_REGIONS 0xD4

/* Service type lookup */

int dvb_servicetype_lookup ( int t );
Expand Down Expand Up @@ -202,7 +205,9 @@ int dvb_table_begin
int tableid, uint64_t extraid, int minlen,
struct mpegts_table_state **st, int *sect, int *last, int *ver);
void dvb_table_reset
(struct mpegts_table *mt );
(struct mpegts_table *mt);
void dvb_bat_destroy
(struct mpegts_table *mt);

int dvb_pat_callback
(struct mpegts_table *mt, const uint8_t *ptr, int len, int tableid);
Expand Down

0 comments on commit ab51ae2

Please sign in to comment.