From dc160b9e48ab09bb6cb8a719be6d9a495760a61e Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Fri, 1 Feb 2013 20:53:36 +0000 Subject: [PATCH] dvb: re-instate some of the form scanning code. Mux TSID and ONID can now be updated from other tables if, and only if, they values are not yet set. Values from the NIT will ALWAYS override existing values, as they're hopefully more reliable. --- src/dvb/dvb.h | 4 ++-- src/dvb/dvb_multiplex.c | 16 +++++++++++++--- src/dvb/dvb_tables.c | 18 +++++++++++------- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h index 28a9587d..50ce547a 100644 --- a/src/dvb/dvb.h +++ b/src/dvb/dvb.h @@ -429,9 +429,9 @@ th_dvb_mux_instance_t *dvb_mux_create(th_dvb_adapter_t *tda, void dvb_mux_set_networkname(th_dvb_mux_instance_t *tdmi, const char *name); -void dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid); +void dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid, int force); -void dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid); +void dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid, int force); void dvb_mux_set_enable(th_dvb_mux_instance_t *tdmi, int enabled); diff --git a/src/dvb/dvb_multiplex.c b/src/dvb/dvb_multiplex.c index 7f0eb0c3..7fd5e2c2 100644 --- a/src/dvb/dvb_multiplex.c +++ b/src/dvb/dvb_multiplex.c @@ -169,12 +169,14 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc, } if(tdmi != NULL) { + /* Update stuff ... */ int save = 0; char buf2[1024]; buf2[0] = 0; - if(tdmi_compare_conf(tda->tda_type, &tdmi->tdmi_conf, dmc)) { + if(tdmi->tdmi_adapter->tda_autodiscovery && + tdmi_compare_conf(tda->tda_type, &tdmi->tdmi_conf, dmc)) { #if DVB_API_VERSION >= 5 snprintf(buf2, sizeof(buf2), " ("); if (tdmi->tdmi_conf.dmc_fe_modulation != dmc->dmc_fe_modulation) @@ -861,10 +863,14 @@ dvb_mux_set_networkname(th_dvb_mux_instance_t *tdmi, const char *networkname) * */ void -dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid) +dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid, int force) { htsmsg_t *m; + if (!force) + if (tdmi->tdmi_transport_stream_id != 0xFFFF || tsid == 0xFFFF) + return; + tdmi->tdmi_transport_stream_id = tsid; dvb_mux_save(tdmi); @@ -879,10 +885,14 @@ dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid) * */ void -dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid) +dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid, int force) { htsmsg_t *m; + if (force) + if (tdmi->tdmi_network_id != 0 || onid == 0) + return; + tdmi->tdmi_network_id = onid; dvb_mux_save(tdmi); diff --git a/src/dvb/dvb_tables.c b/src/dvb/dvb_tables.c index 302c7b53..f3ddb560 100644 --- a/src/dvb/dvb_tables.c +++ b/src/dvb/dvb_tables.c @@ -342,6 +342,8 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, tsid = ptr[0] << 8 | ptr[1]; onid = ptr[5] << 8 | ptr[6]; if (tableid == 0x42) { + dvb_mux_set_tsid(tdmi, tsid, 0); + dvb_mux_set_onid(tdmi, onid, 0); if(tdmi->tdmi_transport_stream_id != tsid || tdmi->tdmi_network_id != onid) return -1; } else { @@ -504,6 +506,7 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, } tsid = (ptr[0] << 8) | ptr[1]; + dvb_mux_set_tsid(tdmi, tsid, 0); if (tdmi->tdmi_transport_stream_id != tsid) return -1; @@ -844,11 +847,11 @@ dvb_table_local_channel(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, t = dvb_service_find(tdmi, sid, 0, NULL); if(t != NULL) { - if(t->s_channel_number != chan) { - t->s_channel_number = chan; - t->s_config_save(t); - service_refresh_channel(t); - } + if(t->s_channel_number != chan) { + t->s_channel_number = chan; + t->s_config_save(t); + service_refresh_channel(t); + } } } ptr += 4; @@ -999,8 +1002,9 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, /* Search all muxes on adapter */ LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) - if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id == onid); - break; + if(tdmi->tdmi_transport_stream_id == tsid && + tdmi->tdmi_network_id == onid); + break; if(tdmi == NULL) continue;