diff --git a/ajaxui/ajaxui_config_dvb.c b/ajaxui/ajaxui_config_dvb.c index 28722e14..222b4183 100644 --- a/ajaxui/ajaxui_config_dvb.c +++ b/ajaxui/ajaxui_config_dvb.c @@ -498,6 +498,7 @@ ajax_adaptercreatemux(http_connection_t *hc, http_reply_t *hr, return HTTP_STATUS_NOT_FOUND; v = dvb_mux_create_str(tda, + "65535", http_arg_get(&hc->hc_req_args, "freq"), http_arg_get(&hc->hc_req_args, "symrate"), http_arg_get(&hc->hc_req_args, "const"), diff --git a/dvb.c b/dvb.c index 0164572f..f5560769 100644 Binary files a/dvb.c and b/dvb.c differ diff --git a/dvb.h b/dvb.h index 16db8e98..f47918b7 100644 --- a/dvb.h +++ b/dvb.h @@ -53,8 +53,10 @@ th_transport_t *dvb_find_transport(th_dvb_mux_instance_t *tdmi, th_dvb_mux_instance_t *dvb_mux_create(th_dvb_adapter_t *tda, struct dvb_frontend_parameters *fe_param, int polarisation, int switchport, - int save); + int save, uint16_t tsid); void dvb_tdmi_save(th_dvb_mux_instance_t *tdmi); +void dvb_tda_save(th_dvb_adapter_t *tda); + #endif /* DVB_H_ */ diff --git a/dvb_muxconfig.c b/dvb_muxconfig.c index bec16bea..cbafde35 100644 --- a/dvb_muxconfig.c +++ b/dvb_muxconfig.c @@ -98,6 +98,8 @@ dvb_mux_store(FILE *fp, th_dvb_mux_instance_t *tdmi) { struct dvb_frontend_parameters *f = tdmi->tdmi_fe_params; + fprintf(fp, "\ttransportstreamid = %d\n", tdmi->tdmi_transport_stream_id); + fprintf(fp, "\tfrequency = %d\n", f->frequency); switch(tdmi->tdmi_adapter->tda_fe_info->type) { @@ -156,6 +158,7 @@ dvb_mux_store(FILE *fp, th_dvb_mux_instance_t *tdmi) */ const char * dvb_mux_create_str(th_dvb_adapter_t *tda, + const char *tsidstr, const char *freqstr, const char *symratestr, const char *qamstr, @@ -173,7 +176,7 @@ dvb_mux_create_str(th_dvb_adapter_t *tda, struct dvb_frontend_parameters f; int r; int polarisation = 0, switchport = 0; - + memset(&f, 0, sizeof(f)); f.inversion = INVERSION_AUTO; @@ -247,7 +250,7 @@ dvb_mux_create_str(th_dvb_adapter_t *tda, break; } - dvb_mux_create(tda, &f, polarisation, switchport, save); + dvb_mux_create(tda, &f, polarisation, switchport, save, atoi(tsidstr)); return NULL; } diff --git a/dvb_muxconfig.h b/dvb_muxconfig.h index dcdd20fc..37d457dc 100644 --- a/dvb_muxconfig.h +++ b/dvb_muxconfig.h @@ -22,6 +22,7 @@ void dvb_mux_store(FILE *fp, th_dvb_mux_instance_t *tdmi); const char *dvb_mux_create_str(th_dvb_adapter_t *tda, + const char *tsidstr, const char *freqstr, const char *symratestr, const char *qamstr, diff --git a/dvb_tables.c b/dvb_tables.c index 469b4509..f2f331e3 100644 --- a/dvb_tables.c +++ b/dvb_tables.c @@ -202,6 +202,7 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, { th_transport_t *t; th_channel_t *ch; + th_dvb_adapter_t *tda = tdmi->tdmi_adapter; uint16_t serviceid; int version; @@ -224,6 +225,8 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, char desc[5000]; epg_content_type_t *ect; + // printf("EIT!, tid = %x\n", tableid); + if(tableid < 0x4e || tableid > 0x6f || len < 11) return; @@ -240,6 +243,14 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, len -= 11; ptr += 11; + /* Search all muxes on adapter */ + LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) + if(tdmi->tdmi_transport_stream_id == transport_stream_id) + break; + + if(tdmi == NULL) + return; + t = dvb_find_transport(tdmi, serviceid, 0, NULL); if(t == NULL) return; @@ -445,6 +456,11 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, tid = (ptr[0] << 8) | ptr[1]; + if(tdmi->tdmi_transport_stream_id != tid) { + tdmi->tdmi_transport_stream_id = tid; + dvb_tda_save(tdmi->tdmi_adapter); + } + ptr += 5; len -= 5; @@ -514,7 +530,8 @@ static const fe_modulation_t qam_tab [6] = { * Cable delivery descriptor */ static void -dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len) +dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, + uint16_t tsid) { int freq, symrate; struct dvb_frontend_parameters fe_param; @@ -546,14 +563,15 @@ dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len) fe_param.u.qam.fec_inner = fec_tab[ptr[10] & 0x07]; - dvb_mux_create(tdmi->tdmi_adapter, &fe_param, 0, 0, 1); + dvb_mux_create(tdmi->tdmi_adapter, &fe_param, 0, 0, 1, tsid); } /** * Satellite delivery descriptor */ static void -dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len) +dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, + uint16_t tsid) { int freq, symrate, pol; struct dvb_frontend_parameters fe_param; @@ -578,7 +596,8 @@ dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len) pol = (ptr[6] >> 5) & 0x03; - dvb_mux_create(tdmi->tdmi_adapter, &fe_param, pol, tdmi->tdmi_switchport, 1); + dvb_mux_create(tdmi->tdmi_adapter, &fe_param, pol, tdmi->tdmi_switchport, 1, + tsid); } @@ -658,10 +677,10 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, switch(tag) { case DVB_DESC_SAT: - dvb_table_sat_delivery(tdmi, ptr, tlen); + dvb_table_sat_delivery(tdmi, ptr, tlen, tsid); break; case DVB_DESC_CABLE: - dvb_table_cable_delivery(tdmi, ptr, tlen); + dvb_table_cable_delivery(tdmi, ptr, tlen, tsid); break; }