diff --git a/ajaxui/ajaxui_config_channels.c b/ajaxui/ajaxui_config_channels.c
index 9cc73af9..63aac268 100644
--- a/ajaxui/ajaxui_config_channels.c
+++ b/ajaxui/ajaxui_config_channels.c
@@ -413,13 +413,13 @@ ajax_cheditor(http_connection_t *hc, http_reply_t *hr,
tcp_qprintf(tq, "
");
diff --git a/ajaxui/ajaxui_config_transport.c b/ajaxui/ajaxui_config_transport.c
index 8f138647..d5e69157 100644
--- a/ajaxui/ajaxui_config_transport.c
+++ b/ajaxui/ajaxui_config_transport.c
@@ -134,7 +134,7 @@ ajax_transport_build_list(http_connection_t *hc, tcp_queue_t *tq,
ajax_table_cell(&ta, NULL, "%d", t->tht_dvb_service_id);
ajax_table_cell(&ta, NULL, "%s", t->tht_scrambled ? "Yes" : "No");
ajax_table_cell(&ta, NULL, "%s", transport_servicetype_txt(t));
- ajax_table_cell(&ta, NULL, "%s", t->tht_servicename ?: "");
+ ajax_table_cell(&ta, NULL, "%s", t->tht_svcname ?: "");
ajax_table_cell(&ta, NULL,
"
"
"
",
t->tht_identifier, t->tht_identifier,
- t->tht_channel ? "" : "un");
+ t->tht_ch ? "" : "un");
- if(t->tht_channel == NULL) {
+ if(t->tht_ch == NULL) {
/* Unmapped */
ajax_table_cell(&ta, "chname",
"
"
"%s",
t->tht_identifier, t->tht_identifier,
- t->tht_channelname, t->tht_channelname);
+ t->tht_chname, t->tht_chname);
} else {
- ajax_table_cell(&ta, "chname", "%s", t->tht_channel->ch_name);
+ ajax_table_cell(&ta, "chname", "%s", t->tht_ch->ch_name);
}
ajax_table_cell_checkbox(&ta);
@@ -254,8 +254,8 @@ ajax_transport_rename_channel(http_connection_t *hc, http_reply_t *hr,
if((newname = http_arg_get(&hc->hc_req_args, "newname")) == NULL)
return HTTP_STATUS_BAD_REQUEST;
- free((void *)t->tht_channelname);
- t->tht_channelname = strdup(newname);
+ free((void *)t->tht_chname);
+ t->tht_chname = strdup(newname);
ajax_a_jsfuncf(tq, newname,
"tentative_chname('chname_%s', "
@@ -273,12 +273,12 @@ ajax_transport_rename_channel(http_connection_t *hc, http_reply_t *hr,
static void
dvb_map_channel(th_transport_t *t, tcp_queue_t *tq)
{
- transport_map_channel(t);
+ transport_map_channel(t, NULL);
tcp_qprintf(tq,
"$('chname_%s').innerHTML='%s';\n\r"
"$('map_%s').src='/gfx/mapped.png';\n\r",
- t->tht_identifier, t->tht_channel->ch_name,
+ t->tht_identifier, t->tht_ch->ch_name,
t->tht_identifier);
}
@@ -299,7 +299,7 @@ dvb_unmap_channel(th_transport_t *t, tcp_queue_t *tq)
"';\n\r"
"$('map_%s').src='/gfx/unmapped.png';\n\r",
t->tht_identifier, t->tht_identifier, t->tht_identifier,
- t->tht_channelname, t->tht_channelname, t->tht_identifier);
+ t->tht_chname, t->tht_chname, t->tht_identifier);
}
@@ -327,13 +327,13 @@ ajax_transport_op(http_connection_t *hc, http_reply_t *hr,
continue;
if(!strcmp(op, "toggle")) {
- if(t->tht_channel)
+ if(t->tht_ch)
dvb_unmap_channel(t, tq);
else
dvb_map_channel(t, tq);
- } else if(!strcmp(op, "map") && t->tht_channel == NULL) {
+ } else if(!strcmp(op, "map") && t->tht_ch == NULL) {
dvb_map_channel(t, tq);
- } else if(!strcmp(op, "unmap") && t->tht_channel != NULL) {
+ } else if(!strcmp(op, "unmap") && t->tht_ch != NULL) {
dvb_unmap_channel(t, tq);
} else if(!strcmp(op, "probe")) {
serviceprobe_add(t);
diff --git a/avgen.c b/avgen.c
index 184afcc2..03c71801 100644
--- a/avgen.c
+++ b/avgen.c
@@ -116,9 +116,8 @@ avgen_init(void)
t->tht_provider = strdup("HTS Tvheadend");
t->tht_identifier = strdup("test1");
- t->tht_servicename = strdup("test1");
- transport_map_channel(t);
+ transport_map_channel(t, ch);
}
diff --git a/channels.c b/channels.c
index 0fcd0c54..a1b3015d 100644
--- a/channels.c
+++ b/channels.c
@@ -461,9 +461,9 @@ channel_rename(channel_t *ch, const char *newname)
LIST_REMOVE(ch, ch_global_link);
channel_set_name(ch, newname);
- LIST_FOREACH(t, &ch->ch_transports, tht_channel_link) {
- free(t->tht_servicename);
- t->tht_servicename = strdup(newname);
+ LIST_FOREACH(t, &ch->ch_transports, tht_ch_link) {
+ free(t->tht_chname);
+ t->tht_chname = strdup(newname);
t->tht_config_change(t);
}
@@ -497,6 +497,9 @@ channel_delete(channel_t *ch)
autorec_destroy_by_channel(ch);
+ snprintf(buf, sizeof(buf), "%s/channels/%s", settings_dir, ch->ch_sname);
+ unlink(buf);
+
free((void *)ch->ch_name);
free((void *)ch->ch_sname);
free(ch->ch_icon);
@@ -505,8 +508,6 @@ channel_delete(channel_t *ch)
LIST_REMOVE(ch, ch_global_link);
free(ch);
- snprintf(buf, sizeof(buf), "%s/channels/%s", settings_dir, ch->ch_sname);
- unlink(buf);
}
@@ -524,10 +525,7 @@ channel_merge(channel_t *dst, channel_t *src)
while((t = LIST_FIRST(&src->ch_transports)) != NULL) {
transport_unmap_channel(t);
- free(t->tht_servicename);
- t->tht_servicename = strdup(dst->ch_name);
-
- transport_map_channel(t);
+ transport_map_channel(t, dst);
t->tht_config_change(t);
}
diff --git a/cwc.c b/cwc.c
index 3d95eb18..1b42fb95 100644
--- a/cwc.c
+++ b/cwc.c
@@ -503,7 +503,7 @@ cwc_dispatch_running_reply(cwc_t *cwc, uint8_t msgtype, uint8_t *msg, int len)
if(ct->ct_keystate != CT_FORBIDDEN) {
syslog(LOG_ERR,
"Can not descramble \"%s\" for service \"%s\", access denied",
- t->tht_identifier, t->tht_servicename);
+ t->tht_identifier, t->tht_svcname);
ct->ct_keystate = CT_FORBIDDEN;
}
@@ -513,7 +513,7 @@ cwc_dispatch_running_reply(cwc_t *cwc, uint8_t msgtype, uint8_t *msg, int len)
if(ct->ct_keystate != CT_RESOLVED)
syslog(LOG_INFO,
"Obtained key for \"%s\" for service \"%s\"",
- t->tht_identifier, t->tht_servicename);
+ t->tht_identifier, t->tht_svcname);
ct->ct_keystate = CT_RESOLVED;
set_control_words(ct->ct_keys, msg + 3, msg + 3 + 8);
diff --git a/dvb.c b/dvb.c
index 0cd9baee..9a20e675 100644
--- a/dvb.c
+++ b/dvb.c
@@ -581,13 +581,13 @@ dvb_tdmi_save(th_dvb_mux_instance_t *tdmi)
if(t->tht_provider != NULL)
fprintf(fp, "\tprovider = %s\n", t->tht_provider);
- if(t->tht_servicename)
- fprintf(fp, "\tservicename = %s\n", t->tht_servicename);
+ if(t->tht_svcname)
+ fprintf(fp, "\tservicename = %s\n", t->tht_svcname);
- if(t->tht_channelname)
- fprintf(fp, "\tchannelname = %s\n", t->tht_channelname);
+ if(t->tht_chname)
+ fprintf(fp, "\tchannelname = %s\n", t->tht_chname);
- fprintf(fp, "\tmapped = %d\n", t->tht_channel ? 1 : 0);
+ fprintf(fp, "\tmapped = %d\n", t->tht_ch ? 1 : 0);
psi_save_transport(fp, t);
@@ -634,21 +634,21 @@ dvb_tdmi_load(th_dvb_mux_instance_t *tdmi)
t->tht_provider = strdup(v);
v = config_get_str_sub(&ce->ce_sub, "servicename", "unknown");
- free((void *)t->tht_servicename);
- t->tht_servicename = strdup(v);
+ free((void *)t->tht_svcname);
+ t->tht_svcname = strdup(v);
v = config_get_str_sub(&ce->ce_sub, "channelname", NULL);
if(v != NULL) {
- free((void *)t->tht_channelname);
- t->tht_channelname = strdup(v);
+ free((void *)t->tht_chname);
+ t->tht_chname = strdup(v);
} else {
- t->tht_channelname = strdup(t->tht_servicename);
+ t->tht_chname = strdup(t->tht_svcname);
}
psi_load_transport(&ce->ce_sub, t);
if(atoi(config_get_str_sub(&ce->ce_sub, "mapped", "0"))) {
- transport_map_channel(t);
+ transport_map_channel(t, NULL);
}
}
config_free0(&cl);
@@ -738,14 +738,14 @@ dvb_tda_clone(th_dvb_adapter_t *dst, th_dvb_adapter_t *src)
if(t_src->tht_provider != NULL)
t_dst->tht_provider = strdup(t_src->tht_provider);
- if(t_src->tht_servicename != NULL)
- t_dst->tht_servicename = strdup(t_src->tht_servicename);
+ if(t_src->tht_svcname != NULL)
+ t_dst->tht_svcname = strdup(t_src->tht_svcname);
- if(t_src->tht_channelname != NULL)
- t_dst->tht_channelname = strdup(t_src->tht_channelname);
+ if(t_src->tht_chname != NULL)
+ t_dst->tht_chname = strdup(t_src->tht_chname);
- if(t_src->tht_channel != NULL)
- transport_map_channel(t_dst);
+ if(t_src->tht_ch != NULL)
+ transport_map_channel(t_dst, t_src->tht_ch);
diff --git a/dvb_tables.c b/dvb_tables.c
index 08b6bd8d..f979cdb5 100644
--- a/dvb_tables.c
+++ b/dvb_tables.c
@@ -255,7 +255,7 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
if(t == NULL)
return;
- ch = t->tht_channel;
+ ch = t->tht_ch;
if(ch == NULL)
return;
@@ -410,7 +410,7 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
t->tht_servicetype != stype ||
t->tht_scrambled != free_ca_mode ||
strcmp(t->tht_provider ?: "", provider) ||
- strcmp(t->tht_servicename ?: "", chname );
+ strcmp(t->tht_svcname ?: "", chname );
t->tht_servicetype = stype;
t->tht_scrambled = free_ca_mode;
@@ -418,11 +418,11 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
free((void *)t->tht_provider);
t->tht_provider = strdup(provider);
- free((void *)t->tht_servicename);
- t->tht_servicename = strdup(chname);
+ free((void *)t->tht_svcname);
+ t->tht_svcname = strdup(chname);
- if(t->tht_channelname == NULL)
- t->tht_channelname = strdup(chname);
+ if(t->tht_chname == NULL)
+ t->tht_chname = strdup(chname);
}
break;
}
diff --git a/file_input.c b/file_input.c
index 752339d4..eb1fb7eb 100644
--- a/file_input.c
+++ b/file_input.c
@@ -156,8 +156,7 @@ file_input_init(void)
t->tht_provider = strdup("HTS Tvheadend");
t->tht_identifier = strdup(ch->ch_name);
t->tht_file_input = fi;
- t->tht_servicename = strdup(ch->ch_name);
- transport_map_channel(t);
+ transport_map_channel(t, ch);
}
}
diff --git a/iptv_input.c b/iptv_input.c
index 56aafc3d..b80e4bf0 100644
--- a/iptv_input.c
+++ b/iptv_input.c
@@ -236,7 +236,7 @@ iptv_configure_transport(th_transport_t *t, const char *iptv_type,
inet_ntoa(t->tht_iptv_group_addr), t->tht_iptv_port);
t->tht_identifier = strdup(buf);
- t->tht_channelname = strdup(channel_name);
+ t->tht_chname = strdup(channel_name);
LIST_INSERT_HEAD(&iptv_probing_transports, t, tht_active_link);
startupcounter++;
@@ -278,7 +278,7 @@ iptv_probe_done(th_transport_t *t, int timeout)
iptv_stop_feed(t);
if(!timeout)
- transport_map_channel(t);
+ transport_map_channel(t, NULL);
else
LIST_INSERT_HEAD(&iptv_stale_transports, t, tht_active_link);
diff --git a/serviceprobe.c b/serviceprobe.c
index 8e7262ca..8c06a9e2 100644
--- a/serviceprobe.c
+++ b/serviceprobe.c
@@ -84,6 +84,7 @@ sp_timeout(void *aux, int64_t now)
sp_t *sp = aux;
th_transport_t *t = sp->sp_s->ths_transport;
const char *errtxt;
+ channel_t *ch;
switch(sp->sp_error) {
case 0:
@@ -103,11 +104,13 @@ sp_timeout(void *aux, int64_t now)
break;
}
- syslog(LOG_INFO, "Probed \"%s\" -- %s\n", t->tht_servicename, errtxt);
+ syslog(LOG_INFO, "Probed \"%s\" -- %s\n", t->tht_svcname, errtxt);
if(sp->sp_error == 0) {
- if(t->tht_channel == NULL && t->tht_servicename != NULL) {
- transport_map_channel(t);
+ if(t->tht_ch == NULL && t->tht_svcname != NULL) {
+ ch = channel_find(t->tht_svcname, 1, NULL);
+ transport_map_channel(t, ch);
+
t->tht_config_change(t);
}
}
diff --git a/teletext.c b/teletext.c
index d729c855..86b243da 100644
--- a/teletext.c
+++ b/teletext.c
@@ -180,7 +180,7 @@ tt_decode_line(th_transport_t *t, uint8_t *buf)
uint8_t mpag, line, s12, s34, c;
int page, magidx, i;
tt_mag_t *mag;
- channel_t *ch = t->tht_channel;
+ channel_t *ch = t->tht_ch;
tt_decoder_t *ttd = &ch->ch_tt;
tt_page_t *ttp;
diff --git a/transports.c b/transports.c
index adeabd26..ee098f71 100644
--- a/transports.c
+++ b/transports.c
@@ -281,13 +281,13 @@ transport_find(channel_t *ch, unsigned int weight)
/* First, sort all transports in order */
- LIST_FOREACH(t, &ch->ch_transports, tht_channel_link)
+ LIST_FOREACH(t, &ch->ch_transports, tht_ch_link)
if(!t->tht_disabled)
cnt++;
vec = alloca(cnt * sizeof(th_transport_t *));
i = 0;
- LIST_FOREACH(t, &ch->ch_transports, tht_channel_link)
+ LIST_FOREACH(t, &ch->ch_transports, tht_ch_link)
if(!t->tht_disabled)
vec[i++] = t;
@@ -433,9 +433,9 @@ transport_destroy(th_transport_t *t)
free((void *)t->tht_name);
- if(t->tht_channel != NULL) {
- t->tht_channel = NULL;
- LIST_REMOVE(t, tht_channel_link);
+ if(t->tht_ch != NULL) {
+ t->tht_ch = NULL;
+ LIST_REMOVE(t, tht_ch_link);
}
LIST_REMOVE(t, tht_mux_link);
@@ -444,8 +444,8 @@ transport_destroy(th_transport_t *t)
transport_flush_subscribers(t);
free(t->tht_identifier);
- free(t->tht_servicename);
- free(t->tht_channelname);
+ free(t->tht_svcname);
+ free(t->tht_chname);
free(t->tht_provider);
while((st = LIST_FIRST(&t->tht_streams)) != NULL) {
@@ -524,19 +524,26 @@ transport_add_stream(th_transport_t *t, int pid, tv_streamtype_t type)
*
*/
void
-transport_map_channel(th_transport_t *t)
+transport_map_channel(th_transport_t *t, channel_t *ch)
{
- channel_t *ch = channel_find(t->tht_servicename, 1, NULL);
+ assert(t->tht_ch == NULL);
- assert(t->tht_channel == NULL);
+ if(ch == NULL) {
+ if(t->tht_chname == NULL)
+ return;
+ ch = channel_find(t->tht_chname, 1, NULL);
+ } else {
+ free(t->tht_chname);
+ t->tht_chname = strdup(ch->ch_name);
+ }
avgstat_init(&t->tht_cc_errors, 3600);
avgstat_init(&t->tht_rate, 10);
assert(t->tht_identifier != NULL);
- t->tht_channel = ch;
+ t->tht_ch = ch;
- LIST_INSERT_HEAD(&ch->ch_transports, t, tht_channel_link);
+ LIST_INSERT_HEAD(&ch->ch_transports, t, tht_ch_link);
}
/**
@@ -545,8 +552,8 @@ transport_map_channel(th_transport_t *t)
void
transport_unmap_channel(th_transport_t *t)
{
- t->tht_channel = NULL;
- LIST_REMOVE(t, tht_channel_link);
+ t->tht_ch = NULL;
+ LIST_REMOVE(t, tht_ch_link);
}
diff --git a/transports.h b/transports.h
index 24bf6f02..216fe18b 100644
--- a/transports.h
+++ b/transports.h
@@ -32,7 +32,7 @@ th_transport_t *transport_create(const char *identifier, int type,
th_transport_t *transport_find_by_identifier(const char *identifier);
-void transport_map_channel(th_transport_t *t);
+void transport_map_channel(th_transport_t *t, channel_t *ch);
void transport_unmap_channel(th_transport_t *t);
diff --git a/tvhead.h b/tvhead.h
index 381c2970..f1f95f40 100644
--- a/tvhead.h
+++ b/tvhead.h
@@ -418,9 +418,6 @@ typedef struct th_transport {
LIST_ENTRY(th_transport) tht_active_link;
- LIST_ENTRY(th_transport) tht_channel_link;
- struct channel *tht_channel;
-
LIST_HEAD(, th_subscription) tht_subscriptions;
int (*tht_start_feed)(struct th_transport *t, unsigned int weight,
@@ -474,8 +471,7 @@ typedef struct th_transport {
} u;
char *tht_identifier;
- char *tht_servicename;
- char *tht_channelname;
+ char *tht_svcname;
char *tht_provider;
enum {
@@ -508,6 +504,14 @@ typedef struct th_transport {
TAILQ_ENTRY(th_transport) tht_probe_link;
int tht_on_probe_queue;
+ /**
+ * Channel mapping
+ */
+
+ LIST_ENTRY(th_transport) tht_ch_link;
+ struct channel *tht_ch;
+ char *tht_chname;
+
} th_transport_t;
diff --git a/v4l.c b/v4l.c
index 88420fb6..25ef015d 100644
--- a/v4l.c
+++ b/v4l.c
@@ -97,9 +97,9 @@ v4l_configure_transport(th_transport_t *t, const char *muxname,
snprintf(buf, sizeof(buf), "analog_%u", t->tht_v4l_frequency);
t->tht_identifier = strdup(buf);
- t->tht_servicename = strdup(channel_name);
+ t->tht_chname = strdup(channel_name);
- transport_map_channel(t);
+ transport_map_channel(t, NULL);
return 0;
}