diff --git a/src/epggrab/otamux.c b/src/epggrab/otamux.c index 4a219f1d..c36b1547 100644 --- a/src/epggrab/otamux.c +++ b/src/epggrab/otamux.c @@ -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) diff --git a/src/input/mpegts.h b/src/input/mpegts.h index b424b5e4..cf899a82 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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 ); diff --git a/src/input/mpegts/linuxdvb/linuxdvb_adapter.c b/src/input/mpegts/linuxdvb/linuxdvb_adapter.c index 1e58c83d..b34c1cb0 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_adapter.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_adapter.c @@ -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; diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index 81ce6c15..83159ce4 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -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; diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index b5e46c67..8605d9d9 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -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); diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index a5295475..d4a647b0 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -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; } diff --git a/src/input/mpegts/mpegts_mux_dvb.c b/src/input/mpegts/mpegts_mux_dvb.c index 0c6074f4..7784c613 100644 --- a/src/input/mpegts/mpegts_mux_dvb.c +++ b/src/input/mpegts/mpegts_mux_dvb.c @@ -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); } } diff --git a/src/input/mpegts/mpegts_network.c b/src/input/mpegts/mpegts_network.c index 5e95da3b..4a0ac58f 100644 --- a/src/input/mpegts/mpegts_network.c +++ b/src/input/mpegts/mpegts_network.c @@ -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); + } } } diff --git a/src/input/mpegts/mpegts_network_scan.c b/src/input/mpegts/mpegts_network_scan.c index 5021fdd2..1657bbab 100644 --- a/src/input/mpegts/mpegts_network_scan.c +++ b/src/input/mpegts/mpegts_network_scan.c @@ -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); diff --git a/src/input/mpegts/mpegts_network_scan.h b/src/input/mpegts/mpegts_network_scan.h index 349d7878..7f44d3c8 100644 --- a/src/input/mpegts/mpegts_network_scan.h +++ b/src/input/mpegts/mpegts_network_scan.h @@ -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 ); /* diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index 034594ea..1d561e09 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -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) { diff --git a/src/input/mpegts/satip/satip_frontend.c b/src/input/mpegts/satip/satip_frontend.c index 703d49a0..53a8f4d1 100644 --- a/src/input/mpegts/satip/satip_frontend.c +++ b/src/input/mpegts/satip/satip_frontend.c @@ -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 */ diff --git a/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c b/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c index 07fcc894..e0ac5dfd 100644 --- a/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c +++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c @@ -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 * diff --git a/src/subscriptions.h b/src/subscriptions.h index d6461444..968da66c 100644 --- a/src/subscriptions.h +++ b/src/subscriptions.h @@ -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