From d64df81f3dd22b0a9ab362662fc33877dbf30cd7 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Fri, 31 Aug 2012 01:35:39 +0400 Subject: [PATCH] add "Include currently unavailable services when mapping" option --- src/dvb/dvb.h | 3 ++ src/dvb/dvb_adapter.c | 20 ++++++++++ src/serviceprobe.c | 80 ++++++++++++++++++++++--------------- src/webui/extjs_dvb.c | 4 ++ src/webui/static/app/dvb.js | 8 +++- 5 files changed, 80 insertions(+), 35 deletions(-) diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h index 958eb84507..5b7204641e 100644 --- a/src/dvb/dvb.h +++ b/src/dvb/dvb.h @@ -174,6 +174,7 @@ typedef struct th_dvb_adapter { char *tda_identifier; uint32_t tda_autodiscovery; uint32_t tda_idlescan; + uint32_t tda_include_unavailable_services; uint32_t tda_qmon; uint32_t tda_poweroff; uint32_t tda_nitoid; @@ -285,6 +286,8 @@ void dvb_adapter_set_skip_initialscan(th_dvb_adapter_t *tda, int on); void dvb_adapter_set_idlescan(th_dvb_adapter_t *tda, int on); +void dvb_adapter_set_include_unavailable_services(th_dvb_adapter_t *tda, int on); + void dvb_adapter_set_qmon(th_dvb_adapter_t *tda, int on); void dvb_adapter_set_dump_muxes(th_dvb_adapter_t *tda, int on); diff --git a/src/dvb/dvb_adapter.c b/src/dvb/dvb_adapter.c index 3c8b140ccc..0a3ee55e81 100644 --- a/src/dvb/dvb_adapter.c +++ b/src/dvb/dvb_adapter.c @@ -85,6 +85,7 @@ tda_save(th_dvb_adapter_t *tda) htsmsg_add_str(m, "displayname", tda->tda_displayname); htsmsg_add_u32(m, "autodiscovery", tda->tda_autodiscovery); htsmsg_add_u32(m, "idlescan", tda->tda_idlescan); + htsmsg_add_u32(m, "include_unavailable_services", tda->tda_include_unavailable_services); htsmsg_add_u32(m, "qmon", tda->tda_qmon); htsmsg_add_u32(m, "dump_muxes", tda->tda_dump_muxes); htsmsg_add_u32(m, "poweroff", tda->tda_poweroff); @@ -176,6 +177,23 @@ dvb_adapter_set_idlescan(th_dvb_adapter_t *tda, int on) tda_save(tda); } +/** + * + */ +void +dvb_adapter_set_include_unavailable_services(th_dvb_adapter_t *tda, int on) +{ + if(tda->tda_include_unavailable_services == on) + return; + + lock_assert(&global_lock); + + tvhlog(LOG_NOTICE, "dvb", "Adapter \"%s\" include currently unavailable services when mapping set to: %s", + tda->tda_displayname, on ? "On" : "Off"); + + tda->tda_include_unavailable_services = on; + tda_save(tda); +} /** * @@ -366,6 +384,7 @@ tda_add(int adapter_num) tda->tda_autodiscovery = tda->tda_type != FE_QPSK; tda->tda_idlescan = 1; + tda->tda_include_unavailable_services = 0; tda->tda_sat = tda->tda_type == FE_QPSK; @@ -440,6 +459,7 @@ dvb_adapter_init(uint32_t adapter_mask) htsmsg_get_u32(c, "autodiscovery", &tda->tda_autodiscovery); htsmsg_get_u32(c, "idlescan", &tda->tda_idlescan); + htsmsg_get_u32(c, "include_unavailable_services", &tda->tda_include_unavailable_services); htsmsg_get_u32(c, "qmon", &tda->tda_qmon); htsmsg_get_u32(c, "dump_muxes", &tda->tda_dump_muxes); htsmsg_get_u32(c, "poweroff", &tda->tda_poweroff); diff --git a/src/serviceprobe.c b/src/serviceprobe.c index 9deb43d557..f140be1bda 100644 --- a/src/serviceprobe.c +++ b/src/serviceprobe.c @@ -23,7 +23,7 @@ #include #include #include - +#include "dvb/dvb.h" @@ -87,6 +87,7 @@ serviceprobe_thread(void *aux) int run; const char *err; channel_t *ch; + uint32_t include_unavailable_services; pthread_mutex_lock(&global_lock); @@ -109,53 +110,66 @@ serviceprobe_thread(void *aux) was_doing_work = 1; } - tvhlog(LOG_INFO, "serviceprobe", "%20s: checking...", - t->s_svcname); + include_unavailable_services = t->s_dvb_mux_instance->tdmi_adapter->tda_checksubscr; - s = subscription_create_from_service(t, "serviceprobe", &sq.sq_st, 0); - if(s == NULL) { - t->s_sp_onqueue = 0; - TAILQ_REMOVE(&serviceprobe_queue, t, s_sp_link); - tvhlog(LOG_INFO, "serviceprobe", "%20s: could not subscribe", - t->s_svcname); - continue; + if (!include_unavailable_services) { + tvhlog(LOG_INFO, "serviceprobe", "%20s: checking...", + t->s_svcname); + + s = subscription_create_from_service(t, "serviceprobe", &sq.sq_st, 0); + if(s == NULL) { + t->s_sp_onqueue = 0; + TAILQ_REMOVE(&serviceprobe_queue, t, s_sp_link); + tvhlog(LOG_INFO, "serviceprobe", "%20s: could not subscribe", + t->s_svcname); + continue; + } } service_ref(t); pthread_mutex_unlock(&global_lock); - run = 1; - pthread_mutex_lock(&sq.sq_mutex); + if (include_unavailable_services) { + run = 0; + err = NULL; + } else { + run = 1; + pthread_mutex_lock(&sq.sq_mutex); - while(run) { + while(run) { - while((sm = TAILQ_FIRST(&sq.sq_queue)) == NULL) - pthread_cond_wait(&sq.sq_cond, &sq.sq_mutex); - TAILQ_REMOVE(&sq.sq_queue, sm, sm_link); + while((sm = TAILQ_FIRST(&sq.sq_queue)) == NULL) + pthread_cond_wait(&sq.sq_cond, &sq.sq_mutex); - pthread_mutex_unlock(&sq.sq_mutex); + TAILQ_REMOVE(&sq.sq_queue, sm, sm_link); - if(sm->sm_type == SMT_SERVICE_STATUS) { - int status = sm->sm_code; + pthread_mutex_unlock(&sq.sq_mutex); - if(status & TSS_PACKETS) { - run = 0; - err = NULL; - } else if(status & (TSS_GRACEPERIOD | TSS_ERRORS)) { - run = 0; - err = service_tss2text(status); - } - } + if(sm->sm_type == SMT_SERVICE_STATUS) { + int status = sm->sm_code; - streaming_msg_free(sm); - pthread_mutex_lock(&sq.sq_mutex); - } + if(status & TSS_PACKETS) { + run = 0; + err = NULL; + } else if(status & (TSS_GRACEPERIOD | TSS_ERRORS)) { + run = 0; + err = service_tss2text(status); + } + } - streaming_queue_clear(&sq.sq_queue); - pthread_mutex_unlock(&sq.sq_mutex); + streaming_msg_free(sm); + pthread_mutex_lock(&sq.sq_mutex); + } + streaming_queue_clear(&sq.sq_queue); + pthread_mutex_unlock(&sq.sq_mutex); + } + pthread_mutex_lock(&global_lock); - subscription_unsubscribe(s); + + if (!include_unavailable_services) { + subscription_unsubscribe(s); + } if(t->s_status != SERVICE_ZOMBIE) { diff --git a/src/webui/extjs_dvb.c b/src/webui/extjs_dvb.c index 84f9d87fe6..1743126a5b 100644 --- a/src/webui/extjs_dvb.c +++ b/src/webui/extjs_dvb.c @@ -150,6 +150,7 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque) htsmsg_add_u32(r, "automux", tda->tda_autodiscovery); htsmsg_add_u32(r, "skip_initialscan", tda->tda_skip_initialscan); htsmsg_add_u32(r, "idlescan", tda->tda_idlescan); + htsmsg_add_u32(r, "include_unavailable_services", tda->tda_include_unavailable_services); htsmsg_add_u32(r, "qmon", tda->tda_qmon); htsmsg_add_u32(r, "dumpmux", tda->tda_dump_muxes); htsmsg_add_u32(r, "poweroff", tda->tda_poweroff); @@ -175,6 +176,9 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque) s = http_arg_get(&hc->hc_req_args, "idlescan"); dvb_adapter_set_idlescan(tda, !!s); + s = http_arg_get(&hc->hc_req_args, "include_unavailable_services"); + dvb_adapter_set_include_unavailable_services(tda, !!s); + s = http_arg_get(&hc->hc_req_args, "qmon"); dvb_adapter_set_qmon(tda, !!s); diff --git a/src/webui/static/app/dvb.js b/src/webui/static/app/dvb.js index 6f793e8801..63f5a96d58 100644 --- a/src/webui/static/app/dvb.js +++ b/src/webui/static/app/dvb.js @@ -252,7 +252,7 @@ tvheadend.dvb_muxes = function(adapterData, satConfStore) { } } } - }), + }) ]; if (satConf) @@ -1106,7 +1106,7 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) { var confreader = new Ext.data.JsonReader({ root: 'dvbadapters' }, ['name', 'automux', 'skip_initialscan', 'idlescan', 'diseqcversion', 'qmon', - 'dumpmux', 'poweroff', 'nitoid','extrapriority']); + 'include_unavailable_services', 'dumpmux', 'poweroff', 'nitoid','extrapriority']); function saveConfForm () { @@ -1135,6 +1135,10 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) { fieldLabel: 'Idle scanning', name: 'idlescan' }), + new Ext.form.Checkbox({ + fieldLabel: 'Include currently unavailable services when mapping', + name: 'include_unavailable_services' + }), new Ext.form.Checkbox({ fieldLabel: 'Monitor signal quality', name: 'qmon'