Add support for DVB-C
This commit is contained in:
parent
39307445f9
commit
f336f52a0b
3 changed files with 76 additions and 20 deletions
11
dvb.c
11
dvb.c
|
@ -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\""
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
8
tvhead.h
8
tvhead.h
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue