#include <assert.h>
static void mpegts_mux_scan_timeout ( void *p );
+static void mpegts_mux_do_stop ( mpegts_mux_t *mm, int delconf );
+
+
/* ****************************************************************************
* Mux instance (input linkage)
* ***************************************************************************/
{ N_("OK"), MM_SCAN_OK },
{ N_("FAIL"), MM_SCAN_FAIL },
{ N_("OK (partial)"), MM_SCAN_PARTIAL },
+ { N_("IGNORE"), MM_SCAN_IGNORE },
};
int
if (!mm->mm_is_enabled(mm)) {
mm->mm_stop(mm, 1, SM_CODE_MUX_NOT_ENABLED);
mpegts_network_scan_mux_cancel(mm, 0);
+ if (mm->mm_enabled == MM_IGNORE) {
+ mpegts_mux_do_stop(mm, 1);
+ mm->mm_scan_result = MM_SCAN_IGNORE;
+ }
}
}
+static htsmsg_t *
+mpegts_mux_enable_list ( void *o, const char *lang )
+{
+ static const struct strtab tab[] = {
+ { N_("Ignore"), MM_IGNORE },
+ { N_("Disable"), MM_DISABLE },
+ { N_("Enable"), MM_ENABLE },
+ };
+ return strtab2htsmsg(tab, 1, lang);
+}
+
static htsmsg_t *
mpegts_mux_epg_list ( void *o, const char *lang )
{
.ic_get_title = mpegts_mux_class_get_title,
.ic_properties = (const property_t[]){
{
- .type = PT_BOOL,
+ .type = PT_INT,
.id = "enabled",
.name = N_("Enabled"),
- .desc = N_("Enable or disable the mux."),
+ .desc = N_("Enable, disable or ignore the mux. "
+ "When the mux is marked as ignore, "
+ "all discovered services are removed."),
.off = offsetof(mpegts_mux_t, mm_enabled),
- .def.i = 1,
+ .def.i = MM_ENABLE,
+ .list = mpegts_mux_enable_list,
.notify = mpegts_mux_class_enabled_notify,
+ .opts = PO_DOC_NLIST
},
{
.type = PT_INT,
mm->mm_onid, mm->mm_tsid);
}
-void
-mpegts_mux_delete ( mpegts_mux_t *mm, int delconf )
+static void
+mpegts_mux_do_stop ( mpegts_mux_t *mm, int delconf )
{
mpegts_mux_instance_t *mmi;
- mpegts_service_t *s;
th_subscription_t *ths;
- char buf[256];
-
- idnode_save_check(&mm->mm_id, delconf);
-
- mpegts_mux_nice_name(mm, buf, sizeof(buf));
- tvhinfo("mpegts", "%s (%p) - deleting", buf, mm);
-
- /* Stop */
- mm->mm_stop(mm, 1, SM_CODE_ABORTED);
-
- /* Remove from network */
- LIST_REMOVE(mm, mm_network_link);
+ mpegts_service_t *s;
/* Cancel scan */
mpegts_network_scan_queue_del(mm);
/* Stop PID timer */
mtimer_disarm(&mm->mm_update_pids_timer);
+}
+
+void
+mpegts_mux_delete ( mpegts_mux_t *mm, int delconf )
+{
+ char buf[256];
+
+ idnode_save_check(&mm->mm_id, delconf);
+
+ mpegts_mux_nice_name(mm, buf, sizeof(buf));
+ tvhinfo("mpegts", "%s (%p) - deleting", buf, mm);
+
+ /* Stop */
+ mm->mm_stop(mm, 1, SM_CODE_ABORTED);
+
+ /* Remove from network */
+ LIST_REMOVE(mm, mm_network_link);
+
+ /* Real stop */
+ mpegts_mux_do_stop(mm, delconf);
/* Free memory */
idnode_save_check(&mm->mm_id, 1);
static int
mpegts_mux_is_enabled ( mpegts_mux_t *mm )
{
- return mm->mm_enabled;
+ return mm->mm_enabled == MM_ENABLE;
}
static int
}
/* Enabled by default */
- mm->mm_enabled = 1;
- mm->mm_epg = 1;
+ mm->mm_enabled = MM_ENABLE;
+ mm->mm_epg = MM_EPG_ENABLE;
/* Identification */
mm->mm_onid = onid;
if (conf)
idnode_load(&mm->mm_id, conf);
+ if (mm->mm_enabled == MM_IGNORE)
+ mm->mm_scan_result = MM_SCAN_IGNORE;
+
/* Initial scan */
if (mm->mm_scan_result == MM_SCAN_NONE || !mn->mn_skipinitscan)
mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT,
/* Create */
LIST_FOREACH(dmc, &sfn->sfn_muxes, dmc_link) {
- if (!(mm = dvb_network_find_mux(ln, dmc, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE))) {
+ if (!(mm = dvb_network_find_mux(ln, dmc, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE, 0))) {
mm = dvb_mux_create0(ln, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE,
dmc, NULL, NULL);
if (mm)
dvb_mux_t *
dvb_network_find_mux
- ( dvb_network_t *ln, dvb_mux_conf_t *dmc, uint16_t onid, uint16_t tsid )
+ ( dvb_network_t *ln, dvb_mux_conf_t *dmc, uint16_t onid, uint16_t tsid, int check )
{
int deltaf, deltar;
mpegts_mux_t *mm, *mm_alt = NULL;
LIST_FOREACH(mm, &ln->mn_muxes, mm_network_link) {
+
+ if (check && mm->mm_enabled != MM_ENABLE) continue;
+
deltaf = 2000; // 2K/MHz
deltar = 1000;
dvb_mux_t *lm = (dvb_mux_t*)mm;
}
ln = (dvb_network_t*)mn;
- mm = dvb_network_find_mux(ln, dmc, onid, tsid);
+ mm = dvb_network_find_mux(ln, dmc, onid, tsid, 0);
if (!mm && (ln->mn_autodiscovery || force)) {
cls = dvb_network_mux_class((mpegts_network_t *)ln);
save |= cls == &dvb_mux_dvbt_class && dmc->dmc_fe_type == DVB_TYPE_T;