static gboolean xmms_xform_match (xmms_plugin_t *plugin, gpointer user_data) { xmms_xform_plugin_t *xform_plugin = (xmms_xform_plugin_t *) plugin; match_state_t *state = (match_state_t *) user_data; gint priority = 0; g_assert (plugin->type == XMMS_PLUGIN_TYPE_XFORM); XMMS_DBG ("Trying plugin '%s'", xmms_plugin_shortname_get (plugin)); if (!xmms_xform_plugin_supports (xform_plugin, state->out_type, &priority)) { return TRUE; } XMMS_DBG ("Plugin '%s' matched (priority %d)", xmms_plugin_shortname_get (plugin), priority); if (priority > state->priority) { if (state->match) { xmms_plugin_t *previous_plugin = (xmms_plugin_t *) state->match; XMMS_DBG ("Using plugin '%s' (priority %d) instead of '%s' (priority %d)", xmms_plugin_shortname_get (plugin), priority, xmms_plugin_shortname_get (previous_plugin), state->priority); } state->match = xform_plugin; state->priority = priority; } return TRUE; }
xmms_xform_t * xmms_xform_chain_setup_url_session (xmms_medialib_t *medialib, xmms_medialib_session_t *session, xmms_medialib_entry_t entry, const gchar *url, GList *goal_formats, gboolean rehash) { xmms_xform_t *last; xmms_plugin_t *plugin; xmms_xform_plugin_t *xform_plugin; gboolean add_segment = FALSE; gint priority; last = chain_setup (medialib, entry, url, goal_formats); if (!last) { return NULL; } /* first check that segment plugin is available in the system */ plugin = xmms_plugin_find (XMMS_PLUGIN_TYPE_XFORM, "segment"); xform_plugin = (xmms_xform_plugin_t *) plugin; /* if segment plugin input is the same as current output, include it * for collecting additional duration metadata on audio entries */ if (xform_plugin) { add_segment = xmms_xform_plugin_supports (xform_plugin, last->out_type, &priority); xmms_object_unref (plugin); } /* add segment plugin to the chain if it can be added */ if (add_segment) { last = xmms_xform_new_effect (last, entry, goal_formats, "segment"); if (!last) { return NULL; } } /* if not rehashing, also initialize all the effect plugins */ if (!rehash) { last = add_effects (last, entry, goal_formats); if (!last) { return NULL; } } chain_finalize (session, last, entry, url, rehash); return last; }
static xmms_xform_t * xmms_xform_new_effect (xmms_xform_t *last, xmms_medialib_entry_t entry, GList *goal_formats, const gchar *name) { xmms_plugin_t *plugin; xmms_xform_plugin_t *xform_plugin; xmms_xform_t *xform; gint priority; plugin = xmms_plugin_find (XMMS_PLUGIN_TYPE_XFORM, name); if (!plugin) { xmms_log_error ("Couldn't find any effect named '%s'", name); return last; } xform_plugin = (xmms_xform_plugin_t *) plugin; if (!xmms_xform_plugin_supports (xform_plugin, last->out_type, &priority)) { xmms_log_info ("Effect '%s' doesn't support format, skipping", xmms_plugin_shortname_get (plugin)); xmms_object_unref (plugin); return last; } xform = xmms_xform_new (xform_plugin, last, entry, goal_formats); if (xform) { xmms_object_unref (last); last = xform; } else { xmms_log_info ("Effect '%s' failed to initialize, skipping", xmms_plugin_shortname_get (plugin)); } xmms_xform_plugin_config_property_register (xform_plugin, "enabled", "0", NULL, NULL); xmms_object_unref (plugin); return last; }