dvbreorg: Various refactoring
This commit is contained in:
parent
fef5755fe7
commit
2cd41e90e5
9 changed files with 231 additions and 251 deletions
|
@ -450,6 +450,8 @@ dvb_mux_t *dvb_mux_create(dvb_network_t *tda,
|
|||
const char *logprefix, int enabled,
|
||||
int initialscan, const char *uuid);
|
||||
|
||||
int dvb_mux_tune(dvb_mux_t *dm, const char *reason, int weight);
|
||||
|
||||
void dvb_mux_set_networkname(dvb_mux_t *dm, const char *name);
|
||||
|
||||
void dvb_mux_set_tsid(dvb_mux_t *dm, uint16_t tsid);
|
||||
|
@ -490,10 +492,8 @@ dvb_mux_t *dvb_mux_find(dvb_network_t *dn, const char *netname, uint16_t onid,
|
|||
|
||||
void dvb_mux_initial_scan_done(dvb_mux_t *dm);
|
||||
|
||||
/**
|
||||
* DVB Transport (aka DVB service)
|
||||
*/
|
||||
void dvb_tdmi_destroy(th_dvb_mux_instance_t *tdmi);
|
||||
int dvb_fe_tune_tdmi(th_dvb_mux_instance_t *tdmi);
|
||||
|
||||
|
||||
/**
|
||||
* DVB Transport (aka DVB service)
|
||||
|
@ -521,7 +521,6 @@ void dvb_service_notify_by_adapter(th_dvb_adapter_t *tda);
|
|||
/**
|
||||
* DVB Frontend
|
||||
*/
|
||||
int dvb_fe_tune(dvb_mux_t *dm, const char *reason, int weight);
|
||||
|
||||
//void dvb_fe_stop(th_dvb_adapter_t *tda, int retune);
|
||||
|
||||
|
|
179
src/dvb/dvb_fe.c
179
src/dvb/dvb_fe.c
|
@ -92,7 +92,6 @@ dvb_fe_monitor(void *aux)
|
|||
fe_status_t fe_status;
|
||||
int status, v, vv, i, fec, q;
|
||||
th_dvb_mux_instance_t *tdmi = tda->tda_current_tdmi;
|
||||
char buf[50];
|
||||
signal_status_t sigstat;
|
||||
streaming_message_t sm;
|
||||
struct service *t;
|
||||
|
@ -191,10 +190,10 @@ dvb_fe_monitor(void *aux)
|
|||
if(status != tdmi->tdmi_fe_status) {
|
||||
tdmi->tdmi_fe_status = status;
|
||||
|
||||
dvb_mux_nicename(buf, sizeof(buf), tdmi->tdmi_mux);
|
||||
tvhlog(LOG_DEBUG,
|
||||
"dvb", "\"%s\" on adapter \"%s\", status changed to %s",
|
||||
buf, tda->tda_displayname, dvb_mux_status(tdmi));
|
||||
dvb_mux_nicename(tdmi->tdmi_mux), tda->tda_displayname,
|
||||
dvb_mux_status(tdmi));
|
||||
notify = 1;
|
||||
}
|
||||
|
||||
|
@ -385,147 +384,23 @@ dvb_fe_tune_s2(th_dvb_adapter_t *tda, dvb_mux_conf_t *dmc)
|
|||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* These are created on the fly
|
||||
*/
|
||||
static void
|
||||
dvb_create_tdmis(dvb_mux_t *dm)
|
||||
{
|
||||
th_dvb_mux_instance_t *tdmi;
|
||||
dvb_network_t *dn = dm->dm_dn;
|
||||
th_dvb_adapter_t *tda;
|
||||
|
||||
LIST_FOREACH(tda, &dn->dn_adapters, tda_network_link) {
|
||||
|
||||
LIST_FOREACH(tdmi, &dm->dm_tdmis, tdmi_mux_link) {
|
||||
if(tdmi->tdmi_adapter != NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
if(tdmi == NULL) {
|
||||
tdmi = calloc(1, sizeof(th_dvb_mux_instance_t));
|
||||
tdmi->tdmi_adapter = tda;
|
||||
tdmi->tdmi_mux = dm;
|
||||
LIST_INSERT_HEAD(&tda->tda_tdmis, tdmi, tdmi_adapter_link);
|
||||
LIST_INSERT_HEAD(&dm->dm_tdmis, tdmi, tdmi_mux_link);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static void
|
||||
dvb_mux_stop(th_dvb_mux_instance_t *tdmi)
|
||||
{
|
||||
dvb_mux_t *dm = tdmi->tdmi_mux;
|
||||
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
|
||||
assert(dm->dm_current_tdmi == tdmi);
|
||||
assert(tda->tda_current_tdmi == tdmi);
|
||||
|
||||
dvb_table_flush_all(dm);
|
||||
epggrab_mux_stop(dm, 0);
|
||||
|
||||
assert(dm->dm_scan_status == DM_SCAN_DONE);
|
||||
|
||||
dm->dm_current_tdmi = NULL;
|
||||
tda->tda_current_tdmi = NULL;
|
||||
|
||||
printf("NEED TO TAKE CARE OF SERVICES in dvb_mux_stop\n");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static int
|
||||
tdmi_compute_weight(const th_dvb_mux_instance_t *tdmi)
|
||||
{
|
||||
const dvb_mux_t *dm = tdmi->tdmi_mux;
|
||||
if(dm->dm_scan_status == DM_SCAN_CURRENT)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static void
|
||||
dvb_mux_initial_scan_timeout(void *aux)
|
||||
{
|
||||
dvb_mux_t *dm = aux;
|
||||
char buf[100];
|
||||
|
||||
dvb_mux_nicename(buf, sizeof(buf), dm);
|
||||
tvhlog(LOG_DEBUG, "dvb", "Initial scan timed out for \"%s\"", buf);
|
||||
|
||||
dvb_mux_initial_scan_done(dm);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
int
|
||||
dvb_fe_tune(dvb_mux_t *dm, const char *reason, int weight)
|
||||
dvb_fe_tune_tdmi(th_dvb_mux_instance_t *tdmi)
|
||||
{
|
||||
dvb_network_t *dn = dm->dm_dn;
|
||||
|
||||
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
|
||||
const dvb_mux_t *dm = tdmi->tdmi_mux;
|
||||
// copy dmc, cause frequency may be change with FE_QPSK
|
||||
dvb_mux_conf_t dmc = dm->dm_conf;
|
||||
dvb_frontend_parameters_t* p = &dmc.dmc_fe_params;
|
||||
th_dvb_mux_instance_t *tdmi;
|
||||
|
||||
char buf[256];
|
||||
int r;
|
||||
|
||||
assert(dm->dm_current_tdmi == NULL);
|
||||
|
||||
lock_assert(&global_lock);
|
||||
|
||||
dvb_create_tdmis(dm);
|
||||
|
||||
retry:
|
||||
// Figure which adapter to use
|
||||
LIST_FOREACH(tdmi, &dm->dm_tdmis, tdmi_mux_link)
|
||||
if(!tdmi->tdmi_tune_failed && tdmi->tdmi_adapter->tda_current_tdmi == NULL)
|
||||
break;
|
||||
|
||||
if(tdmi == NULL) {
|
||||
// None available, need to strike one out
|
||||
LIST_FOREACH(tdmi, &dm->dm_tdmis, tdmi_mux_link) {
|
||||
if(tdmi->tdmi_tune_failed)
|
||||
continue;
|
||||
|
||||
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
|
||||
th_dvb_mux_instance_t *t2 = tda->tda_current_tdmi;
|
||||
assert(t2 != NULL);
|
||||
assert(t2 != tdmi);
|
||||
|
||||
if(tdmi_compute_weight(t2) < weight) {
|
||||
dvb_mux_stop(t2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(tdmi == NULL)
|
||||
return SM_CODE_NO_FREE_ADAPTER;
|
||||
|
||||
}
|
||||
|
||||
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
|
||||
char buf[256];
|
||||
|
||||
dvb_adapter_start(tda);
|
||||
|
||||
assert(tda->tda_current_tdmi == NULL);
|
||||
|
||||
free(tda->tda_tune_reason);
|
||||
tda->tda_tune_reason = strdup(reason);
|
||||
|
||||
tdmi->tdmi_weight = weight;
|
||||
|
||||
if(tda->tda_fe_type == FE_QPSK) {
|
||||
|
||||
|
@ -574,52 +449,26 @@ dvb_fe_tune(dvb_mux_t *dm, const char *reason, int weight)
|
|||
tvhlog(LOG_ERR, "dvb", "diseqc setup failed %d\n", r);
|
||||
}
|
||||
|
||||
dvb_mux_nicename(buf, sizeof(buf), tdmi->tdmi_mux);
|
||||
|
||||
tda->tda_fe_monitor_hold = 4;
|
||||
|
||||
|
||||
#if DVB_API_VERSION >= 5
|
||||
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),
|
||||
dvb_mux_qam2str(dmc.dmc_fe_modulation), reason);
|
||||
|
||||
"%s, %s, %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),
|
||||
dvb_mux_qam2str(dmc.dmc_fe_modulation));
|
||||
r = dvb_fe_tune_s2(tda, &dmc);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
tvhlog(LOG_DEBUG, "dvb", "\"%s\" tuning to \"%s\" (%s) fd:%d", tda->tda_rootpath, buf, reason, tda->tda_fe_fd);
|
||||
tvhlog(LOG_DEBUG, "dvb", "\"%s\" tuning to \"%s\"",
|
||||
tda->tda_rootpath, dvb_mux_nicename(dm));
|
||||
r = ioctl(tda->tda_fe_fd, FE_SET_FRONTEND, p);
|
||||
}
|
||||
|
||||
if(r != 0) {
|
||||
tvhlog(LOG_ERR, "dvb", "\"%s\" tuning to \"%s\""
|
||||
" -- Front configuration failed -- %s, frequency: %u",
|
||||
tda->tda_rootpath, buf, strerror(errno), p->frequency);
|
||||
|
||||
/* Mark as bad */
|
||||
tdmi->tdmi_tune_failed = 1;
|
||||
goto retry;
|
||||
}
|
||||
if(!r)
|
||||
gtimer_arm(&tda->tda_fe_monitor_timer, dvb_fe_monitor, tda, 1);
|
||||
|
||||
tda->tda_current_tdmi = tdmi;
|
||||
dm->dm_current_tdmi = tdmi;
|
||||
if(dm->dm_scan_status == DM_SCAN_PENDING) {
|
||||
TAILQ_REMOVE(&dn->dn_initial_scan_pending_queue, dm, dm_scan_link);
|
||||
dm->dm_scan_status = DM_SCAN_CURRENT;
|
||||
TAILQ_INSERT_TAIL(&dn->dn_initial_scan_current_queue, dm, dm_scan_link);
|
||||
|
||||
gtimer_arm(&dm->dm_initial_scan_timeout, dvb_mux_initial_scan_timeout, dm, 10);
|
||||
}
|
||||
|
||||
|
||||
gtimer_arm(&tda->tda_fe_monitor_timer, dvb_fe_monitor, tda, 1);
|
||||
|
||||
dvb_table_add_default(dm);
|
||||
epggrab_mux_start(dm);
|
||||
|
||||
dvb_adapter_notify(tda);
|
||||
return 0;
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -218,12 +218,10 @@ dvb_mux_create(dvb_network_t *dn, const struct dvb_mux_conf *dmc,
|
|||
}
|
||||
|
||||
if(save) {
|
||||
char buf[128];
|
||||
dvb_mux_save(dm);
|
||||
dvb_mux_nicename(buf, sizeof(buf), dm);
|
||||
tvhlog(LOG_DEBUG, "dvb",
|
||||
"Configuration for mux \"%s\" updated by %s%s",
|
||||
buf, source, buf2);
|
||||
tvhlog(LOG_DEBUG, "dvb",
|
||||
"Configuration for mux \"%s\" updated by %s%s",
|
||||
dvb_mux_nicename(dm), source, buf2);
|
||||
dvb_mux_notify(dm);
|
||||
}
|
||||
|
||||
|
@ -255,9 +253,8 @@ dvb_mux_create(dvb_network_t *dn, const struct dvb_mux_conf *dmc,
|
|||
memcpy(&dm->dm_conf, dmc, sizeof(struct dvb_mux_conf));
|
||||
|
||||
if(source != NULL) {
|
||||
char buf[128];
|
||||
dvb_mux_nicename(buf, sizeof(buf), dm);
|
||||
tvhlog(LOG_NOTICE, "dvb", "New mux \"%s\" created by %s", buf, source);
|
||||
tvhlog(LOG_NOTICE, "dvb", "New mux \"%s\" created by %s",
|
||||
dvb_mux_nicename(dm), source);
|
||||
|
||||
dvb_mux_save(dm);
|
||||
}
|
||||
|
@ -276,7 +273,7 @@ dvb_mux_create(dvb_network_t *dn, const struct dvb_mux_conf *dmc,
|
|||
/**
|
||||
*
|
||||
*/
|
||||
void
|
||||
static void
|
||||
dvb_tdmi_destroy(th_dvb_mux_instance_t *tdmi)
|
||||
{
|
||||
LIST_REMOVE(tdmi, tdmi_mux_link);
|
||||
|
@ -954,8 +951,7 @@ dvb_mux_build_msg(dvb_mux_t *dm)
|
|||
htsmsg_add_u32(m, "enabled", dm->dm_enabled);
|
||||
htsmsg_add_str(m, "network", dm->dm_network_name ?: "");
|
||||
|
||||
dvb_mux_nicefreq(buf, sizeof(buf), dm);
|
||||
htsmsg_add_str(m, "freq", buf);
|
||||
htsmsg_add_str(m, "freq", dvb_mux_nicefreq(dm));
|
||||
|
||||
dvb_mux_modulation(buf, sizeof(buf), dm);
|
||||
htsmsg_add_str(m, "mod", buf);
|
||||
|
@ -1233,7 +1229,7 @@ dvb_subscription_create_from_tdmi(th_dvb_mux_instance_t *tdmi,
|
|||
s->ths_tdmi = tdmi;
|
||||
LIST_INSERT_HEAD(&tdmi->tdmi_subscriptions, s, ths_tdmi_link);
|
||||
|
||||
dvb_fe_tune(tdmi->tdmi_mux, "Full mux subscription", 99999);
|
||||
dvb_mux_tune(tdmi->tdmi_mux, "Full mux subscription", 99999);
|
||||
abort();
|
||||
pthread_mutex_lock(&tda->tda_delivery_mutex);
|
||||
streaming_target_connect(&tda->tda_streaming_pad, &s->ths_input);
|
||||
|
@ -1254,11 +1250,7 @@ dvb_mux_serialize(struct idnode *self, int full)
|
|||
dvb_mux_t *dm = (dvb_mux_t *)self;
|
||||
htsmsg_t *m = htsmsg_create_map();
|
||||
htsmsg_add_str(m, "id", idnode_uuid_as_str(&dm->dm_id));
|
||||
|
||||
char buf[256];
|
||||
dvb_mux_nicename(buf, sizeof(buf), dm);
|
||||
|
||||
htsmsg_add_str(m, "text", buf);
|
||||
htsmsg_add_str(m, "text", dvb_mux_nicename(dm));
|
||||
return m;
|
||||
}
|
||||
|
||||
|
@ -1295,3 +1287,164 @@ dvb_mux_get_childs(struct idnode *self)
|
|||
v[cnt] = NULL;
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* These are created on the fly
|
||||
*/
|
||||
static void
|
||||
dvb_create_tdmis(dvb_mux_t *dm)
|
||||
{
|
||||
th_dvb_mux_instance_t *tdmi;
|
||||
dvb_network_t *dn = dm->dm_dn;
|
||||
th_dvb_adapter_t *tda;
|
||||
|
||||
LIST_FOREACH(tda, &dn->dn_adapters, tda_network_link) {
|
||||
|
||||
LIST_FOREACH(tdmi, &dm->dm_tdmis, tdmi_mux_link) {
|
||||
if(tdmi->tdmi_adapter != NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
if(tdmi == NULL) {
|
||||
tdmi = calloc(1, sizeof(th_dvb_mux_instance_t));
|
||||
tdmi->tdmi_adapter = tda;
|
||||
tdmi->tdmi_mux = dm;
|
||||
LIST_INSERT_HEAD(&tda->tda_tdmis, tdmi, tdmi_adapter_link);
|
||||
LIST_INSERT_HEAD(&dm->dm_tdmis, tdmi, tdmi_mux_link);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static void
|
||||
dvb_mux_stop(th_dvb_mux_instance_t *tdmi)
|
||||
{
|
||||
dvb_mux_t *dm = tdmi->tdmi_mux;
|
||||
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
|
||||
assert(dm->dm_current_tdmi == tdmi);
|
||||
assert(tda->tda_current_tdmi == tdmi);
|
||||
|
||||
dvb_table_flush_all(dm);
|
||||
epggrab_mux_stop(dm, 0);
|
||||
|
||||
assert(dm->dm_scan_status == DM_SCAN_DONE);
|
||||
|
||||
dm->dm_current_tdmi = NULL;
|
||||
tda->tda_current_tdmi = NULL;
|
||||
|
||||
printf("NEED TO TAKE CARE OF SERVICES in dvb_mux_stop\n");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static int
|
||||
tdmi_compute_weight(const th_dvb_mux_instance_t *tdmi)
|
||||
{
|
||||
const dvb_mux_t *dm = tdmi->tdmi_mux;
|
||||
if(dm->dm_scan_status == DM_SCAN_CURRENT)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static void
|
||||
dvb_mux_initial_scan_timeout(void *aux)
|
||||
{
|
||||
dvb_mux_t *dm = aux;
|
||||
tvhlog(LOG_DEBUG, "dvb", "Initial scan timed out for \"%s\"",
|
||||
dvb_mux_nicename(dm));
|
||||
|
||||
dvb_mux_initial_scan_done(dm);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
int
|
||||
dvb_mux_tune(dvb_mux_t *dm, const char *reason, int weight)
|
||||
{
|
||||
dvb_network_t *dn = dm->dm_dn;
|
||||
th_dvb_mux_instance_t *tdmi;
|
||||
int r;
|
||||
|
||||
assert(dm->dm_current_tdmi == NULL);
|
||||
|
||||
lock_assert(&global_lock);
|
||||
|
||||
dvb_create_tdmis(dm);
|
||||
|
||||
retry:
|
||||
// Figure which adapter to use
|
||||
LIST_FOREACH(tdmi, &dm->dm_tdmis, tdmi_mux_link)
|
||||
if(!tdmi->tdmi_tune_failed && tdmi->tdmi_adapter->tda_current_tdmi == NULL)
|
||||
break;
|
||||
|
||||
if(tdmi == NULL) {
|
||||
// None available, need to strike one out
|
||||
LIST_FOREACH(tdmi, &dm->dm_tdmis, tdmi_mux_link) {
|
||||
if(tdmi->tdmi_tune_failed)
|
||||
continue;
|
||||
|
||||
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
|
||||
th_dvb_mux_instance_t *t2 = tda->tda_current_tdmi;
|
||||
assert(t2 != NULL);
|
||||
assert(t2 != tdmi);
|
||||
|
||||
if(tdmi_compute_weight(t2) < weight) {
|
||||
dvb_mux_stop(t2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(tdmi == NULL)
|
||||
return SM_CODE_NO_FREE_ADAPTER;
|
||||
|
||||
}
|
||||
|
||||
tdmi->tdmi_weight = weight;
|
||||
|
||||
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
|
||||
|
||||
free(tda->tda_tune_reason);
|
||||
tda->tda_tune_reason = strdup(reason);
|
||||
|
||||
r = dvb_fe_tune_tdmi(tdmi);
|
||||
|
||||
if(r != 0) {
|
||||
tvhlog(LOG_ERR, "dvb", "\"%s\" tuning to \"%s\""
|
||||
" -- Front configuration failed -- %s",
|
||||
tda->tda_rootpath, dvb_mux_nicename(dm), strerror(errno));
|
||||
|
||||
/* Mark as bad */
|
||||
tdmi->tdmi_tune_failed = 1;
|
||||
goto retry;
|
||||
}
|
||||
|
||||
tda->tda_current_tdmi = tdmi;
|
||||
dm->dm_current_tdmi = tdmi;
|
||||
if(dm->dm_scan_status == DM_SCAN_PENDING) {
|
||||
TAILQ_REMOVE(&dn->dn_initial_scan_pending_queue, dm, dm_scan_link);
|
||||
dm->dm_scan_status = DM_SCAN_CURRENT;
|
||||
TAILQ_INSERT_TAIL(&dn->dn_initial_scan_current_queue, dm, dm_scan_link);
|
||||
|
||||
gtimer_arm(&dm->dm_initial_scan_timeout, dvb_mux_initial_scan_timeout, dm, 10);
|
||||
}
|
||||
|
||||
dvb_table_add_default(dm);
|
||||
epggrab_mux_start(dm);
|
||||
|
||||
dvb_adapter_notify(tda);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -235,7 +235,7 @@ dvb_network_initial_scan(void *aux)
|
|||
|
||||
while((dm = TAILQ_FIRST(&dn->dn_initial_scan_pending_queue)) != NULL) {
|
||||
assert(dm->dm_scan_status == DM_SCAN_PENDING);
|
||||
if(dvb_fe_tune(dm, "initial scan", 1))
|
||||
if(dvb_mux_tune(dm, "initial scan", 1))
|
||||
break;
|
||||
assert(dm->dm_scan_status == DM_SCAN_CURRENT);
|
||||
}
|
||||
|
|
|
@ -276,7 +276,6 @@ static void
|
|||
dvb_service_setsourceinfo(service_t *t, struct source_info *si)
|
||||
{
|
||||
dvb_mux_t *dm = t->s_dvb_mux;
|
||||
char buf[100];
|
||||
|
||||
memset(si, 0, sizeof(struct source_info));
|
||||
|
||||
|
@ -287,8 +286,7 @@ dvb_service_setsourceinfo(service_t *t, struct source_info *si)
|
|||
if(dm->dm_network_name != NULL)
|
||||
si->si_network = strdup(dm->dm_network_name);
|
||||
|
||||
dvb_mux_nicename(buf, sizeof(buf), dm);
|
||||
si->si_mux = strdup(buf);
|
||||
si->si_mux = strdup(dvb_mux_nicename(dm));
|
||||
|
||||
if(t->s_provider != NULL)
|
||||
si->si_provider = strdup(t->s_provider);
|
||||
|
@ -364,7 +362,6 @@ dvb_service_find2(dvb_mux_t *dm, uint16_t sid, int pmt_pid,
|
|||
const char *uuid, int *save)
|
||||
{
|
||||
service_t *t;
|
||||
char buf[200];
|
||||
|
||||
lock_assert(&global_lock);
|
||||
|
||||
|
@ -376,8 +373,8 @@ dvb_service_find2(dvb_mux_t *dm, uint16_t sid, int pmt_pid,
|
|||
if(pmt_pid == 0)
|
||||
return NULL;
|
||||
|
||||
dvb_mux_nicename(buf, sizeof(buf), dm);
|
||||
tvhlog(LOG_DEBUG, "dvb", "Add service \"0x%x\" on \"%s\"", sid, buf);
|
||||
tvhlog(LOG_DEBUG, "dvb", "Add service \"0x%x\" on \"%s\"", sid,
|
||||
dvb_mux_nicename(dm));
|
||||
|
||||
t = service_create(uuid, S_MPEG_TS);
|
||||
if (save) *save = 1;
|
||||
|
@ -396,9 +393,9 @@ dvb_service_find2(dvb_mux_t *dm, uint16_t sid, int pmt_pid,
|
|||
t->s_dvb_mux = dm;
|
||||
LIST_INSERT_HEAD(&dm->dm_services, t, s_group_link);
|
||||
|
||||
pthread_mutex_lock(&t->s_stream_mutex);
|
||||
pthread_mutex_lock(&t->s_stream_mutex);
|
||||
service_make_nicename(t);
|
||||
pthread_mutex_unlock(&t->s_stream_mutex);
|
||||
pthread_mutex_unlock(&t->s_stream_mutex);
|
||||
return t;
|
||||
}
|
||||
|
||||
|
@ -434,8 +431,7 @@ dvb_service_serialize(service_t *s, int full)
|
|||
|
||||
htsmsg_add_str(m, "network", dm->dm_network_name ?: "");
|
||||
|
||||
dvb_mux_nicefreq(buf, sizeof(buf), dm);
|
||||
htsmsg_add_str(m, "mux", buf);
|
||||
htsmsg_add_str(m, "mux", dvb_mux_nicefreq(dm));
|
||||
|
||||
if(s->s_ch != NULL)
|
||||
htsmsg_add_str(m, "channelname", s->s_ch->ch_name);
|
||||
|
|
|
@ -444,61 +444,54 @@ dvb_adapter_find_by_identifier(const char *identifier)
|
|||
/**
|
||||
*
|
||||
*/
|
||||
static const char *
|
||||
nicenum(char *x, size_t siz, unsigned int v)
|
||||
static void
|
||||
nicenum(char *x, size_t siz, unsigned int v, const char *postfix)
|
||||
{
|
||||
if(v < 1000)
|
||||
snprintf(x, siz, "%d", v);
|
||||
snprintf(x, siz, "%d%s", v, postfix);
|
||||
else if(v < 1000000)
|
||||
snprintf(x, siz, "%d,%03d", v / 1000, v % 1000);
|
||||
snprintf(x, siz, "%d,%03d%s", v / 1000, v % 1000, postfix);
|
||||
else if(v < 1000000000)
|
||||
snprintf(x, siz, "%d,%03d,%03d",
|
||||
v / 1000000, (v % 1000000) / 1000, v % 1000);
|
||||
else
|
||||
snprintf(x, siz, "%d,%03d,%03d,%03d",
|
||||
snprintf(x, siz, "%d,%03d,%03d%s",
|
||||
v / 1000000, (v % 1000000) / 1000, v % 1000, postfix);
|
||||
else
|
||||
snprintf(x, siz, "%d,%03d,%03d,%03d%s",
|
||||
v / 1000000000, (v % 1000000000) / 1000000,
|
||||
(v % 1000000) / 1000, v % 1000);
|
||||
return x;
|
||||
(v % 1000000) / 1000, v % 1000, postfix);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
void
|
||||
dvb_mux_nicefreq(char *buf, size_t size, const dvb_mux_t *dm)
|
||||
const char *
|
||||
dvb_mux_nicefreq(const dvb_mux_t *dm)
|
||||
{
|
||||
char freq[50];
|
||||
|
||||
if(dm->dm_dn->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),
|
||||
dm->dm_conf.dmc_fe_params.frequency / 1000);
|
||||
snprintf(buf, size, "%s kHz", freq);
|
||||
}
|
||||
static char ret[100];
|
||||
int f = dm->dm_conf.dmc_fe_params.frequency;
|
||||
nicenum(ret, sizeof(ret), dm->dm_dn->dn_fe_type == FE_QPSK ? f : f / 1000,
|
||||
" kHz");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
void
|
||||
dvb_mux_nicename(char *buf, size_t size, dvb_mux_t *dm)
|
||||
const char *
|
||||
dvb_mux_nicename(const dvb_mux_t *dm)
|
||||
{
|
||||
char freq[50];
|
||||
static char ret[100];
|
||||
const char *n = dm->dm_network_name;
|
||||
|
||||
if(dm->dm_dn->dn_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(dm->dm_conf.dmc_polarisation));
|
||||
|
||||
} else {
|
||||
nicenum(freq, sizeof(freq), dm->dm_conf.dmc_fe_params.frequency / 1000);
|
||||
snprintf(buf, size, "%s%s%s kHz", n?:"", n ? ": ":"", freq);
|
||||
}
|
||||
snprintf(ret, sizeof(ret), "%s%s%s%s%s",
|
||||
n ?: "",
|
||||
n ? ": " : "",
|
||||
dvb_mux_nicefreq(dm),
|
||||
dm->dm_dn->dn_fe_type == FE_QPSK ? " " : "",
|
||||
dm->dm_dn->dn_fe_type == FE_QPSK ?
|
||||
dvb_polarisation_to_str_long(dm->dm_conf.dmc_polarisation) :
|
||||
"");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -79,10 +79,11 @@ const char *dvb_polarisation_to_str(int pol);
|
|||
const char *dvb_polarisation_to_str_long(int pol);
|
||||
th_dvb_adapter_t *dvb_adapter_find_by_identifier(const char *identifier);
|
||||
th_dvb_mux_instance_t *dvb_mux_find_by_identifier(const char *identifier);
|
||||
void dvb_mux_nicename(char *buf, size_t size, dvb_mux_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, const dvb_mux_t *dm);
|
||||
|
||||
const char *dvb_mux_nicefreq(const dvb_mux_t *dm);
|
||||
const char *dvb_mux_nicename(const dvb_mux_t *dm);
|
||||
|
||||
void atsc_utf16_to_utf8(uint8_t *src, int len, char *buf, int buflen);
|
||||
|
||||
|
|
15
src/v4l.c
15
src/v4l.c
|
@ -289,22 +289,12 @@ v4l_service_save(service_t *t)
|
|||
pthread_mutex_unlock(&t->s_stream_mutex);
|
||||
|
||||
hts_settings_save(m, "v4lservices/%s/%s",
|
||||
va->va_identifier, t->s_uuid);
|
||||
va->va_identifier, idnode_uuid_as_str(&t->s_id));
|
||||
|
||||
htsmsg_destroy(m);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static int
|
||||
v4l_service_quality(service_t *t)
|
||||
{
|
||||
return 100;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -349,7 +339,7 @@ v4l_service_find(v4l_adapter_t *va, const char *id, int create)
|
|||
return NULL;
|
||||
|
||||
LIST_FOREACH(t, &va->va_services, s_group_link)
|
||||
if(!strcmp(t->s_uuid, id))
|
||||
if(!strcmp(idnode_uuid_as_str(&t->s_id), id))
|
||||
return t;
|
||||
}
|
||||
|
||||
|
@ -371,7 +361,6 @@ v4l_service_find(v4l_adapter_t *va, const char *id, int create)
|
|||
t->s_stop_feed = v4l_service_stop;
|
||||
t->s_config_save = v4l_service_save;
|
||||
t->s_setsourceinfo = v4l_service_setsourceinfo;
|
||||
t->s_quality_index = v4l_service_quality;
|
||||
t->s_grace_period = v4l_grace_period;
|
||||
t->s_iptv_fd = -1;
|
||||
t->s_v4l_adapter = va;
|
||||
|
|
|
@ -170,7 +170,7 @@ build_record_v4l(service_t *t)
|
|||
{
|
||||
htsmsg_t *r = htsmsg_create_map();
|
||||
|
||||
htsmsg_add_str(r, "id", t->s_identifier);
|
||||
// htsmsg_add_str(r, "id", t->s_identifier); // XXX(dvbreorg)
|
||||
|
||||
htsmsg_add_str(r, "channelname", t->s_ch ? t->s_ch->ch_name : "");
|
||||
htsmsg_add_u32(r, "frequency", t->s_v4l_frequency);
|
||||
|
|
Loading…
Add table
Reference in a new issue