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;