PA_MODULE_DESCRIPTION("Load filter sinks automatically when needed");
PA_MODULE_VERSION(PACKAGE_VERSION);
PA_MODULE_LOAD_ONCE(true);
-PA_MODULE_USAGE(_("autoclean=<automatically unload unused filters?>"));
+PA_MODULE_USAGE(
+ _("autoclean=<automatically unload unused filters?> "
+ "autoclean_internal=<interval time(sec) of unloading filters. Default: 10> "));
static const char* const valid_modargs[] = {
"autoclean",
+ "autoclean_interval",
NULL
};
#define DEFAULT_AUTOCLEAN true
-#define HOUSEKEEPING_INTERVAL (10 * PA_USEC_PER_SEC)
+#define DEFAULT_AUTOCLEAN_INTERVAL 10
struct filter {
char *name;
*source_output_unlink_slot,
*source_unlink_slot;
bool autoclean;
+ uint32_t autoclean_interval;
pa_time_event *housekeeping_time_event;
};
pa_log_info("Housekeeping Done.");
}
+static pa_usec_t get_housekeeping_interval(struct userdata *u) {
+ pa_assert(u);
+
+ return u->autoclean_interval * PA_USEC_PER_SEC;
+}
+
static void trigger_housekeeping(struct userdata *u) {
pa_assert(u);
if (u->housekeeping_time_event)
return;
- u->housekeeping_time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + HOUSEKEEPING_INTERVAL, housekeeping_time_callback, u);
+ u->housekeeping_time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + get_housekeeping_interval(u), housekeeping_time_callback, u);
}
static int do_move(pa_object *obj, pa_object *parent, bool restore, bool is_input) {
goto fail;
}
+ u->autoclean_interval = DEFAULT_AUTOCLEAN_INTERVAL;
+ if (pa_modargs_get_value_u32(ma, "autoclean_interval", &u->autoclean_interval) < 0) {
+ pa_log("Failed to parse autoclean_interval value");
+ goto fail;
+ }
+
u->filters = pa_hashmap_new(filter_hash, filter_compare);
u->sink_input_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_put_cb, u);