Add support for DVB-C

This commit is contained in:
Andreas Öman 2007-11-27 19:28:07 +00:00
parent 39307445f9
commit f336f52a0b
3 changed files with 76 additions and 20 deletions

11
dvb.c
View file

@ -141,7 +141,9 @@ dvb_add_adapter(const char *path)
tda->tda_fe_fd = fe;
if(ioctl(tda->tda_fe_fd, FE_GET_INFO, &tda->tda_fe_info)) {
tda->tda_fe_info = malloc(sizeof(struct dvb_frontend_info));
if(ioctl(tda->tda_fe_fd, FE_GET_INFO, tda->tda_fe_info)) {
syslog(LOG_ALERT, "%s: Unable to query adapter\n", fname);
close(fe);
free(tda);
@ -158,11 +160,11 @@ dvb_add_adapter(const char *path)
LIST_INSERT_HEAD(&dvb_adapters_probing, tda, tda_link);
startupcounter++;
tda->tda_info = strdup(tda->tda_fe_info.name);
tda->tda_info = strdup(tda->tda_fe_info->name);
dispatch_addfd(tda->tda_fe_fd, dvb_frontend_event, tda, DISPATCH_PRI);
syslog(LOG_INFO, "Adding adapter %s (%s)", tda->tda_fe_info.name, path);
syslog(LOG_INFO, "Adding adapter %s (%s)", path, tda->tda_fe_info->name);
dtimer_arm(&tda->tda_fec_monitor_timer, dvb_fec_monitor, tda, 1);
}
@ -190,6 +192,7 @@ dvb_init(void)
syslog(LOG_WARNING,
"No muxes configured on \"%s\" DVB adapter unused",
tda->tda_path);
startupcounter--;
} else {
dvb_start_initial_scan(tdmi);
}
@ -303,7 +306,7 @@ dvb_tune_tdmi(th_dvb_mux_instance_t *tdmi, int maylog, tdmi_state_t state)
syslog(LOG_DEBUG, "\"%s\" tuning to mux \"%s\"",
tda->tda_path, tdmi->tdmi_mux->tdm_title);
i = ioctl(tda->tda_fe_fd, FE_SET_FRONTEND, &tdm->tdm_fe_params);
i = ioctl(tda->tda_fe_fd, FE_SET_FRONTEND, tdm->tdm_fe_params);
if(i != 0) {
if(maylog)
syslog(LOG_ERR, "\"%s\" tuning to transport \"%s\""

View file

@ -51,27 +51,49 @@ dvb_add_mux_instance(th_dvb_adapter_t *tda, th_dvb_mux_t *tdm)
static void
dvb_add_mux(struct dvb_frontend_parameters *fe_param, const char *name)
dvb_add_mux(struct dvb_frontend_parameters *fe_param, const char *name,
fe_type_t type)
{
th_dvb_mux_t *tdm;
th_dvb_adapter_t *tda;
char buf[100];
char *typetxt;
switch(type) {
case FE_QPSK:
typetxt = "DVB-S";
break;
case FE_QAM:
typetxt = "DVB-C";
break;
case FE_OFDM:
typetxt = "DVB-T";
break;
case FE_ATSC:
typetxt = "ASCT";
break;
default:
return;
}
tdm = calloc(1, sizeof(th_dvb_mux_t));
tdm->tdm_type = type;
memcpy(&tdm->tdm_fe_params, fe_param,
tdm->tdm_fe_params = malloc(sizeof(struct dvb_frontend_parameters));
memcpy(tdm->tdm_fe_params, fe_param,
sizeof(struct dvb_frontend_parameters));
if(name == NULL) {
snprintf(buf, sizeof(buf), "DVB-%d", fe_param->frequency);
snprintf(buf, sizeof(buf), "%s-%d", typetxt, fe_param->frequency);
tdm->tdm_name = strdup(buf);
snprintf(buf, sizeof(buf), "DVB-T: %.1f MHz",
snprintf(buf, sizeof(buf), "%s: %.1f MHz", typetxt,
(float)fe_param->frequency / 1000000.0f);
} else {
tdm->tdm_name = strdup(name);
snprintf(buf, sizeof(buf), "DVB-T: %.1f MHz (%s)",
snprintf(buf, sizeof(buf), "%s: %.1f MHz (%s)", typetxt,
(float)fe_param->frequency / 1000000.0f, name);
}
@ -80,7 +102,8 @@ dvb_add_mux(struct dvb_frontend_parameters *fe_param, const char *name)
LIST_INSERT_HEAD(&dvb_muxes, tdm, tdm_global_link);
LIST_FOREACH(tda, &dvb_adapters_probing, tda_link) {
dvb_add_mux_instance(tda, tdm);
if(tda->tda_fe_info->type == type)
dvb_add_mux_instance(tda, tdm);
}
}
@ -171,11 +194,37 @@ dvb_t_config(const char *l)
r = str2val(fec2, fectab);
f.u.ofdm.code_rate_LP = r == FEC_NONE ? FEC_AUTO : r;
dvb_add_mux(&f, NULL);
dvb_add_mux(&f, NULL, FE_OFDM);
}
static void
dvb_c_config(const char *l)
{
unsigned long freq, symrate;
char fec[20], qam[20];
struct dvb_frontend_parameters f;
int r;
r = sscanf(l, "%lu %lu %s %s",
&freq, &symrate, fec, qam);
if(r != 4)
return;
memset(&f, 0, sizeof(f));
f.inversion = INVERSION_AUTO;
f.frequency = freq;
f.u.qam.symbol_rate = symrate;
f.u.qam.fec_inner = str2val(fec, fectab);
f.u.qam.modulation = str2val(qam, qamtab);
dvb_add_mux(&f, NULL, FE_QAM);
}
static void
@ -205,6 +254,10 @@ dvb_muxfile_add(const char *fname)
dvb_t_config(line + 1);
break;
case 'C':
dvb_c_config(line + 1);
break;
default:
break;
}
@ -240,7 +293,7 @@ dvb_add_configured_muxes(void)
fe_param.frequency =
atoi(config_get_str_sub(&ce->ce_sub, "frequency", "0"));
dvb_add_mux(&fe_param, s);
dvb_add_mux(&fe_param, s, FE_OFDM);
}
}
}
@ -249,11 +302,11 @@ dvb_add_configured_muxes(void)
void
dvb_mux_setup(void)
{
const char *s;
config_entry_t *ce;
s = config_get_str("dvbmuxfile", NULL);
if(s != NULL)
dvb_muxfile_add(s);
TAILQ_FOREACH(ce, &config_list, ce_link)
if(ce->ce_type == CFG_VALUE && !strcasecmp("dvbmuxfile", ce->ce_key))
dvb_muxfile_add(ce->ce_value);
dvb_add_configured_muxes();
}

View file

@ -22,8 +22,6 @@
#include <pthread.h>
#include <syslog.h>
#include <netinet/in.h>
#include <linux/dvb/frontend.h>
#include <linux/dvb/dmx.h>
#include <libhts/htsq.h>
#include <libhts/htstv.h>
#include <libhts/htscfg.h>
@ -180,11 +178,13 @@ typedef struct th_dvb_mux {
struct th_dvb_mux_instance_list tdm_instances;
struct dvb_frontend_parameters tdm_fe_params;
struct dvb_frontend_parameters *tdm_fe_params;
const char *tdm_name;
const char *tdm_title;
int tdm_type; /* really fe_type_t */
} th_dvb_mux_t;
@ -212,7 +212,7 @@ typedef struct th_dvb_adapter {
pthread_mutex_t tda_mux_lock;
int tda_fe_fd;
struct dvb_frontend_info tda_fe_info;
struct dvb_frontend_info *tda_fe_info;
char *tda_demux_path;