mpegts inputs: allow to disable init/idle scan per tuner/input, fixes #2475

This commit is contained in:
Jaroslav Kysela 2014-11-14 15:07:37 +01:00
parent 7e5abcb0c4
commit af4a2af9ab
14 changed files with 80 additions and 39 deletions

View file

@ -532,7 +532,8 @@ next_one:
/* Subscribe to the mux */
om->om_requeue = 1;
if ((r = mpegts_mux_subscribe(mm, "epggrab", SUBSCRIPTION_PRIO_EPG))) {
if ((r = mpegts_mux_subscribe(mm, "epggrab", SUBSCRIPTION_PRIO_EPG,
SUBSCRIPTION_EPG))) {
TAILQ_INSERT_TAIL(&epggrab_ota_pending, om, om_q_link);
om->om_q_type = EPGGRAB_OTA_MUX_PENDING;
if (r == SM_CODE_NO_FREE_ADAPTER)

View file

@ -355,6 +355,7 @@ struct mpegts_mux
mpegts_mux_scan_result_t mm_scan_result; ///< Result of last scan
int mm_scan_weight; ///< Scan priority
int mm_scan_flags; ///< Subscription flags
int mm_scan_init; ///< Flag to timeout handler
gtimer_t mm_scan_timeout; ///< Timer to handle timeout
TAILQ_ENTRY(mpegts_mux) mm_scan_link; ///< Link to Queue
@ -539,6 +540,9 @@ struct mpegts_input
int mi_ota_epg;
int mi_initscan;
int mi_idlescan;
LIST_ENTRY(mpegts_input) mi_global_link;
mpegts_network_link_list_t mi_networks;
@ -588,7 +592,7 @@ struct mpegts_input
/*
* Functions
*/
int (*mi_is_enabled) (mpegts_input_t*, mpegts_mux_t *mm, const char *reason);
int (*mi_is_enabled) (mpegts_input_t*, mpegts_mux_t *mm, int flags);
void (*mi_enabled_updated)(mpegts_input_t*);
void (*mi_display_name) (mpegts_input_t*, char *buf, size_t len);
int (*mi_is_free) (mpegts_input_t*);
@ -661,7 +665,7 @@ void mpegts_input_status_timer ( void *p );
int mpegts_input_grace ( mpegts_input_t * mi, mpegts_mux_t * mm );
int mpegts_input_is_enabled ( mpegts_input_t * mi, mpegts_mux_t *mm, const char *reason );
int mpegts_input_is_enabled ( mpegts_input_t * mi, mpegts_mux_t *mm, int flags );
/* TODO: exposing these class methods here is a bit of a hack */
const void *mpegts_input_class_network_get ( void *o );
@ -747,7 +751,7 @@ void mpegts_mux_open_table ( mpegts_mux_t *mm, mpegts_table_t *mt, int subscribe
void mpegts_mux_close_table ( mpegts_mux_t *mm, mpegts_table_t *mt );
void mpegts_mux_remove_subscriber(mpegts_mux_t *mm, th_subscription_t *s, int reason);
int mpegts_mux_subscribe(mpegts_mux_t *mm, const char *name, int weight);
int mpegts_mux_subscribe(mpegts_mux_t *mm, const char *name, int weight, int flags);
void mpegts_mux_unsubscribe_by_name(mpegts_mux_t *mm, const char *name);
void mpegts_mux_scan_done ( mpegts_mux_t *mm, const char *buf, int res );

View file

@ -120,7 +120,7 @@ linuxdvb_adapter_is_enabled ( linuxdvb_adapter_t *la )
{
linuxdvb_frontend_t *lfe;
LIST_FOREACH(lfe, &la->la_frontends, lfe_link) {
if (lfe->mi_is_enabled((mpegts_input_t*)lfe, NULL, "adapter"))
if (lfe->mi_is_enabled((mpegts_input_t*)lfe, NULL, 0))
return 1;
}
return 0;

View file

@ -263,12 +263,11 @@ linuxdvb_frontend_get_grace ( mpegts_input_t *mi, mpegts_mux_t *mm )
}
static int
linuxdvb_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
const char *reason )
linuxdvb_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
{
linuxdvb_frontend_t *lfe = (linuxdvb_frontend_t*)mi;
if (lfe->lfe_fe_path == NULL) return 0;
if (!mpegts_input_is_enabled(mi, mm, reason)) return 0;
if (!mpegts_input_is_enabled(mi, mm, flags)) return 0;
if (access(lfe->lfe_fe_path, R_OK | W_OK)) return 0;
if (lfe->lfe_in_setup) return 0;
return 1;

View file

@ -185,6 +185,22 @@ const idclass_t mpegts_input_class =
.off = offsetof(mpegts_input_t, mi_ota_epg),
.def.i = 1,
},
{
.type = PT_BOOL,
.id = "initscan",
.name = "Initial Scan",
.off = offsetof(mpegts_input_t, mi_initscan),
.def.i = 1,
.opts = PO_ADVANCED,
},
{
.type = PT_BOOL,
.id = "idlescan",
.name = "Idle Scan",
.off = offsetof(mpegts_input_t, mi_idlescan),
.def.i = 1,
.opts = PO_ADVANCED,
},
{
.type = PT_STR,
.id = "networks",
@ -204,10 +220,13 @@ const idclass_t mpegts_input_class =
* *************************************************************************/
int
mpegts_input_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
const char *reason )
mpegts_input_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
{
if (!strcmp(reason, "epggrab") && !mi->mi_ota_epg)
if ((flags & SUBSCRIPTION_EPG) != 0 && !mi->mi_ota_epg)
return 0;
if ((flags & SUBSCRIPTION_INITSCAN) != 0 && !mi->mi_initscan)
return 0;
if ((flags & SUBSCRIPTION_IDLESCAN) != 0 && !mi->mi_idlescan)
return 0;
return mi->mi_enabled;
}
@ -1123,6 +1142,8 @@ mpegts_input_create0
/* Defaults */
mi->mi_ota_epg = 1;
mi->mi_initscan = 1;
mi->mi_idlescan = 1;
/* Add to global list */
LIST_INSERT_HEAD(&mpegts_input_all, mi, mi_global_link);

View file

@ -275,7 +275,8 @@ mpegts_mux_class_scan_state_set ( void *o, const void *p )
return 0;
/* Start */
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_USER, 0);
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_USER,
SUBSCRIPTION_USERSCAN, 0);
/* Stop */
} else if (state == MM_SCAN_STATE_IDLE) {
@ -570,7 +571,7 @@ mpegts_mux_start
/* Calculate priority+weight and sort */
count = 0;
LIST_FOREACH(mmi, &mm->mm_instances, mmi_mux_link) {
int e = mmi->mmi_input->mi_is_enabled(mmi->mmi_input, mm, reason);
int e = mmi->mmi_input->mi_is_enabled(mmi->mmi_input, mm, flags);
tvhtrace("mpegts", "%s - mmi %p enabled %d", buf, mmi, e);
if (!e) continue;
enabled = 1;
@ -979,9 +980,11 @@ mpegts_mux_create0
/* Initial scan */
if (mm->mm_scan_result == MM_SCAN_NONE || !mn->mn_skipinitscan)
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT, 10);
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT,
SUBSCRIPTION_INITSCAN, 10);
else if (mm->mm_network->mn_idlescan)
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE, 10);
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE,
SUBSCRIPTION_IDLESCAN, 10);
mpegts_mux_nice_name(mm, buf, sizeof(buf));
tvhtrace("mpegts", "%s - created", buf);
@ -1079,7 +1082,7 @@ mpegts_mux_remove_subscriber
int
mpegts_mux_subscribe
( mpegts_mux_t *mm, const char *name, int weight )
( mpegts_mux_t *mm, const char *name, int weight, int flags )
{
int err = 0;
profile_chain_t prch;
@ -1087,7 +1090,7 @@ mpegts_mux_subscribe
memset(&prch, 0, sizeof(prch));
prch.prch_id = mm;
s = subscription_create_from_mux(&prch, weight, name,
SUBSCRIPTION_NONE,
SUBSCRIPTION_NONE | flags,
NULL, NULL, NULL, &err);
return s ? 0 : err;
}

