TAILQ_HEAD(th_dvb_mux_instance_queue, th_dvb_mux_instance);
LIST_HEAD(th_dvb_mux_instance_list, th_dvb_mux_instance);
TAILQ_HEAD(dvb_satconf_queue, dvb_satconf);
-
+LIST_HEAD(dvb_mux_list, dvb_mux);
/**
* Satconf
char *sc_comment;
char *sc_lnb;
- struct th_dvb_mux_instance_list sc_tdmis;
-
} dvb_satconf_t;
-
enum polarisation {
POLARISATION_HORIZONTAL = 0x00,
POLARISATION_VERTICAL = 0x01,
typedef struct dvb_mux_conf {
dvb_frontend_parameters_t dmc_fe_params;
int dmc_polarisation;
- dvb_satconf_t *dmc_satconf;
+ // dvb_satconf_t *dmc_satconf;
#if DVB_API_VERSION >= 5
fe_modulation_t dmc_fe_modulation;
fe_delivery_system_t dmc_fe_delsys;
} dvb_mux_conf_t;
+
+/**
+ *
+ */
+typedef struct dvb_network {
+
+ struct th_dvb_mux_instance_list dn_mux_instances; // Should go away
+
+ struct th_dvb_mux_instance_queue dn_initial_scan_queue;
+ int dn_initial_num_mux;
+
+ struct th_dvb_mux_instance *dn_mux_epg;
+
+ int dn_fe_type; // Frontend types for this network (FE_QPSK, etc)
+
+ // struct dvb_mux_list dn_muxes;
+
+} dvb_network_t;
+
+
+
+/**
+ *
+ */
+typedef struct dvb_mux {
+
+ // LIST_ENTRY(dvb_mux) dm_network_link;
+ dvb_network_t *dm_network;
+
+ struct service_list dm_services;
+
+ dvb_mux_conf_t dm_conf;
+
+} dvb_mux_t;
+
+
+
+
/**
* DVB Mux instance
*/
typedef struct th_dvb_mux_instance {
+ dvb_mux_t *tdmi_mux;
+
RB_ENTRY(th_dvb_mux_instance) tdmi_global_link;
- LIST_ENTRY(th_dvb_mux_instance) tdmi_adapter_link;
+ LIST_ENTRY(th_dvb_mux_instance) tdmi_adapter_link; // wrong
struct th_dvb_adapter *tdmi_adapter;
int tdmi_enabled;
- dvb_mux_conf_t tdmi_conf;
-
/* Linked if tdmi_conf.dmc_satconf != NULL */
LIST_ENTRY(th_dvb_mux_instance) tdmi_satconf_link;
char *tdmi_default_authority;
- struct service_list tdmi_transports; /* via s_mux_link */
-
TAILQ_ENTRY(th_dvb_mux_instance) tdmi_scan_link;
struct th_dvb_mux_instance_queue *tdmi_scan_queue;
+
/**
* When in raw mode we need to enqueue raw TS packet
* to a different thread because we need to hold
-/**
- *
- */
-typedef struct dvb_network {
-
- struct th_dvb_mux_instance_list dn_muxes;
-
- struct th_dvb_mux_instance_queue dn_initial_scan_queue;
- int dn_initial_num_mux;
-
- th_dvb_mux_instance_t *dn_mux_epg;
-
-} dvb_network_t;
-
/**
* DVB Adapter (one of these per physical adapter)
int32_t tda_full_mux_rx;
char *tda_displayname;
- int tda_type;
+ int tda_fe_type;
struct dvb_frontend_info *tda_fe_info; // result of FE_GET_INFO ioctl()
char *tda_fe_path;
const struct dvb_mux_conf *dmc,
uint16_t onid, uint16_t tsid, const char *network,
const char *logprefix, int enabled,
- int initialscan, const char *identifier,
- dvb_satconf_t *satconf);
+ int initialscan, const char *identifier);
void dvb_mux_set_networkname(th_dvb_mux_instance_t *tdmi, const char *name);
int fec,
int polarisation,
const char *satconf);
-
+#if 0
int dvb_mux_copy(th_dvb_adapter_t *dst, th_dvb_mux_instance_t *tdmi_src,
dvb_satconf_t *satconf);
+#endif
th_dvb_mux_instance_t *dvb_mux_find
(th_dvb_adapter_t *tda, const char *netname, uint16_t onid, uint16_t tsid,
lock_assert(&global_lock);
- htsmsg_add_str(m, "type", dvb_adaptertype_to_str(tda->tda_type));
+ htsmsg_add_str(m, "type", dvb_adaptertype_to_str(tda->tda_fe_type));
htsmsg_add_str(m, "displayname", tda->tda_displayname);
htsmsg_add_u32(m, "autodiscovery", tda->tda_autodiscovery);
htsmsg_add_u32(m, "idleclose", tda->tda_idleclose);
else
close(fe);
- tda->tda_type = tda->tda_fe_info->type;
+ tda->tda_fe_type = tda->tda_fe_info->type;
+ tda->tda_dn->dn_fe_type = tda->tda_fe_type;
snprintf(buf, sizeof(buf), "%s_%s", tda->tda_rootpath,
tda->tda_fe_info->name);
tda->tda_identifier = strdup(buf);
- tda->tda_autodiscovery = tda->tda_type != FE_QPSK;
+ tda->tda_autodiscovery = tda->tda_fe_type != FE_QPSK;
- tda->tda_sat = tda->tda_type == FE_QPSK;
+ tda->tda_sat = tda->tda_fe_type == FE_QPSK;
/* Come up with an initial displayname, user can change it and it will
be overridden by any stored settings later on */
tda->tda_fe_fd = -1;
tda->tda_dvr_pipe[0] = -1;
- tda->tda_type = -1;
+ tda->tda_fe_type = -1;
snprintf(buf, sizeof(buf), "%s", filename);
*/
static void tda_init_input (th_dvb_adapter_t *tda)
{
- if(tda->tda_type == -1 || check_full_stream(tda)) {
+ if(tda->tda_fe_type == -1 || check_full_stream(tda)) {
tvhlog(LOG_INFO, "dvb", "Adapter %s will run in full mux mode", tda->tda_rootpath);
dvb_input_raw_setup(tda);
} else {
/* Not discovered by hardware, create it */
tda = tda_alloc();
tda->tda_identifier = strdup(f->hmf_name);
- tda->tda_type = type;
+ tda->tda_fe_type = type;
TAILQ_INSERT_TAIL(&dvb_adapters, tda, tda_global_link);
} else {
- if(type != tda->tda_type)
+ if(type != tda->tda_fe_type)
continue; /* Something is wrong, ignore */
}
gtimer_arm(&tda->tda_mux_scanner_timer, dvb_adapter_mux_scanner, tda, 20);
/* No muxes */
- if(LIST_FIRST(&tda->tda_dn->dn_muxes) == NULL) {
+ if(LIST_FIRST(&tda->tda_dn->dn_mux_instances) == NULL) {
dvb_adapter_poweroff(tda);
return;
}
void
dvb_adapter_clone(th_dvb_adapter_t *dst, th_dvb_adapter_t *src)
{
+#if 0
th_dvb_mux_instance_t *tdmi_src, *tdmi_dst;
lock_assert(&global_lock);
- while((tdmi_dst = LIST_FIRST(&dst->tda_dn->dn_muxes)) != NULL)
+ while((tdmi_dst = LIST_FIRST(&dst->tda_dn->dn_mux_instances)) != NULL)
dvb_mux_destroy(tdmi_dst);
- LIST_FOREACH(tdmi_src, &src->tda_dn->dn_muxes, tdmi_adapter_link)
- dvb_mux_copy(dst, tdmi_src, NULL);
-
tda_save(dst);
+#endif
+ abort(); // XXX(dvbreorg)
}
hts_settings_remove("dvbadapters/%s", tda->tda_identifier);
- while((tdmi = LIST_FIRST(&tda->tda_dn->dn_muxes)) != NULL)
+ while((tdmi = LIST_FIRST(&tda->tda_dn->dn_mux_instances)) != NULL)
dvb_mux_destroy(tdmi);
TAILQ_REMOVE(&dvb_adapters, tda, tda_global_link);
htsmsg_add_str(m, "name", tda->tda_displayname);
// XXX: bad bad bad slow slow slow
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) {
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link) {
nummux++;
- LIST_FOREACH(t, &tdmi->tdmi_transports, s_group_link) {
+ LIST_FOREACH(t, &tdmi->tdmi_mux->dm_services, s_group_link) {
numsvc++;
}
}
htsmsg_add_str(m, "devicename", tda->tda_fe_info->name);
htsmsg_add_str(m, "deliverySystem",
- dvb_adaptertype_to_str(tda->tda_type) ?: "");
+ dvb_adaptertype_to_str(tda->tda_fe_type) ?: "");
htsmsg_add_u32(m, "satConf", tda->tda_sat);
- fdiv = tda->tda_type == FE_QPSK ? 1 : 1000;
+ fdiv = tda->tda_fe_type == FE_QPSK ? 1 : 1000;
htsmsg_add_u32(m, "freqMin", tda->tda_fe_info->frequency_min / fdiv);
htsmsg_add_u32(m, "freqMax", tda->tda_fe_info->frequency_max / fdiv);
{
if (tda->tda_fe_fd == -1) return;
lock_assert(&global_lock);
- if (!tda->tda_poweroff || tda->tda_type != FE_QPSK)
+ if (!tda->tda_poweroff || tda->tda_fe_type != FE_QPSK)
return;
diseqc_voltage_off(tda->tda_fe_fd);
tvhlog(LOG_DEBUG, "dvb", "\"%s\" is off", tda->tda_rootpath);
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
// copy dmc, cause frequency may be change with FE_QPSK
- dvb_mux_conf_t dmc = tdmi->tdmi_conf;
+ const dvb_mux_t *dm = tdmi->tdmi_mux;
+ dvb_mux_conf_t dmc = dm->dm_conf;
dvb_frontend_parameters_t* p = &dmc.dmc_fe_params;
char buf[256];
else
dvb_adapter_start(tda);
- if(tda->tda_type == FE_QPSK) {
+ if(tda->tda_fe_type == FE_QPSK) {
/* DVB-S */
- dvb_satconf_t *sc;
int port, lowfreq, hifreq, switchfreq, hiband, pol, dbsbs;
lowfreq = 9750000;
switchfreq = 11700000;
port = 0;
dbsbs = 0;
-
- if((sc = tdmi->tdmi_conf.dmc_satconf) != NULL) {
+#if 0
+ dvb_satconf_t *sc;
+ if((sc = dm->dm_conf.dmc_satconf) != NULL) {
port = sc->sc_port;
if(sc->sc_lnb != NULL)
if(!strcmp(sc->sc_id ?: "", "DBS Bandstacked"))
dbsbs = 1;
}
+#endif
if(dbsbs) {
hiband = 0;
- if(tdmi->tdmi_conf.dmc_polarisation == POLARISATION_HORIZONTAL ||
- tdmi->tdmi_conf.dmc_polarisation == POLARISATION_CIRCULAR_LEFT)
+ if(dm->dm_conf.dmc_polarisation == POLARISATION_HORIZONTAL ||
+ dm->dm_conf.dmc_polarisation == POLARISATION_CIRCULAR_LEFT)
p->frequency = abs(p->frequency - hifreq);
else
p->frequency = abs(p->frequency - lowfreq);
pol = POLARISATION_CIRCULAR_LEFT;
} else {
hiband = switchfreq && p->frequency > switchfreq;
- pol = tdmi->tdmi_conf.dmc_polarisation;
+ pol = dm->dm_conf.dmc_polarisation;
if(hiband)
p->frequency = abs(p->frequency - hifreq);
else
#if DVB_API_VERSION >= 5
- if (tda->tda_type == FE_QPSK) {
+ if (tda->tda_fe_type == FE_QPSK) {
tvhlog(LOG_DEBUG, "dvb", "\"%s\" tuning via s2api to \"%s\" (%d, %d Baud, "
"%s, %s, %s) for %s", tda->tda_rootpath, buf, p->frequency, p->u.qpsk.symbol_rate,
dvb_mux_fec2str(p->u.qpsk.fec_inner), dvb_mux_delsys2str(dmc.dmc_fe_delsys),
- (int32_t)b->dmc_fe_params.frequency;
fd = labs(fd);
return fd < 2000 &&
- a->dmc_polarisation == b->dmc_polarisation &&
- a->dmc_satconf == b->dmc_satconf;
+ a->dmc_polarisation == b->dmc_polarisation;
}
th_dvb_mux_instance_t *
dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
uint16_t onid, uint16_t tsid, const char *network, const char *source,
- int enabled, int initialscan, const char *identifier,
- dvb_satconf_t *satconf)
+ int enabled, int initialscan, const char *identifier)
{
th_dvb_mux_instance_t *tdmi, *c;
char buf[200];
lock_assert(&global_lock);
/* HACK - we hash/compare based on 2KHz spacing and compare on +/-500Hz */
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) {
- if(tdmi_compare_key(&tdmi->tdmi_conf, dmc))
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link) {
+ if(tdmi_compare_key(&tdmi->tdmi_mux->dm_conf, dmc))
break; /* Mux already exist */
}
char buf2[1024];
buf2[0] = 0;
- if(tdmi_compare_conf(tda->tda_type, &tdmi->tdmi_conf, dmc)) {
+ if(tdmi_compare_conf(tda->tda_fe_type, &tdmi->tdmi_mux->dm_conf, dmc)) {
#if DVB_API_VERSION >= 5
snprintf(buf2, sizeof(buf2), " (");
- if (tdmi->tdmi_conf.dmc_fe_modulation != dmc->dmc_fe_modulation)
+ if (tdmi->tdmi_mux->dm_conf.dmc_fe_modulation != dmc->dmc_fe_modulation)
sprintf(buf2, "%s %s->%s, ", buf2,
- dvb_mux_qam2str(tdmi->tdmi_conf.dmc_fe_modulation),
+ dvb_mux_qam2str(tdmi->tdmi_mux->dm_conf.dmc_fe_modulation),
dvb_mux_qam2str(dmc->dmc_fe_modulation));
- if (tdmi->tdmi_conf.dmc_fe_delsys != dmc->dmc_fe_delsys)
+ if (tdmi->tdmi_mux->dm_conf.dmc_fe_delsys != dmc->dmc_fe_delsys)
sprintf(buf2, "%s %s->%s, ", buf2,
- dvb_mux_delsys2str(tdmi->tdmi_conf.dmc_fe_delsys),
+ dvb_mux_delsys2str(tdmi->tdmi_mux->dm_conf.dmc_fe_delsys),
dvb_mux_delsys2str(dmc->dmc_fe_delsys));
- if (tdmi->tdmi_conf.dmc_fe_rolloff != dmc->dmc_fe_rolloff)
+ if (tdmi->tdmi_mux->dm_conf.dmc_fe_rolloff != dmc->dmc_fe_rolloff)
sprintf(buf2, "%s %s->%s, ", buf2,
- dvb_mux_rolloff2str(tdmi->tdmi_conf.dmc_fe_rolloff),
+ dvb_mux_rolloff2str(tdmi->tdmi_mux->dm_conf.dmc_fe_rolloff),
dvb_mux_rolloff2str(dmc->dmc_fe_rolloff));
sprintf(buf2, "%s)", buf2);
#endif
- memcpy(&tdmi->tdmi_conf, dmc, sizeof(struct dvb_mux_conf));
+ memcpy(&tdmi->tdmi_mux->dm_conf, dmc, sizeof(struct dvb_mux_conf));
save = 1;
}
tdmi = calloc(1, sizeof(th_dvb_mux_instance_t));
+ tdmi->tdmi_mux = calloc(1, sizeof(dvb_mux_t));
+
+ tdmi->tdmi_mux->dm_network = tda->tda_dn;
+
if(identifier == NULL) {
char qpsktxt[20];
else
qpsktxt[0] = 0;
- snprintf(buf, sizeof(buf), "%s%d%s%s%s",
- tda->tda_identifier, dmc->dmc_fe_params.frequency, qpsktxt,
- (satconf || dmc->dmc_satconf) ? "_satconf_" : "",
- (satconf ? satconf->sc_id :
- (dmc->dmc_satconf ? dmc->dmc_satconf->sc_id : "")));
-
+ snprintf(buf, sizeof(buf), "%s%d%s",
+ tda->tda_identifier, dmc->dmc_fe_params.frequency, qpsktxt);
tdmi->tdmi_identifier = strdup(buf);
} else {
tdmi->tdmi_identifier = strdup(identifier);
tdmi->tdmi_network = network ? strdup(network) : NULL;
tdmi->tdmi_quality = 100;
- memcpy(&tdmi->tdmi_conf, dmc, sizeof(struct dvb_mux_conf));
- if(satconf)
- tdmi->tdmi_conf.dmc_satconf = satconf;
- if(tdmi->tdmi_conf.dmc_satconf != NULL) {
- LIST_INSERT_HEAD(&tdmi->tdmi_conf.dmc_satconf->sc_tdmis,
- tdmi, tdmi_satconf_link);
- }
+ memcpy(&tdmi->tdmi_mux->dm_conf, dmc, sizeof(struct dvb_mux_conf));
- LIST_INSERT_HEAD(&tda->tda_dn->dn_muxes, tdmi, tdmi_adapter_link);
+ LIST_INSERT_HEAD(&tda->tda_dn->dn_mux_instances, tdmi, tdmi_adapter_link);
tdmi->tdmi_table_initial = initialscan;
if(source != NULL) {
hts_settings_remove("dvbmuxes/%s/%s",
tda->tda_identifier, tdmi->tdmi_identifier);
- while((t = LIST_FIRST(&tdmi->tdmi_transports)) != NULL) {
+ while((t = LIST_FIRST(&tdmi->tdmi_mux->dm_services)) != NULL) {
hts_settings_remove("dvbtransports/%s/%s",
t->s_dvb_mux_instance->tdmi_identifier,
t->s_identifier);
if(tda->tda_mux_current == tdmi)
dvb_fe_stop(tda->tda_mux_current, 0);
- if(tdmi->tdmi_conf.dmc_satconf != NULL)
- LIST_REMOVE(tdmi, tdmi_satconf_link);
-
RB_REMOVE(&dvb_muxes, tdmi, tdmi_global_link);
LIST_REMOVE(tdmi, tdmi_adapter_link);
void
dvb_mux_save(th_dvb_mux_instance_t *tdmi)
{
- struct dvb_frontend_parameters *f = &tdmi->tdmi_conf.dmc_fe_params;
+ const dvb_mux_conf_t *dmc = &tdmi->tdmi_mux->dm_conf;
+ const struct dvb_frontend_parameters *f = &dmc->dmc_fe_params;
htsmsg_t *m = htsmsg_create_map();
if(tdmi->tdmi_default_authority)
htsmsg_add_str(m, "default_authority", tdmi->tdmi_default_authority);
- switch(tdmi->tdmi_adapter->tda_type) {
+ switch(tdmi->tdmi_adapter->tda_fe_type) {
case FE_OFDM:
htsmsg_add_str(m, "bandwidth",
val2str(f->u.ofdm.bandwidth, bwtab));
val2str(f->u.qpsk.fec_inner, fectab));
htsmsg_add_str(m, "polarisation",
- val2str(tdmi->tdmi_conf.dmc_polarisation, poltab));
+ val2str(dmc->dmc_polarisation, poltab));
#if DVB_API_VERSION >= 5
htsmsg_add_str(m, "modulation",
- val2str(tdmi->tdmi_conf.dmc_fe_modulation, qamtab));
+ val2str(dmc->dmc_fe_modulation, qamtab));
htsmsg_add_str(m, "delivery_system",
- val2str(tdmi->tdmi_conf.dmc_fe_delsys, delsystab));
+ val2str(dmc->dmc_fe_delsys, delsystab));
htsmsg_add_str(m, "rolloff",
- val2str(tdmi->tdmi_conf.dmc_fe_rolloff, rollofftab));
+ val2str(dmc->dmc_fe_rolloff, rollofftab));
#endif
break;
break;
}
- if(tdmi->tdmi_conf.dmc_satconf != NULL)
- htsmsg_add_str(m, "satconf", tdmi->tdmi_conf.dmc_satconf->sc_id);
-
- hts_settings_save(m, "dvbmuxes/%s/%s",
+ hts_settings_save(m, "dvbmuxes/%s/%s",
tdmi->tdmi_adapter->tda_identifier, tdmi->tdmi_identifier);
htsmsg_destroy(m);
}
htsmsg_get_u32(m, "frequency", &dmc.dmc_fe_params.frequency);
- switch(tda->tda_type) {
+ switch(tda->tda_fe_type) {
case FE_OFDM:
s = htsmsg_get_str(m, "bandwidth");
if(s == NULL || (r = str2val(s, bwtab)) < 0)
if(htsmsg_get_u32(m, "enabled", &enabled))
enabled = 1;
- if((s = htsmsg_get_str(m, "satconf")) != NULL)
- dmc.dmc_satconf = dvb_satconf_entry_find(tda, s, 0);
- else
- dmc.dmc_satconf = NULL;
-
initscan = htsmsg_get_u32_or_default(m, "initialscan", 0);
tdmi = dvb_mux_create(tda, &dmc,
onid, tsid, htsmsg_get_str(m, "network"), NULL, enabled,
initscan,
- identifier, NULL);
+ identifier);
if(tdmi != NULL) {
if((s = htsmsg_get_str(m, "status")) != NULL)
static void
dvb_mux_modulation(char *buf, size_t size, th_dvb_mux_instance_t *tdmi)
{
- struct dvb_frontend_parameters *f = &tdmi->tdmi_conf.dmc_fe_params;
+ const dvb_mux_conf_t *dmc = &tdmi->tdmi_mux->dm_conf;
+ const struct dvb_frontend_parameters *f = &dmc->dmc_fe_params;
- switch(tdmi->tdmi_adapter->tda_type) {
+ switch(tdmi->tdmi_adapter->tda_fe_type) {
case FE_OFDM:
snprintf(buf, size, "%s, %s, %s-mode",
val2str(f->u.ofdm.constellation, qamtab),
case FE_QPSK:
#if DVB_API_VERSION >= 5
snprintf(buf, size, "%d kBaud, %s, %s", f->u.qpsk.symbol_rate / 1000,
- val2str(tdmi->tdmi_conf.dmc_fe_delsys, delsystab),
- val2str(tdmi->tdmi_conf.dmc_fe_modulation, qamtab));
+ val2str(dmc->dmc_fe_delsys, delsystab),
+ val2str(dmc->dmc_fe_modulation, qamtab));
#else
snprintf(buf, size, "%d kBaud", f->u.qpsk.symbol_rate / 1000);
#endif
htsmsg_add_u32(m, "enabled", tdmi->tdmi_enabled);
htsmsg_add_str(m, "network", tdmi->tdmi_network ?: "");
- dvb_mux_nicefreq(buf, sizeof(buf), tdmi);
+ dvb_mux_nicefreq(buf, sizeof(buf), tdmi->tdmi_mux);
htsmsg_add_str(m, "freq", buf);
dvb_mux_modulation(buf, sizeof(buf), tdmi);
dvb_mux_fe_status(buf, sizeof(buf), tdmi);
htsmsg_add_str(m, "fe_status", buf);
- htsmsg_add_str(m, "pol",
- dvb_polarisation_to_str_long(tdmi->tdmi_conf.dmc_polarisation));
+ const dvb_mux_conf_t *dmc = &tdmi->tdmi_mux->dm_conf;
+
- if(tdmi->tdmi_conf.dmc_satconf != NULL)
- htsmsg_add_str(m, "satconf", tdmi->tdmi_conf.dmc_satconf->sc_id);
+ htsmsg_add_str(m, "pol",
+ dvb_polarisation_to_str_long(dmc->dmc_polarisation));
if(tdmi->tdmi_transport_stream_id != 0xffff)
htsmsg_add_u32(m, "muxid", tdmi->tdmi_transport_stream_id);
memset(&dmc, 0, sizeof(dmc));
dmc.dmc_fe_params.inversion = INVERSION_AUTO;
- switch(tda->tda_type) {
+ switch(tda->tda_fe_type) {
case FE_OFDM:
dmc.dmc_fe_params.frequency = freq * 1000;
if(!val2str(bw, bwtab))
}
- if(satconf != NULL) {
- dmc.dmc_satconf = dvb_satconf_entry_find(tda, satconf, 0);
- if(dmc.dmc_satconf == NULL)
- return "Satellite configuration not found";
- } else {
- dmc.dmc_satconf = NULL;
- }
dmc.dmc_polarisation = polarisation;
- tdmi = dvb_mux_create(tda, &dmc, 0, 0xffff, NULL, NULL, 1, 1, NULL, NULL);
+ tdmi = dvb_mux_create(tda, &dmc, 0, 0xffff, NULL, NULL, 1, 1, NULL);
if(tdmi == NULL)
return "Mux already exist";
return NULL;
}
-
+#if 0
/**
*
*/
if(tdmi_dst == NULL)
return -1; // Already exist
- LIST_FOREACH(t_src, &tdmi_src->tdmi_transports, s_group_link) {
+ LIST_FOREACH(t_src, &tdmi_src->tdmi_mux->dm_services, s_group_link) {
t_dst = dvb_service_find(tdmi_dst,
t_src->s_dvb_service_id,
t_src->s_pmt_pid, NULL);
dvb_mux_save(tdmi_dst);
return 0;
}
+#endif
th_dvb_mux_instance_t *dvb_mux_find
( th_dvb_adapter_t *tda, const char *netname, uint16_t onid, uint16_t tsid,
{
th_dvb_mux_instance_t *tdmi;
if (tda) {
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) {
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link) {
if (enabled && !tdmi->tdmi_enabled) continue;
if (onid && onid != tdmi->tdmi_network_id) continue;
if (tsid && tsid != tdmi->tdmi_transport_stream_id) continue;
*/
static void
dvb_mux_preconf_add(th_dvb_adapter_t *tda, const network_t *net,
- const char *source, const char *satconf)
+ const char *source)
{
const mux_t *m;
struct dvb_mux_conf dmc;
dmc.dmc_fe_params.inversion = INVERSION_AUTO;
dmc.dmc_fe_params.frequency = m->freq;
- switch(tda->tda_type) {
+ switch(tda->tda_fe_type) {
case FE_OFDM:
dmc.dmc_fe_params.u.ofdm.bandwidth = m->bw;
dmc.dmc_fe_params.u.ofdm.constellation = m->constellation;
break;
}
- dmc.dmc_satconf = dvb_satconf_entry_find(tda, satconf, 0);
-
- dvb_mux_create(tda, &dmc, 0, 0xffff, NULL, source, 1, 1, NULL, NULL);
+ dvb_mux_create(tda, &dmc, 0, 0xffff, NULL, source, 1, 1, NULL);
}
}
*
*/
int
-dvb_mux_preconf_add_network(th_dvb_adapter_t *tda, const char *id,
- const char *satconf)
+dvb_mux_preconf_add_network(th_dvb_adapter_t *tda, const char *id)
{
region_list_t *list;
const region_t *r;
snprintf(source, sizeof(source), "built-in configuration from \"%s\"", id);
- switch(tda->tda_type) {
+ switch(tda->tda_fe_type) {
case FE_QAM:
list = ®ions_DVBC;
break;
LIST_FOREACH(r, list, link) {
LIST_FOREACH(n, &r->networks, link) {
if(!strcmp(n->id, id)) {
- dvb_mux_preconf_add(tda, n, source, satconf);
+ dvb_mux_preconf_add(tda, n, source);
break;
}
}
htsmsg_t *dvb_mux_preconf_get_node(int fetype, const char *node);
-int dvb_mux_preconf_add_network(th_dvb_adapter_t *tda, const char *id,
- const char *satconf);
+int dvb_mux_preconf_add_network(th_dvb_adapter_t *tda, const char *id);
#endif /* DVB_MUXCONFIG_H */
static void
satconf_destroy(th_dvb_adapter_t *tda, dvb_satconf_t *sc)
{
- th_dvb_mux_instance_t *tdmi;
-
- while((tdmi = LIST_FIRST(&sc->sc_tdmis)) != NULL) {
- tdmi->tdmi_conf.dmc_satconf = NULL;
- LIST_REMOVE(tdmi, tdmi_satconf_link);
- }
-
- TAILQ_REMOVE(&tda->tda_satconfs, sc, sc_adapter_link);
+ TAILQ_REMOVE(&tda->tda_satconfs, sc, sc_adapter_link);
free(sc->sc_id);
free(sc->sc_name);
free(sc->sc_comment);
{
service_t *svc;
if (tdmi) {
- LIST_FOREACH(svc, &tdmi->tdmi_transports, s_group_link) {
+ LIST_FOREACH(svc, &tdmi->tdmi_mux->dm_services, s_group_link) {
if (enabled && !svc->s_enabled) continue;
if (epgprimary && !service_is_primary_epg(svc)) continue;
if (sid == svc->s_dvb_service_id) return svc;
}
} else if (tda) {
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) {
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link) {
if (enabled && !tdmi->tdmi_enabled) continue;
if (onid && onid != tdmi->tdmi_network_id) continue;
if (tsid && tsid != tdmi->tdmi_transport_stream_id) continue;
lock_assert(&global_lock);
- LIST_FOREACH(t, &tdmi->tdmi_transports, s_group_link) {
+ LIST_FOREACH(t, &tdmi->tdmi_mux->dm_services, s_group_link) {
if(t->s_dvb_service_id == sid)
return t;
}
t->s_grace_period = dvb_grace_period;
t->s_dvb_mux_instance = tdmi;
- LIST_INSERT_HEAD(&tdmi->tdmi_transports, t, s_group_link);
+ LIST_INSERT_HEAD(&tdmi->tdmi_mux->dm_services, t, s_group_link);
pthread_mutex_lock(&t->s_stream_mutex);
service_make_nicename(t);
htsmsg_add_str(m, "network", tdmi->tdmi_network ?: "");
- dvb_mux_nicefreq(buf, sizeof(buf), tdmi);
+ dvb_mux_nicefreq(buf, sizeof(buf), tdmi->tdmi_mux);
htsmsg_add_str(m, "mux", buf);
if(t->s_ch != NULL)
*
*/
void
-dvb_mux_nicefreq(char *buf, size_t size, th_dvb_mux_instance_t *tdmi)
+dvb_mux_nicefreq(char *buf, size_t size, const dvb_mux_t *dm)
{
char freq[50];
- if(tdmi->tdmi_adapter->tda_type == FE_QPSK) {
- nicenum(freq, sizeof(freq), tdmi->tdmi_conf.dmc_fe_params.frequency);
+ if(dm->dm_network->dn_fe_type == FE_QPSK) {
+ nicenum(freq, sizeof(freq), dm->dm_conf.dmc_fe_params.frequency);
snprintf(buf, size, "%s kHz", freq);
} else {
nicenum(freq, sizeof(freq),
- tdmi->tdmi_conf.dmc_fe_params.frequency / 1000);
+ dm->dm_conf.dmc_fe_params.frequency / 1000);
snprintf(buf, size, "%s kHz", freq);
}
}
{
char freq[50];
const char *n = tdmi->tdmi_network;
+ const dvb_mux_t *dm = tdmi->tdmi_mux;
- if(tdmi->tdmi_adapter->tda_type == FE_QPSK) {
- nicenum(freq, sizeof(freq), tdmi->tdmi_conf.dmc_fe_params.frequency);
- snprintf(buf, size, "%s%s%s kHz %s (%s)",
+ if(tdmi->tdmi_adapter->tda_fe_type == FE_QPSK) {
+ nicenum(freq, sizeof(freq), dm->dm_conf.dmc_fe_params.frequency);
+ snprintf(buf, size, "%s%s%s kHz %s",
n?:"", n ? ": ":"", freq,
- dvb_polarisation_to_str_long(tdmi->tdmi_conf.dmc_polarisation),
- tdmi->tdmi_conf.dmc_satconf ? tdmi->tdmi_conf.dmc_satconf->sc_name : "No satconf");
+ dvb_polarisation_to_str_long(dm->dm_conf.dmc_polarisation));
} else {
- nicenum(freq, sizeof(freq), tdmi->tdmi_conf.dmc_fe_params.frequency / 1000);
+ nicenum(freq, sizeof(freq), dm->dm_conf.dmc_fe_params.frequency / 1000);
snprintf(buf, size, "%s%s%s kHz", n?:"", n ? ": ":"", freq);
}
}
void dvb_mux_nicename(char *buf, size_t size, th_dvb_mux_instance_t *tdmi);
int dvb_mux_badness(th_dvb_mux_instance_t *tdmi);
const char *dvb_mux_status(th_dvb_mux_instance_t *tdmi);
-void dvb_mux_nicefreq(char *buf, size_t size, th_dvb_mux_instance_t *tdmi);
+void dvb_mux_nicefreq(char *buf, size_t size, const dvb_mux_t *dm);
void atsc_utf16_to_utf8(uint8_t *src, int len, char *buf, int buflen);
j = 0;
/* Find TDMI */
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link)
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == tsid &&
tdmi->tdmi_network_id == onid)
break;
if(!tdmi->tdmi_network_id)
dvb_mux_set_onid(tdmi, onid);
} else {
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link)
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == tsid &&
tdmi->tdmi_network_id != onid)
break;
// Make sure this TSID is not already known on another mux
// That might indicate that we have accedentally received a PAT
// from another mux
- LIST_FOREACH(other, &tda->tda_dn->dn_muxes, tdmi_adapter_link)
- if(other != tdmi &&
- other->tdmi_conf.dmc_satconf == tdmi->tdmi_conf.dmc_satconf &&
+ LIST_FOREACH(other, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link)
+ if(other != tdmi &&
other->tdmi_transport_stream_id == tsid &&
other->tdmi_network_id == tdmi->tdmi_network_id)
return -1;
dmc.dmc_fe_params.u.qam.fec_inner = fec_tab[ptr[10] & 0x07];
dvb_mux_create(tdmi->tdmi_adapter, &dmc, onid, tsid, NULL,
- "automatic mux discovery", 1, 1, NULL, NULL);
+ "automatic mux discovery", 1, 1, NULL);
return 0;
}
dmc.dmc_fe_params.u.qam.fec_inner = fec_tab[ptr[10] & 0x0f];
dmc.dmc_polarisation = (ptr[6] >> 5) & 0x03;
- // Same satconf (lnb, switch, etc)
- dmc.dmc_satconf = tdmi->tdmi_conf.dmc_satconf;
#if DVB_API_VERSION >= 5
int modulation = (ptr[6] & 0x03);
#endif
dvb_mux_create(tdmi->tdmi_adapter, &dmc, onid, tsid, NULL,
- "automatic mux discovery", 1, 1, NULL, tdmi->tdmi_conf.dmc_satconf);
-
+ "automatic mux discovery", 1, 1, NULL);
return 0;
}
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
service_t *t;
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link)
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id == onid)
break;
switch(tag) {
case DVB_DESC_SAT:
- if(tdmi->tdmi_adapter->tda_type == FE_QPSK)
+ if(tdmi->tdmi_adapter->tda_fe_type == FE_QPSK)
dvb_table_sat_delivery(tdmi, ptr, tlen, tsid, onid);
break;
case DVB_DESC_CABLE:
- if(tdmi->tdmi_adapter->tda_type == FE_QAM)
+ if(tdmi->tdmi_adapter->tda_fe_type == FE_QAM)
dvb_table_cable_delivery(tdmi, ptr, tlen, tsid, onid);
break;
case DVB_DESC_LOCAL_CHAN:
onid = (ptr[24] << 8) | ptr[25];
/* Search all muxes on adapter */
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link)
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id == onid);
break;
service_t *t;
th_dvb_table_t *tdt = opaque;
- LIST_FOREACH(t, &tdmi->tdmi_transports, s_group_link) {
+ LIST_FOREACH(t, &tdmi->tdmi_mux->dm_services, s_group_link) {
pthread_mutex_lock(&t->s_stream_mutex);
psi_parse_pmt(t, ptr, len, 1, 1);
if (t->s_pmt_pid == tdt->tdt_pid && t->s_status == SERVICE_RUNNING)
{
int tableid;
- if(tdmi->tdmi_conf.dmc_fe_params.u.vsb.modulation == VSB_8) {
+ if(tdmi->tdmi_mux->dm_conf.dmc_fe_params.u.vsb.modulation == VSB_8) {
tableid = 0xc8; // Terrestrial
} else {
tableid = 0xc9; // Cable
TDT_CRC, 1);
- switch(tdmi->tdmi_adapter->tda_type) {
+ switch(tdmi->tdmi_adapter->tda_fe_type) {
case FE_QPSK:
case FE_OFDM:
case FE_QAM:
th_dvb_mux_instance_t *tdmi;
epggrab_ota_mux_t *ota;
TAILQ_FOREACH(tda, &dvb_adapters, tda_global_link) {
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) {
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link) {
if (tdmi->tdmi_transport_stream_id != tsid) continue;
if (onid && tdmi->tdmi_network_id != onid) continue;
if (networkname && (!tdmi->tdmi_network || strcmp(networkname, tdmi->tdmi_network))) continue;
pthread_mutex_unlock(&global_lock);
- if((out = dvb_mux_preconf_get_node(tda->tda_type, s)) == NULL)
+ if((out = dvb_mux_preconf_get_node(tda->tda_fe_type, s)) == NULL)
return 404;
htsmsg_json_serialize(out, hq, 0);
htsmsg_t *out, *array, *r;
const char *op = http_arg_get(&hc->hc_req_args, "op");
const char *sibling = http_arg_get(&hc->hc_req_args, "sibling");
- const char *s, *sc;
+ const char *s;
th_dvb_mux_instance_t *tdmi;
service_t *t;
array = htsmsg_create_list();
TAILQ_FOREACH(tda, &dvb_adapters, tda_global_link) {
- if(ref == NULL || (ref != tda && ref->tda_type == tda->tda_type))
+ if(ref == NULL || (ref != tda && ref->tda_fe_type == tda->tda_fe_type))
htsmsg_add_msg(array, NULL, dvb_adapter_build_msg(tda));
}
pthread_mutex_unlock(&global_lock);
htsmsg_add_u32(out, "success", 1);
} else if(!strcmp(op, "addnetwork")) {
- sc = http_arg_get(&hc->hc_req_args, "satconf");
+// sc = http_arg_get(&hc->hc_req_args, "satconf");
if((s = http_arg_get(&hc->hc_req_args, "network")) != NULL)
- dvb_mux_preconf_add_network(tda, s, sc);
+ dvb_mux_preconf_add_network(tda, s);
out = htsmsg_create_map();
htsmsg_add_u32(out, "success", 1);
tvhlog(LOG_NOTICE, "web interface",
"Service probe started on \"%s\"", tda->tda_displayname);
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) {
- LIST_FOREACH(t, &tdmi->tdmi_transports, s_group_link) {
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link) {
+ LIST_FOREACH(t, &tdmi->tdmi_mux->dm_services, s_group_link) {
if(t->s_enabled)
serviceprobe_enqueue(t);
}
if(!strcmp(op, "get")) {
array = htsmsg_create_list();
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link)
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link)
htsmsg_add_msg(array, NULL, dvb_mux_build_msg(tdmi));
htsmsg_add_msg(out, "entries", array);
out = htsmsg_create_map();
array = htsmsg_create_list();
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) {
- LIST_FOREACH(t, &tdmi->tdmi_transports, s_group_link) {
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link) {
+ LIST_FOREACH(t, &tdmi->tdmi_mux->dm_services, s_group_link) {
count++;
}
}
tvec = alloca(sizeof(service_t *) * count);
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) {
- LIST_FOREACH(t, &tdmi->tdmi_transports, s_group_link) {
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link) {
+ LIST_FOREACH(t, &tdmi->tdmi_mux->dm_services, s_group_link) {
tvec[i++] = t;
}
}
return 0;
}
-
+#if 0
/**
*
*/
return 0;
}
+#endif
/**
*
http_path_add("/dvb/addmux",
NULL, extjs_dvb_addmux, ACCESS_ADMIN);
-
+#if 0 // XXX(dvbreorg)
http_path_add("/dvb/copymux",
NULL, extjs_dvb_copymux, ACCESS_ADMIN);
+#endif
}
htsbuf_qprintf(hq, "%s (%s)\n", tda->tda_displayname, tda->tda_identifier);
outputtitle(hq, 4, "Multiplexes");
- LIST_FOREACH(tdmi, &tda->tda_dn->dn_muxes, tdmi_adapter_link) {
+ LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link) {
char tdminame[64];
dvb_mux_nicename(tdminame, sizeof(tdminame), tdmi);
htsbuf_qprintf(hq, " %s (%s)\n",
tdminame, tdmi->tdmi_identifier);
htsbuf_qprintf(hq, "\n");
- dumptransports(hq, &tdmi->tdmi_transports, 8);
+ dumptransports(hq, &tdmi->tdmi_mux->dm_services, 8);
}
}
}