From e7e4b9f7101a6e720f7b7a1b685b908ce4c82908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Mon, 25 Aug 2008 20:37:19 +0000 Subject: [PATCH] Remove the conecpt of channel groups, it's too inflexible --- Makefile | 2 +- autorec.c | 23 +--- autorec.h | 5 +- avgen.c | 2 +- channels.c | 282 ++++++++++++----------------------------------- channels.h | 14 +-- epg.c | 22 +--- epg.h | 3 +- epg_xmltv.c | 6 +- file_input.c | 2 +- htsclient.c | 4 +- htsp.c | 18 +-- iptv_output.c | 2 +- main.c | 3 +- pvr.c | 2 +- rpc.c | 4 +- rtsp.c | 2 +- serviceprobe.c | 2 +- transports.c | 2 +- tvhead.h | 27 +---- webui/simpleui.c | 2 +- 21 files changed, 107 insertions(+), 322 deletions(-) diff --git a/Makefile b/Makefile index 7e517acf..ac713add 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ SRCS += iptv_input.c iptv_output.c SRCS += avgen.c file_input.c -SRCS += htsclient.c rtsp.c rtp.c xbmsp.c +SRCS += htsclient.c rtsp.c rtp.c SRCS += v4l.c diff --git a/autorec.c b/autorec.c index 149b9f12..b8a8fbbc 100644 --- a/autorec.c +++ b/autorec.c @@ -64,10 +64,6 @@ autorec_cmp(autorec_t *ar, event_t *e) ar->ar_channel != e->e_channel) return 0; - if(ar->ar_channel_group != NULL && - ar->ar_channel_group != e->e_channel->ch_group) - return 0; - if(ar->ar_ecg != NULL) { if(e->e_content_type == NULL || ar->ar_ecg != e->e_content_type->ect_group) @@ -103,7 +99,7 @@ autorec_check_new_ar(autorec_t *ar) event_t *e; channel_t *ch; - LIST_FOREACH(ch, &channels, ch_global_link) { + RB_FOREACH(ch, &channel_tree, ch_global_link) { e = ch->ch_epg_cur_event; if(e == NULL) continue; @@ -146,7 +142,7 @@ autorec_check_new_event(event_t *e) */ static autorec_t * autorec_create0(const char *name, int prio, const char *title, - epg_content_group_t *ecg, channel_group_t *tcg, + epg_content_group_t *ecg, channel_t *ch, int id, const char *creator) { autorec_t *ar = calloc(1, sizeof(autorec_t)); @@ -162,9 +158,6 @@ autorec_create0(const char *name, int prio, const char *title, ar->ar_rec_prio = prio; ar->ar_ecg = ecg; - ar->ar_channel_group = tcg; - LIST_INSERT_HEAD(&tcg->tcg_autorecs, ar, ar_channel_group_link); - ar->ar_channel = ch; LIST_INSERT_HEAD(&ch->ch_autorecs, ar, ar_channel_link); @@ -194,7 +187,6 @@ autorec_destroy(autorec_t *ar) free((void *)ar->ar_creator); free((void *)ar->ar_name); - LIST_REMOVE(ar, ar_channel_group_link); LIST_REMOVE(ar, ar_channel_link); TAILQ_REMOVE(&autorecs, ar, ar_link); @@ -207,13 +199,13 @@ autorec_destroy(autorec_t *ar) */ int autorec_create(const char *name, int prio, const char *title, - epg_content_group_t *ecg, channel_group_t *tcg, + epg_content_group_t *ecg, channel_t *ch, const char *creator) { autorec_t *ar; ar_id_ceil++; - ar = autorec_create0(name, prio, title, ecg, tcg, ch, ar_id_ceil, creator); + ar = autorec_create0(name, prio, title, ecg, ch, ar_id_ceil, creator); if(ar == NULL) return -1; @@ -263,9 +255,6 @@ autorec_save_entry(autorec_t *ar) if(ar->ar_ecg != NULL) fprintf(fp, "event_content_group = %s\n", ar->ar_ecg->ecg_name); - if(ar->ar_channel_group != NULL) - fprintf(fp, "channel_group = %s\n", ar->ar_channel_group->tcg_name); - if(ar->ar_channel != NULL) fprintf(fp, "channel = %s\n", ar->ar_channel->ch_name); fclose(fp); @@ -317,9 +306,7 @@ autorec_load(void) contentgroup ? epg_content_group_find_by_name(contentgroup) : NULL, - chgroup ? channel_group_find(chgroup, 1) : NULL, - - channel ? channel_find(channel, 1, NULL) : NULL, + channel ? channel_find(channel, 1) : NULL, id, creator); if(id > ar_id_ceil) diff --git a/autorec.h b/autorec.h index 9bc8896c..19f399e6 100644 --- a/autorec.h +++ b/autorec.h @@ -39,9 +39,6 @@ typedef struct autorec { epg_content_group_t *ar_ecg; - channel_group_t *ar_channel_group; - LIST_ENTRY(autorec) ar_channel_group_link; - channel_t *ar_channel; LIST_ENTRY(autorec) ar_channel_link; @@ -51,7 +48,7 @@ typedef struct autorec { void autorec_init(void); int autorec_create(const char *name, int prio, const char *title, - epg_content_group_t *ecg, channel_group_t *tcg, + epg_content_group_t *ecg, channel_t *ch, const char *creator); void autorec_check_new_event(event_t *e); diff --git a/avgen.c b/avgen.c index d579eb97..b0020ed8 100644 --- a/avgen.c +++ b/avgen.c @@ -98,7 +98,7 @@ avgen_init(void) if(avcodec_find_encoder(CODEC_ID_MP2) == NULL) return; - ch = channel_find("Test PAL", 1, channel_group_find("Test channels", 1)); + ch = channel_find("Test PAL", 1); t = calloc(1, sizeof(th_transport_t)); diff --git a/channels.c b/channels.c index 29138e47..9670435e 100644 --- a/channels.c +++ b/channels.c @@ -30,6 +30,7 @@ #include #include +#include #include "tvhead.h" #include "v4l.h" @@ -41,127 +42,54 @@ #include "pvr.h" #include "autorec.h" -struct channel_list channels; -int nchannels; +struct channel_tree channel_tree; -struct channel_group_queue all_channel_groups; - -channel_group_t *defgroup; - - -/** - * - */ static int -ch_number(const char *s1) +dictcmp(const char *a, const char *b) { - while(*s1) { - if(*s1 >= '0' && *s1 <= '9') { - return strtol(s1, NULL, 10); + long int da, db; + + while(1) { + switch((*a >= '0' && *a <= '9' ? 1 : 0)|(*b >= '0' && *b <= '9' ? 2 : 0)) { + case 0: /* 0: a is not a digit, nor is b */ + if(*a != *b) + return *(const unsigned char *)a - *(const unsigned char *)b; + if(*a == 0) + return 0; + a++; + b++; + break; + case 1: /* 1: a is a digit, b is not */ + case 2: /* 2: a is not a digit, b is */ + return *(const unsigned char *)a - *(const unsigned char *)b; + case 3: /* both are digits, switch to integer compare */ + da = strtol(a, (char **)&a, 10); + db = strtol(b, (char **)&b, 10); + if(da != db) + return da - db; + break; } - s1++; } - return INT32_MAX; -} - -static int -chcmp(const char *s1, const char *s2) -{ - int n1, n2; - - n1 = ch_number(s1); - n2 = ch_number(s2); - - if(n1 != n2) { - return n1 - n2; - } - return strcmp(s1, s2); -} - -/** - * - */ -static int -channelcmp(channel_t *a, channel_t *b) -{ - return chcmp(a->ch_name, b->ch_name); } /** * */ -channel_group_t * -channel_group_find(const char *name, int create) +static int +channelcmp(const channel_t *a, const channel_t *b) { - channel_group_t *tcg; - - TAILQ_FOREACH(tcg, &all_channel_groups, tcg_global_link) { - if(!strcmp(name, tcg->tcg_name)) - return tcg; - } - if(!create) - return NULL; - - tcg = calloc(1, sizeof(channel_group_t)); - tcg->tcg_name = strdup(name); - tcg->tcg_tag = tag_get(); - - TAILQ_INIT(&tcg->tcg_channels); - - TAILQ_INSERT_TAIL(&all_channel_groups, tcg, tcg_global_link); - - channel_group_settings_write(); - return tcg; + return dictcmp(a->ch_name, b->ch_name); } - - -/** - * - */ -void -channel_set_group(channel_t *ch, channel_group_t *tcg) -{ - if(ch->ch_group != NULL) - TAILQ_REMOVE(&ch->ch_group->tcg_channels, ch, ch_group_link); - - ch->ch_group = tcg; - TAILQ_INSERT_SORTED(&tcg->tcg_channels, ch, ch_group_link, channelcmp); - - channel_settings_write(ch); -} - - -/** - * - */ -void -channel_group_destroy(channel_group_t *tcg) -{ - channel_t *ch; - - if(defgroup == tcg) - return; - - while((ch = TAILQ_FIRST(&tcg->tcg_channels)) != NULL) { - channel_set_group(ch, defgroup); - } - - TAILQ_REMOVE(&all_channel_groups, tcg, tcg_global_link); - free((void *)tcg->tcg_name); - free(tcg); - - channel_group_settings_write(); -} - /** * */ static void channel_set_name(channel_t *ch, const char *name) { + channel_t *x; const char *n2; int l, i; char *cp, c; @@ -187,68 +115,38 @@ channel_set_name(channel_t *ch, const char *name) free((void *)n2); - LIST_INSERT_SORTED(&channels, ch, ch_global_link, channelcmp); + x = RB_INSERT_SORTED(&channel_tree, ch, ch_global_link, channelcmp); + assert(x == NULL); } /** * */ channel_t * -channel_find(const char *name, int create, channel_group_t *tcg) +channel_find(const char *name, int create) { - channel_t *ch; + channel_t *ch, skel; - LIST_FOREACH(ch, &channels, ch_global_link) - if(!strcasecmp(name, ch->ch_name)) - return ch; + skel.ch_name = name; + + if((ch = RB_FIND(&channel_tree, &skel, ch_global_link, channelcmp)) != NULL) + return ch; if(create == 0) return NULL; ch = calloc(1, sizeof(channel_t)); - ch->ch_index = nchannels; + ch->ch_index = channel_tree.entries; + TAILQ_INIT(&ch->ch_epg_events); channel_set_name(ch, name); - channel_set_group(ch, tcg ?: defgroup); - ch->ch_tag = tag_get(); - nchannels++; return ch; } -/** - * - */ -static void -service_load(struct config_head *head) -{ - const char *name, *v; - th_transport_t *t; - int r = 1; - - if((name = config_get_str_sub(head, "channel", NULL)) == NULL) - return; - - t = calloc(1, sizeof(th_transport_t)); - - if(0) { -#ifdef ENABLE_INPUT_IPTV - } else if((v = config_get_str_sub(head, "iptv", NULL)) != NULL) { - r = iptv_configure_transport(t, v, head, name); -#endif -#ifdef ENABLE_INPUT_V4L - } else if((v = config_get_str_sub(head, "v4lmux", NULL)) != NULL) { - r = v4l_configure_transport(t, v, name); -#endif - } - if(r) - free(t); -} - - static struct strtab commercial_detect_tab[] = { { "none", COMMERCIAL_DETECT_NONE }, { "ttp192", COMMERCIAL_DETECT_TTP192 }, @@ -261,6 +159,7 @@ static struct strtab commercial_detect_tab[] = { void channels_load(void) { +#if 0 struct config_head cl; config_entry_t *ce; char buf[PATH_MAX]; @@ -268,7 +167,6 @@ channels_load(void) struct dirent *d; const char *name, *grp, *x; channel_t *ch; - channel_group_t *tcg; int v; TAILQ_INIT(&all_channel_groups); @@ -338,6 +236,7 @@ channels_load(void) service_load(&ce->ce_sub); } } +#endif } @@ -350,7 +249,7 @@ channel_by_index(uint32_t index) { channel_t *ch; - LIST_FOREACH(ch, &channels, ch_global_link) + RB_FOREACH(ch, &channel_tree, ch_global_link) if(ch->ch_index == index) return ch; @@ -367,7 +266,7 @@ channel_by_tag(uint32_t tag) { channel_t *ch; - LIST_FOREACH(ch, &channels, ch_global_link) + RB_FOREACH(ch, &channel_tree, ch_global_link) if(ch->ch_tag == tag) return ch; @@ -376,72 +275,20 @@ channel_by_tag(uint32_t tag) -/** - * - */ -channel_group_t * -channel_group_by_tag(uint32_t tag) -{ - channel_group_t *tcg; - - TAILQ_FOREACH(tcg, &all_channel_groups, tcg_global_link) { - if(tcg->tcg_tag == tag) - return tcg; - if(tag == 0 && tcg->tcg_hidden == 0) - return tcg; - } - - return NULL; -} - - -/** - * Write out a config file with all channel groups - * - * We do this to maintain order of groups - */ -void -channel_group_settings_write(void) -{ - FILE *fp; - channel_group_t *tcg; - - char buf[400]; - snprintf(buf, sizeof(buf), "%s/channel-group-settings.cfg", settings_dir); - - if((fp = settings_open_for_write(buf)) == NULL) - return; - - TAILQ_FOREACH(tcg, &all_channel_groups, tcg_global_link) { - fprintf(fp, "channel-group {\n" - "\tname = %s\n", tcg->tcg_name); - fprintf(fp, "}\n"); - } - fclose(fp); -} - - /** * Write out a config file for a channel */ -void -channel_settings_write(channel_t *ch) +static void +channel_save(channel_t *ch) { - FILE *fp; - char buf[400]; - - snprintf(buf, sizeof(buf), "%s/channels/%s", settings_dir, ch->ch_sname); - if((fp = settings_open_for_write(buf)) == NULL) - return; - - fprintf(fp, "name = %s\n", ch->ch_name); - fprintf(fp, "channel-group = %s\n", ch->ch_group->tcg_name); - if(ch->ch_icon != NULL) - fprintf(fp, "icon = %s\n", ch->ch_icon); - fprintf(fp, "commercial-detect = %s\n", - val2str(ch->ch_commercial_detection, commercial_detect_tab) ?: "?"); - fclose(fp); + htsmsg_t *m = htsmsg_create(); + htsmsg_add_str(m, "icon", ch->ch_icon); + htsmsg_add_str(m, "commercial_detect", + val2str(ch->ch_commercial_detection, + commercial_detect_tab) ?: "?"); + hts_settings_save(m, "channels/%s", ch->ch_name); + htsmsg_destroy(m); } /** @@ -452,10 +299,12 @@ channel_rename(channel_t *ch, const char *newname) { th_transport_t *t; - if(channel_find(newname, 0, NULL)) + if(channel_find(newname, 0)) return -1; - LIST_REMOVE(ch, ch_global_link); + hts_settings_remove("channels/%s", ch->ch_name); + + RB_REMOVE(&channel_tree, ch, ch_global_link); channel_set_name(ch, newname); LIST_FOREACH(t, &ch->ch_transports, tht_ch_link) { @@ -464,7 +313,7 @@ channel_rename(channel_t *ch, const char *newname) t->tht_config_change(t); } - channel_settings_write(ch); + channel_save(ch); return 0; } @@ -476,7 +325,6 @@ channel_delete(channel_t *ch) { th_transport_t *t; th_subscription_t *s; - char buf[400]; pvr_destroy_by_channel(ch); @@ -494,17 +342,14 @@ channel_delete(channel_t *ch) autorec_destroy_by_channel(ch); - snprintf(buf, sizeof(buf), "%s/channels/%s", settings_dir, ch->ch_sname); - unlink(buf); + hts_settings_remove("channels/%s", ch->ch_name); free((void *)ch->ch_name); free((void *)ch->ch_sname); free(ch->ch_icon); - TAILQ_REMOVE(&ch->ch_group->tcg_channels, ch, ch_group_link); - LIST_REMOVE(ch, ch_global_link); + RB_REMOVE(&channel_tree, ch, ch_global_link); free(ch); - } @@ -528,3 +373,14 @@ channel_merge(channel_t *dst, channel_t *src) channel_delete(src); } + +/** + * + */ +void +channel_set_icon(channel_t *ch, const char *icon) +{ + free(ch->ch_icon); + ch->ch_icon = icon ? strdup(icon) : NULL; + channel_save(ch); +} diff --git a/channels.h b/channels.h index 7f5a9e1d..f2106c83 100644 --- a/channels.h +++ b/channels.h @@ -31,20 +31,10 @@ int channel_get_channels(void); void channel_unsubscribe(th_subscription_t *s); -channel_t *channel_find(const char *name, int create, channel_group_t *tcg); - -channel_group_t *channel_group_find(const char *name, int create); - -channel_group_t *channel_group_by_tag(uint32_t tag); - -void channel_group_destroy(channel_group_t *tcg); - -void channel_set_group(channel_t *ch, channel_group_t *tcg); +channel_t *channel_find(const char *name, int create); void channel_set_teletext_rundown(channel_t *ch, int v); -void channel_group_settings_write(void); - void channel_settings_write(channel_t *ch); int channel_rename(channel_t *ch, const char *newname); @@ -53,4 +43,6 @@ void channel_delete(channel_t *ch); void channel_merge(channel_t *dst, channel_t *src); +void channel_set_icon(channel_t *ch, const char *icon); + #endif /* CHANNELS_H */ diff --git a/epg.c b/epg.c index b37f254c..9f2f8494 100644 --- a/epg.c +++ b/epg.c @@ -413,7 +413,7 @@ epg_channel_maintain(void *aux, int64_t clk) now = dispatch_clock; - LIST_FOREACH(ch, &channels, ch_global_link) { + RB_FOREACH(ch, &channel_tree, ch_global_link) { /* Age out any old events */ @@ -466,11 +466,8 @@ epg_transfer_events(channel_t *ch, struct event_queue *src, event_t *e; int cnt = 0; - if(strcmp(icon ?: "", ch->ch_icon ?: "")) { - free(ch->ch_icon); - ch->ch_icon = icon ? strdup(icon) : NULL; - channel_settings_write(ch); - } + if(strcmp(icon ?: "", ch->ch_icon ?: "")) + channel_set_icon(ch, icon); TAILQ_FOREACH(e, src, e_channel_link) { @@ -551,9 +548,8 @@ epg_content_group_find_by_name(const char *name) int epg_search(struct event_list *h, const char *title, epg_content_group_t *s_ecg, - channel_group_t *s_tcg, channel_t *s_ch) + channel_t *s_ch) { - channel_group_t *dis; channel_t *ch; event_t *e; int num = 0; @@ -563,21 +559,13 @@ epg_search(struct event_list *h, const char *title, regcomp(&preg, title, REG_ICASE | REG_EXTENDED | REG_NOSUB)) return -1; - dis = channel_group_find("-disabled-", 1); - - LIST_FOREACH(ch, &channels, ch_global_link) { - if(ch->ch_group == dis) - continue; - + RB_FOREACH(ch, &channel_tree, ch_global_link) { if(LIST_FIRST(&ch->ch_transports) == NULL) continue; if(s_ch != NULL && s_ch != ch) continue; - if(s_tcg != NULL && s_tcg != ch->ch_group) - continue; - TAILQ_FOREACH(e, &ch->ch_epg_events, e_channel_link) { if(e->e_start + e->e_duration < dispatch_clock) diff --git a/epg.h b/epg.h index 694dc488..86e4e3eb 100644 --- a/epg.h +++ b/epg.h @@ -55,8 +55,7 @@ epg_content_type_t *epg_content_type_find_by_dvbcode(uint8_t dvbcode); epg_content_group_t *epg_content_group_find_by_name(const char *name); int epg_search(struct event_list *h, const char *title, - epg_content_group_t *s_ecg, channel_group_t *s_tcg, - channel_t *s_ch); + epg_content_group_t *s_ecg, channel_t *s_ch); void epg_destroy_by_channel(channel_t *ch); diff --git a/epg_xmltv.c b/epg_xmltv.c index a888d8af..2dcb07b4 100644 --- a/epg_xmltv.c +++ b/epg_xmltv.c @@ -250,7 +250,7 @@ xmltv_resolve_by_events(xmltv_channel_t *xc) if(ex == NULL) break; - LIST_FOREACH(ch, &channels, ch_global_link) { + RB_FOREACH(ch, &channel_tree, ch_global_link) { ec = epg_event_find_by_time0(&ch->ch_epg_events, now); cnt = 0; @@ -289,14 +289,14 @@ xmltv_transfer_events(xmltv_grabber_t *xg) continue; if(xc->xc_channel != NULL) { - ch = channel_find(xc->xc_channel, 0, NULL); + ch = channel_find(xc->xc_channel, 0); if(ch == NULL) continue; } else { how = 0; - ch = channel_find(xc->xc_displayname, 0, NULL); + ch = channel_find(xc->xc_displayname, 0); if(ch == NULL) { ch = xmltv_resolve_by_events(xc); diff --git a/file_input.c b/file_input.c index 80b7fcb0..39f1121f 100644 --- a/file_input.c +++ b/file_input.c @@ -159,7 +159,7 @@ file_input_init(void) if((s = config_get_str_sub(&ce->ce_sub, "channel", NULL)) == NULL) continue; - ch = channel_find(s, 1, channel_group_find("Streamed channels", 1)); + ch = channel_find(s, 1); t->tht_name = strdup(ch->ch_name); diff --git a/htsclient.c b/htsclient.c index ef90a721..3f0ebd9a 100644 --- a/htsclient.c +++ b/htsclient.c @@ -248,9 +248,7 @@ cr_channels_list(client_t *c, char **argv, int argc) { channel_t *ch; - LIST_FOREACH(ch, &channels, ch_global_link) { - if(ch->ch_group == NULL) - continue; + RB_FOREACH(ch, &channel_tree, ch_global_link) { cprintf(c, "channel = %d\n", ch->ch_index); } return 0; diff --git a/htsp.c b/htsp.c index 0ed1abbc..76c3a2e2 100644 --- a/htsp.c +++ b/htsp.c @@ -79,7 +79,6 @@ htsp_build_channel_msg(channel_t *ch, const char *method) event_t *e; htsmsg_add_str(msg, "method", method); - htsmsg_add_str(msg, "channelGroupName", ch->ch_group->tcg_name); htsmsg_add_str(msg, "channelName", ch->ch_name); htsmsg_add_u32(msg, "channelTag", ch->ch_tag); if(ch->ch_icon != NULL) @@ -101,25 +100,14 @@ static void htsp_send_all_channels(htsp_t *htsp) { htsmsg_t *msg; - channel_group_t *tcg; channel_t *ch; - TAILQ_FOREACH(tcg, &all_channel_groups, tcg_global_link) { - if(tcg->tcg_hidden) + RB_FOREACH(ch, &channel_tree, ch_global_link) { + if(LIST_FIRST(&ch->ch_transports) == NULL) continue; - msg = htsmsg_create(); - htsmsg_add_str(msg, "method", "channelGroupAdd"); - htsmsg_add_str(msg, "channelGroupName", tcg->tcg_name); + msg = htsp_build_channel_msg(ch, "channelAdd"); htsp_send_msg(htsp, msg, 0); - - TAILQ_FOREACH(ch, &tcg->tcg_channels, ch_group_link) { - if(LIST_FIRST(&ch->ch_transports) == NULL) - continue; - - msg = htsp_build_channel_msg(ch, "channelAdd"); - htsp_send_msg(htsp, msg, 0); - } } } diff --git a/iptv_output.c b/iptv_output.c index 924da8c9..39b8d80e 100644 --- a/iptv_output.c +++ b/iptv_output.c @@ -133,7 +133,7 @@ output_multicast_load(struct config_head *head) if((name = config_get_str_sub(head, "channel", NULL)) == NULL) return; - ch = channel_find(name, 1, NULL); + ch = channel_find(name, 1); om = calloc(1, sizeof(output_multicast_t)); diff --git a/main.c b/main.c index 7373195b..3cf2433b 100644 --- a/main.c +++ b/main.c @@ -318,10 +318,11 @@ main(int argc, char **argv) p = atoi(config_get_str("htsp-server-port", "9910")); if(p) htsp_start(p); - +#if 0 p = atoi(config_get_str("xbmsp-server-port", "0")); if(p) xbmsp_start(p); +#endif } dispatcher(); diff --git a/pvr.c b/pvr.c index e5c5dbba..4f76864a 100644 --- a/pvr.c +++ b/pvr.c @@ -438,7 +438,7 @@ pvr_database_load(void) if(channel != NULL && start && stop && title && status) { pvrr = calloc(1, sizeof(pvr_rec_t)); - pvrr->pvrr_channel = channel_find(channel, 1, NULL); + pvrr->pvrr_channel = channel_find(channel, 1); pvrr->pvrr_start = start; pvrr->pvrr_stop = stop; pvrr->pvrr_status = *status; diff --git a/rpc.c b/rpc.c index 3b5b8a6d..3b592d0d 100644 --- a/rpc.c +++ b/rpc.c @@ -148,7 +148,7 @@ rpc_channels_list(rpc_session_t *ses, htsmsg_t *in, void *opaque) out = htsmsg_create(); htsmsg_add_u32(out, "seq", ses->rs_seq); - LIST_FOREACH(ch, &channels, ch_global_link) + RB_FOREACH(ch, &channel_tree, ch_global_link) htsmsg_add_msg(out, "channel", rpc_build_channel_msg(ch)); return out; @@ -174,7 +174,7 @@ rpc_event_info(rpc_session_t *ses, htsmsg_t *in, void *opaque) if(htsmsg_get_u32(in, "tag", &u32) >= 0) { e = epg_event_find_by_tag(u32); } else if((s = htsmsg_get_str(in, "channel")) != NULL) { - if((ch = channel_find(s, 0, NULL)) == NULL) { + if((ch = channel_find(s, 0)) == NULL) { errtxt = "Channel not found"; } else { if(htsmsg_get_u32(in, "time", &u32) < 0) { diff --git a/rtsp.c b/rtsp.c index 1f53f511..cfce733b 100644 --- a/rtsp.c +++ b/rtsp.c @@ -104,7 +104,7 @@ rtsp_channel_by_url(char *url) return NULL; c++; - LIST_FOREACH(ch, &channels, ch_global_link) + RB_FOREACH(ch, &channel_tree, ch_global_link) if(!strcasecmp(ch->ch_sname, c)) return ch; diff --git a/serviceprobe.c b/serviceprobe.c index 14bd8be3..abec5f55 100644 --- a/serviceprobe.c +++ b/serviceprobe.c @@ -93,7 +93,7 @@ sp_packet_input(void *opaque, th_muxstream_t *tms, th_pkt_t *pkt) tvhlog(LOG_INFO, "serviceprobe", "Probed \"%s\" -- Ok", t->tht_svcname); if(t->tht_ch == NULL && t->tht_svcname != NULL) { - ch = channel_find(t->tht_svcname, 1, NULL); + ch = channel_find(t->tht_svcname, 1); transport_map_channel(t, ch); t->tht_config_change(t); diff --git a/transports.c b/transports.c index f63fec8f..8cf75bf8 100644 --- a/transports.c +++ b/transports.c @@ -558,7 +558,7 @@ transport_map_channel(th_transport_t *t, channel_t *ch) if(ch == NULL) { if(t->tht_chname == NULL) return; - ch = channel_find(t->tht_chname, 1, NULL); + ch = channel_find(t->tht_chname, 1); } else { free(t->tht_chname); t->tht_chname = strdup(ch->ch_name); diff --git a/tvhead.h b/tvhead.h index 50c47ad7..b3eb0a37 100644 --- a/tvhead.h +++ b/tvhead.h @@ -70,9 +70,8 @@ typedef struct dtimer { */ LIST_HEAD(th_subscription_list, th_subscription); -LIST_HEAD(channel_list, channel); +RB_HEAD(channel_tree, channel); TAILQ_HEAD(channel_queue, channel); -TAILQ_HEAD(channel_group_queue, channel_group); TAILQ_HEAD(th_dvb_adapter_queue, th_dvb_adapter); LIST_HEAD(th_v4l_adapter_list, th_v4l_adapter); LIST_HEAD(event_list, event); @@ -96,8 +95,7 @@ LIST_HEAD(autorec_list, autorec); extern time_t dispatch_clock; extern int startupcounter; extern struct th_transport_list all_transports; -extern struct channel_list channels; -extern struct channel_group_queue all_channel_groups; +extern struct channel_tree channel_tree; extern struct pvr_rec_list pvrr_global_list; extern struct th_subscription_list subscriptions; @@ -774,32 +772,14 @@ typedef struct tt_decoder { } tt_decoder_t; -/** - * Channel groups - */ -typedef struct channel_group { - TAILQ_ENTRY(channel_group) tcg_global_link; - - const char *tcg_name; - struct channel_queue tcg_channels; - int tcg_tag; - int tcg_cant_delete_me; - int tcg_hidden; - - struct autorec_list tcg_autorecs; - -} channel_group_t; - /* * Channel definition */ typedef struct channel { - LIST_ENTRY(channel) ch_global_link; + RB_ENTRY(channel) ch_global_link; - TAILQ_ENTRY(channel) ch_group_link; - channel_group_t *ch_group; LIST_HEAD(, th_transport) ch_transports; LIST_HEAD(, th_subscription) ch_subscriptions; @@ -943,7 +923,6 @@ extern const char *settings_dir; FILE *settings_open_for_write(const char *name); FILE *settings_open_for_read(const char *name); extern const char *sys_warning; -extern channel_group_t *defgroup; static inline unsigned int tvh_strhash(const char *s, unsigned int mod) { diff --git a/webui/simpleui.c b/webui/simpleui.c index 29a72963..27684565 100644 --- a/webui/simpleui.c +++ b/webui/simpleui.c @@ -113,7 +113,7 @@ page_simple(http_connection_t *hc, http_reply_t *hr, if(s != NULL) { LIST_INIT(&events); - c = epg_search(&events, s, NULL, NULL, NULL); + c = epg_search(&events, s, NULL, NULL); if(c == -1) { htsbuf_qprintf(hq, "Event title: Regular expression syntax error");