View file

@ -600,7 +600,7 @@ dvb_mux_create_instances ( mpegts_mux_t *mm )
mpegts_network_link_t *mnl;
LIST_FOREACH(mnl, &mm->mm_network->mn_inputs, mnl_mn_link) {
mpegts_input_t *mi = mnl->mnl_input;
if (mi->mi_is_enabled(mi, mm, "service"))
if (mi->mi_is_enabled(mi, mm, 0))
mi->mi_create_mux_instance(mi, mm);
}
}

View file

@ -118,10 +118,13 @@ mpegts_network_class_idlescan_notify ( void *p )
mpegts_mux_t *mm;
LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link) {
if (mn->mn_idlescan)
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE, 0);
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE,
SUBSCRIPTION_IDLESCAN, 0);
else if (mm->mm_scan_state == MM_SCAN_STATE_PEND &&
mm->mm_scan_weight == SUBSCRIPTION_PRIO_SCAN_IDLE)
mm->mm_scan_weight == SUBSCRIPTION_PRIO_SCAN_IDLE) {
mm->mm_scan_flags = 0;
mpegts_network_scan_queue_del(mm);
}
}
}

View file

@ -50,7 +50,8 @@ mpegts_network_scan_timer_cb ( void *p )
assert(mm->mm_scan_state == MM_SCAN_STATE_PEND);
/* Attempt to tune */
r = mpegts_mux_subscribe(mm, "scan", mm->mm_scan_weight);
printf("mm->mm_scan_flags = 0x%x\n", mm->mm_scan_flags);
r = mpegts_mux_subscribe(mm, "scan", mm->mm_scan_weight, mm->mm_scan_flags);
/* Started */
if (!r) {
@ -123,7 +124,7 @@ mpegts_network_scan_mux_done0
/* Re-enable? */
if (weight > 0)
mpegts_network_scan_queue_add(mm, weight, 10);
mpegts_network_scan_queue_add(mm, weight, mm->mm_scan_flags, 10);
}
/* Failed - couldn't start */
@ -137,6 +138,7 @@ mpegts_network_scan_mux_fail ( mpegts_mux_t *mm )
void
mpegts_network_scan_mux_done ( mpegts_mux_t *mm )
{
mm->mm_scan_flags = 0;
mpegts_network_scan_mux_done0(mm, MM_SCAN_OK, 0);
}
@ -154,6 +156,9 @@ mpegts_network_scan_mux_cancel ( mpegts_mux_t *mm, int reinsert )
if (mm->mm_scan_state != MM_SCAN_STATE_ACTIVE)
return;
if (!reinsert)
mm->mm_scan_flags = 0;
mpegts_network_scan_mux_done0(mm, MM_SCAN_NONE,
reinsert ? mm->mm_scan_weight : 0);
}
@ -196,7 +201,8 @@ mpegts_network_scan_queue_del ( mpegts_mux_t *mm )
}
void
mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight, int delay )
mpegts_network_scan_queue_add
( mpegts_mux_t *mm, int weight, int flags, int delay )
{
int reload = 0;
char buf[256], buf2[256];;
@ -228,7 +234,10 @@ mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight, int delay )
buf2, buf, weight);
/* Add new entry */
mm->mm_scan_state = MM_SCAN_STATE_PEND;
mm->mm_scan_state = MM_SCAN_STATE_PEND;
mm->mm_scan_flags |= flags;
if (mm->mm_scan_flags == 0)
mm->mm_scan_flags = SUBSCRIPTION_IDLE;
TAILQ_INSERT_SORTED_R(&mn->mn_scan_pend, mpegts_mux_queue,
mm, mm_scan_link, mm_cmp);
gtimer_arm(&mn->mn_scan_timer, mpegts_network_scan_timer_cb, mn, delay);

View file

@ -33,7 +33,8 @@ void mpegts_network_scan_timer_cb ( void *p );
/*
* Registration functions
*/
void mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight, int delay );
void mpegts_network_scan_queue_add ( mpegts_mux_t *mm, int weight,
int flags, int delay );
void mpegts_network_scan_queue_del ( mpegts_mux_t *mm );
/*

View file

@ -242,7 +242,7 @@ mpegts_service_enlist(service_t *t, struct service_instance_list *sil, int flags
mi = mmi->mmi_input;
if (!mi->mi_is_enabled(mi, mmi->mmi_mux, "service")) continue;
if (!mi->mi_is_enabled(mi, mmi->mmi_mux, flags)) continue;
/* Set weight to -1 (forced) for already active mux */
if (mmi->mmi_mux->mm_active == mmi) {

View file

@ -366,8 +366,7 @@ satip_frontend_match_satcfg ( satip_frontend_t *lfe2, mpegts_mux_t *mm2 )
}
static int
satip_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
const char *reason )
satip_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
{
satip_frontend_t *lfe = (satip_frontend_t*)mi;
satip_frontend_t *lfe2;
@ -375,7 +374,7 @@ satip_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
lock_assert(&global_lock);
if (!mpegts_input_is_enabled(mi, mm, reason)) return 0;
if (!mpegts_input_is_enabled(mi, mm, flags)) return 0;
if (lfe->sf_device->sd_dbus_allow <= 0) return 0;
if (lfe->sf_type != DVB_TYPE_S) return 1;
/* check if the position is enabled */

View file

@ -64,12 +64,9 @@ tvhdhomerun_frontend_get_grace ( mpegts_input_t *mi, mpegts_mux_t *mm )
}
static int
tvhdhomerun_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm,
const char *reason )
tvhdhomerun_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags )
{
tvhdhomerun_frontend_t *hfe = (tvhdhomerun_frontend_t*)mi;
if (!hfe->mi_enabled) return 0;
return 1;
return mpegts_input_is_enabled(mi, mm, flags);
}
static void *

View file

@ -25,11 +25,15 @@ struct profile_chain;
extern struct th_subscription_list subscriptions;
#define SUBSCRIPTION_RAW_MPEGTS 0x01
#define SUBSCRIPTION_NONE 0x02
#define SUBSCRIPTION_FULLMUX 0x04
#define SUBSCRIPTION_STREAMING 0x08
#define SUBSCRIPTION_RESTART 0x10
#define SUBSCRIPTION_RAW_MPEGTS 0x001
#define SUBSCRIPTION_NONE 0x002
#define SUBSCRIPTION_FULLMUX 0x004
#define SUBSCRIPTION_STREAMING 0x008
#define SUBSCRIPTION_RESTART 0x010
#define SUBSCRIPTION_INITSCAN 0x020 ///< for mux subscriptions
#define SUBSCRIPTION_IDLESCAN 0x040 ///< for mux subscriptions
#define SUBSCRIPTION_USERSCAN 0x080 ///< for mux subscriptions
#define SUBSCRIPTION_EPG 0x100 ///< for mux subscriptions
/* Some internal prioties */
#define SUBSCRIPTION_PRIO_SCAN_IDLE 1 ///< Idle scanning