XMMS2
xform_plugin.c
Go to the documentation of this file.
1/* XMMS2 - X Music Multiplexer System
2 * Copyright (C) 2003-2011 XMMS2 Team
3 *
4 * PLUGINS ARE NOT CONSIDERED TO BE DERIVED WORK !!!
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 */
16
17#include "xmmspriv/xmms_xform.h"
19#include "xmms/xmms_log.h"
20
21struct xmms_xform_plugin_St {
22 xmms_plugin_t plugin;
24 GList *in_types;
25};
26
27static void
28destroy (xmms_object_t *obj)
29{
31
32 while (plugin->in_types) {
33 xmms_object_unref (plugin->in_types->data);
34
35 plugin->in_types = g_list_delete_link (plugin->in_types,
36 plugin->in_types);
37 }
38
40}
41
44{
46
47 res = xmms_object_new (xmms_xform_plugin_t, destroy);
48
49 return (xmms_plugin_t *)res;
50}
51
52void
54 xmms_xform_methods_t *methods)
55{
56 g_return_if_fail (plugin);
57 g_return_if_fail (plugin->plugin.type == XMMS_PLUGIN_TYPE_XFORM);
58
59 XMMS_DBG ("Registering xform '%s'",
61
62 memcpy (&plugin->methods, methods, sizeof (xmms_xform_methods_t));
63}
64
65gboolean
67{
68 xmms_xform_plugin_t *plugin = (xmms_xform_plugin_t *) _plugin;
69
70 g_return_val_if_fail (plugin, FALSE);
71 g_return_val_if_fail (plugin->plugin.type == XMMS_PLUGIN_TYPE_XFORM, FALSE);
72
73 /* more checks */
74
75 return TRUE;
76}
77
78void
80{
82 va_list ap;
83 gchar *config_key, config_value[32];
84 gint priority;
85
86 va_start (ap, plugin);
88 va_end (ap);
89
90 config_key = g_strconcat ("priority.",
92 NULL);
94 g_snprintf (config_value, sizeof (config_value), "%d", priority);
96 config_value, NULL, NULL);
97 g_free (config_key);
98
99 plugin->in_types = g_list_prepend (plugin->in_types, t);
100}
101
102gboolean
104 gint *priority)
105{
106 GList *t;
107
108 g_return_val_if_fail (st, FALSE);
109 g_return_val_if_fail (plugin, FALSE);
110 g_return_val_if_fail (priority, FALSE);
111
112 for (t = plugin->in_types; t; t = g_list_next (t)) {
113 xmms_config_property_t *config_priority;
114 const gchar *type_name;
115 gchar *config_key;
116
117 if (!xmms_stream_type_match (t->data, st)) {
118 continue;
119 }
120
121 type_name = xmms_stream_type_get_str (t->data, XMMS_STREAM_TYPE_NAME);
122
123 config_key = g_strconcat ("priority.", type_name, NULL);
124 config_priority = xmms_plugin_config_lookup ((xmms_plugin_t *) plugin,
125 config_key);
126 g_free (config_key);
127
128 if (config_priority) {
129 *priority = xmms_config_property_get_int (config_priority);
130 } else {
132 }
133
134 return TRUE;
135 }
136
137 return FALSE;
138}
139
142 const gchar *name,
143 const gchar *default_value,
145 gpointer userdata)
146{
147 xmms_plugin_t *plugin = (xmms_plugin_t *) xform_plugin;
148
149 return xmms_plugin_config_property_register (plugin, name,
150 default_value,
151 cb, userdata);
152}
153
154gboolean
156{
157 return !!plugin->methods.init;
158}
159
160gboolean
162{
163 return !!plugin->methods.read;
164}
165
166gboolean
168{
169 return !!plugin->methods.seek;
170}
171
172gboolean
174{
175 return !!plugin->methods.browse;
176}
177
178gboolean
180{
181 return !!plugin->methods.destroy;
182}
183
184gboolean
186{
187 return plugin->methods.init (xform);
188}
189
190gint
192 xmms_sample_t *buf, gint length, xmms_error_t *error)
193{
194 return plugin->methods.read (xform, buf, length, error);
195}
196
197gint64
199 gint64 offset, xmms_xform_seek_mode_t whence,
200 xmms_error_t *err)
201{
202 return plugin->methods.seek (xform, offset, whence, err);
203}
204
205
206gboolean
208 const gchar *url, xmms_error_t *error)
209{
210 return plugin->methods.browse (xform, url, error);
211}
212
213void
215{
216 plugin->methods.destroy (xform);
217}
218
gint xmms_config_property_get_int(const xmms_config_property_t *prop)
Return the value of a config property as an int.
Definition: config.c:255
struct xmms_xform_plugin_St xmms_xform_plugin_t
Xform plugin.
struct xmms_xform_St xmms_xform_t
xmms_config_property_t * xmms_xform_plugin_config_property_register(xmms_xform_plugin_t *xform_plugin, const gchar *name, const gchar *default_value, xmms_object_handler_t cb, gpointer userdata)
Definition: xform_plugin.c:141
void xmms_xform_plugin_indata_add(xmms_xform_plugin_t *plugin,...)
Add a valid input type to the plugin.
Definition: xform_plugin.c:79
void xmms_xform_plugin_methods_set(xmms_xform_plugin_t *plugin, xmms_xform_methods_t *methods)
Should be called once from the plugin's setupfunc.
Definition: xform_plugin.c:53
enum xmms_xform_seek_mode_E xmms_xform_seek_mode_t
Seek direction argument.
void xmms_plugin_destroy(xmms_plugin_t *plugin)
Definition: plugin.c:466
const gchar * xmms_plugin_shortname_get(const xmms_plugin_t *plugin)
Definition: plugin.c:158
xmms_config_property_t * xmms_plugin_config_lookup(xmms_plugin_t *plugin, const gchar *key)
Definition: plugin.c:76
xmms_config_property_t * xmms_plugin_config_property_register(xmms_plugin_t *plugin, const gchar *name, const gchar *default_value, xmms_object_handler_t cb, gpointer userdata)
Definition: plugin.c:104
const char * xmms_stream_type_get_str(const xmms_stream_type_t *st, xmms_stream_type_key_t key)
Definition: streamtype.c:148
gboolean xmms_stream_type_match(const xmms_stream_type_t *in_type, const xmms_stream_type_t *out_type)
Definition: streamtype.c:210
gint xmms_stream_type_get_int(const xmms_stream_type_t *st, xmms_stream_type_key_t key)
Definition: streamtype.c:171
xmms_stream_type_t * xmms_stream_type_parse(va_list ap)
Definition: streamtype.c:71
Methods provided by an xform plugin.
gboolean xmms_xform_plugin_can_browse(const xmms_xform_plugin_t *plugin)
Definition: xform_plugin.c:173
gboolean xmms_xform_plugin_supports(const xmms_xform_plugin_t *plugin, xmms_stream_type_t *st, gint *priority)
Definition: xform_plugin.c:103
gboolean xmms_xform_plugin_can_destroy(const xmms_xform_plugin_t *plugin)
Definition: xform_plugin.c:179
void xmms_xform_plugin_destroy(const xmms_xform_plugin_t *plugin, xmms_xform_t *xform)
Definition: xform_plugin.c:214
gboolean xmms_xform_plugin_can_init(const xmms_xform_plugin_t *plugin)
Definition: xform_plugin.c:155
gboolean xmms_xform_plugin_can_read(const xmms_xform_plugin_t *plugin)
Definition: xform_plugin.c:161
gboolean xmms_xform_plugin_browse(const xmms_xform_plugin_t *plugin, xmms_xform_t *xform, const gchar *url, xmms_error_t *error)
Definition: xform_plugin.c:207
gint64 xmms_xform_plugin_seek(const xmms_xform_plugin_t *plugin, xmms_xform_t *xform, gint64 offset, xmms_xform_seek_mode_t whence, xmms_error_t *err)
Definition: xform_plugin.c:198
gboolean xmms_xform_plugin_init(const xmms_xform_plugin_t *plugin, xmms_xform_t *xform)
Definition: xform_plugin.c:185
gint xmms_xform_plugin_read(const xmms_xform_plugin_t *plugin, xmms_xform_t *xform, xmms_sample_t *buf, gint length, xmms_error_t *error)
Definition: xform_plugin.c:191
xmms_plugin_t * xmms_xform_plugin_new(void)
Definition: xform_plugin.c:43
gboolean xmms_xform_plugin_can_seek(const xmms_xform_plugin_t *plugin)
Definition: xform_plugin.c:167
gboolean xmms_xform_plugin_verify(xmms_plugin_t *_plugin)
Definition: xform_plugin.c:66
struct xmms_config_property_St xmms_config_property_t
Definition: xmms_config.h:26
#define XMMS_DBG(fmt,...)
Definition: xmms_log.h:32
void xmms_sample_t
Definition: xmms_sample.h:58
#define XMMS_STREAM_TYPE_PRIORITY_DEFAULT
@ XMMS_STREAM_TYPE_NAME
@ XMMS_STREAM_TYPE_PRIORITY
struct xmms_stream_type_St xmms_stream_type_t
G_BEGIN_DECLS struct xmms_error_St xmms_error_t
void(* xmms_object_handler_t)(xmms_object_t *object, xmmsv_t *data, gpointer userdata)
Definition: xmms_object.h:66
#define xmms_object_new(objtype, destroyfunc)
Definition: xmms_object.h:115
#define xmms_object_unref(obj)
Definition: xmms_object.h:109
@ XMMS_PLUGIN_TYPE_XFORM