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 
21 struct xmms_xform_plugin_St {
22  xmms_plugin_t plugin;
23  xmms_xform_methods_t methods;
24  GList *in_types;
25 };
26 
27 static void
28 destroy (xmms_object_t *obj)
29 {
30  xmms_xform_plugin_t *plugin = (xmms_xform_plugin_t *) obj;
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 
52 void
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 
65 gboolean
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 
78 void
80 {
82  va_list ap;
83  gchar *config_key, config_value[32];
84  gint priority;
85 
86  va_start (ap, plugin);
87  t = xmms_stream_type_parse (ap);
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 
102 gboolean
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 
154 gboolean
156 {
157  return !!plugin->methods.init;
158 }
159 
160 gboolean
162 {
163  return !!plugin->methods.read;
164 }
165 
166 gboolean
168 {
169  return !!plugin->methods.seek;
170 }
171 
172 gboolean
174 {
175  return !!plugin->methods.browse;
176 }
177 
178 gboolean
180 {
181  return !!plugin->methods.destroy;
182 }
183 
184 gboolean
186 {
187  return plugin->methods.init (xform);
188 }
189 
190 gint
192  xmms_sample_t *buf, gint length, xmms_error_t *error)
193 {
194  return plugin->methods.read (xform, buf, length, error);
195 }
196 
197 gint64
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 
206 gboolean
208  const gchar *url, xmms_error_t *error)
209 {
210  return plugin->methods.browse (xform, url, error);
211 }
212 
213 void
215 {
216  plugin->methods.destroy (xform);
217 }
218 
struct xmms_xform_plugin_St xmms_xform_plugin_t
Xform plugin.
gint xmms_stream_type_get_int(const xmms_stream_type_t *st, xmms_stream_type_key_t key)
Definition: streamtype.c:171
#define xmms_object_unref(obj)
Definition: xmms_object.h:109
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
struct xmms_stream_type_St xmms_stream_type_t
gboolean xmms_xform_plugin_can_read(const xmms_xform_plugin_t *plugin)
Definition: xform_plugin.c:161
void xmms_xform_plugin_indata_add(xmms_xform_plugin_t *plugin,...)
Add a valid input type to the plugin.
Definition: xform_plugin.c:79
struct xmms_xform_St xmms_xform_t
gboolean xmms_xform_plugin_can_seek(const xmms_xform_plugin_t *plugin)
Definition: xform_plugin.c:167
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
const gchar * xmms_plugin_shortname_get(const xmms_plugin_t *plugin)
Definition: plugin.c:158
gboolean xmms_xform_plugin_can_destroy(const xmms_xform_plugin_t *plugin)
Definition: xform_plugin.c:179
xmms_plugin_t * xmms_xform_plugin_new(void)
Definition: xform_plugin.c:43
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
gboolean xmms_stream_type_match(const xmms_stream_type_t *in_type, const xmms_stream_type_t *out_type)
Definition: streamtype.c:210
void xmms_sample_t
Definition: xmms_sample.h:58
enum xmms_xform_seek_mode_E xmms_xform_seek_mode_t
Seek direction argument.
Methods provided by an xform plugin.
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
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
#define XMMS_STREAM_TYPE_PRIORITY_DEFAULT
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_plugin_destroy(xmms_plugin_t *plugin)
Definition: plugin.c:466
gboolean xmms_xform_plugin_init(const xmms_xform_plugin_t *plugin, xmms_xform_t *xform)
Definition: xform_plugin.c:185
gboolean xmms_xform_plugin_can_init(const xmms_xform_plugin_t *plugin)
Definition: xform_plugin.c:155
#define XMMS_DBG(fmt,...)
Definition: xmms_log.h:32
gboolean xmms_xform_plugin_can_browse(const xmms_xform_plugin_t *plugin)
Definition: xform_plugin.c:173
#define xmms_object_new(objtype, destroyfunc)
Definition: xmms_object.h:115
G_BEGIN_DECLS struct xmms_error_St xmms_error_t
xmms_config_property_t * xmms_plugin_config_lookup(xmms_plugin_t *plugin, const gchar *key)
Definition: plugin.c:76
struct xmms_config_property_St xmms_config_property_t
Definition: xmms_config.h:26
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
const char * xmms_stream_type_get_str(const xmms_stream_type_t *st, xmms_stream_type_key_t key)
Definition: streamtype.c:148
void xmms_xform_plugin_destroy(const xmms_xform_plugin_t *plugin, xmms_xform_t *xform)
Definition: xform_plugin.c:214
xmms_stream_type_t * xmms_stream_type_parse(va_list ap)
Definition: streamtype.c:71
gboolean xmms_xform_plugin_supports(const xmms_xform_plugin_t *plugin, xmms_stream_type_t *st, gint *priority)
Definition: xform_plugin.c:103
void(* xmms_object_handler_t)(xmms_object_t *object, xmmsv_t *data, gpointer userdata)
Definition: xmms_object.h:66
gboolean xmms_xform_plugin_verify(xmms_plugin_t *_plugin)
Definition: xform_plugin.c:66