/* 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)
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
int mi_ota_epg;
+ int mi_initscan;
+ int mi_idlescan;
+
LIST_ENTRY(mpegts_input) mi_global_link;
mpegts_network_link_list_t mi_networks;
/*
* 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*);
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 );
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 );
{
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;
}
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;
.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",
* *************************************************************************/
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;
}
/* 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);
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) {
/* 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;
/* 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);
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;
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;
}
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);
}
}
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);
+ }
}
}
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) {
/* 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 */
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);
}
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);
}
}
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];;
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);
/*
* 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 );
/*
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) {
}
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;
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 */
}
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 *
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