mpegts inputs: allow to disable init/idle scan per tuner/input, fixes #2475
This commit is contained in:
parent
7e5abcb0c4
commit
af4a2af9ab
14 changed files with 80 additions and 39 deletions
|
@ -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)
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 );
|
||||
|
||||
/*
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue