1 /* Libvisual-plugins - Standard plugins for libvisual
2 *
3 * Copyright (C) 2004, 2005, 2006 Dennis Smit <ds@nerds-incorporated.org>
4 *
5 * Authors: Dennis Smit <ds@nerds-incorporated.org>
6 *
7 * $Id: actor_jakdaw.c,v 1.26 2006/01/27 20:19:16 synap Exp $
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
23
24 #include <config.h>
25
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <unistd.h>
29 #include <fcntl.h>
30 #include <string.h>
31 #include <gettext.h>
32
33 #include "feedback.h"
34 #include "plotter.h"
35
36 #include <libvisual/libvisual.h>
37
38 int act_jakdaw_init (VisPluginData *plugin);
39 int act_jakdaw_cleanup (VisPluginData *plugin);
40 int act_jakdaw_requisition (VisPluginData *plugin, int *width, int *height);
41 int act_jakdaw_dimension (VisPluginData *plugin, VisVideo *video, int width, int height);
42 int act_jakdaw_events (VisPluginData *plugin, VisEventQueue *events);
43 VisPalette *act_jakdaw_palette (VisPluginData *plugin);
44 int act_jakdaw_render (VisPluginData *plugin, VisVideo *video, VisAudio *audio);
45
46 VISUAL_PLUGIN_API_VERSION_VALIDATOR
47
get_plugin_info(int * count)48 const VisPluginInfo *get_plugin_info (int *count)
49 {
50 static VisActorPlugin actor[] = {{
51 .requisition = act_jakdaw_requisition,
52 .palette = act_jakdaw_palette,
53 .render = act_jakdaw_render,
54 .vidoptions.depth = VISUAL_VIDEO_DEPTH_32BIT
55 }};
56
57 static VisPluginInfo info[] = {{
58 .type = VISUAL_PLUGIN_TYPE_ACTOR,
59
60 .plugname = "jakdaw",
61 .name = "Jakdaw plugin",
62 .author = N_("Original by: Christopher Wilson <Jakdaw@usa.net>, Port by: Dennis Smit <ds@nerds-incorporated.org>"),
63 .version = "0.0.1",
64 .about = N_("jakdaw visual plugin"),
65 .help = N_("This is the libvisual port of the xmms Jakdaw plugin"),
66 .license = VISUAL_PLUGIN_LICENSE_GPL,
67
68 .init = act_jakdaw_init,
69 .cleanup = act_jakdaw_cleanup,
70 .events = act_jakdaw_events,
71
72 .plugin = VISUAL_OBJECT (&actor[0])
73 }};
74
75 *count = sizeof (info) / sizeof (*info);
76
77 return info;
78 }
79
act_jakdaw_init(VisPluginData * plugin)80 int act_jakdaw_init (VisPluginData *plugin)
81 {
82 JakdawPrivate *priv;
83 VisParamContainer *paramcontainer = visual_plugin_get_params (plugin);
84
85 static VisParamEntry params[] = {
86 VISUAL_PARAM_LIST_ENTRY_INTEGER ("zoom mode", FEEDBACK_ZOOMRIPPLE),
87 VISUAL_PARAM_LIST_ENTRY_INTEGER ("plotter trigger", PLOTTER_COLOUR_MUSICTRIG),
88 VISUAL_PARAM_LIST_ENTRY_INTEGER ("plotter type", PLOTTER_SCOPE_LINES),
89 VISUAL_PARAM_LIST_END
90 };
91
92 static VisParamEntry zoomparamchoices[] = {
93 VISUAL_PARAM_LIST_ENTRY_INTEGER ("Zoom ripple", FEEDBACK_ZOOMRIPPLE),
94 VISUAL_PARAM_LIST_ENTRY_INTEGER ("Blur only", FEEDBACK_BLURONLY),
95 VISUAL_PARAM_LIST_ENTRY_INTEGER ("Zoom rotate", FEEDBACK_ZOOMROTATE),
96 VISUAL_PARAM_LIST_ENTRY_INTEGER ("Scroll", FEEDBACK_SCROLL),
97 VISUAL_PARAM_LIST_ENTRY_INTEGER ("Into screen", FEEDBACK_INTOSCREEN),
98 VISUAL_PARAM_LIST_ENTRY_INTEGER ("Ripple", FEEDBACK_NEWRIPPLE),
99 VISUAL_PARAM_LIST_END
100 };
101
102 static VisParamEntry colorparamchoices[] = {
103 VISUAL_PARAM_LIST_ENTRY_INTEGER ("Solid", PLOTTER_COLOUR_SOLID),
104 VISUAL_PARAM_LIST_ENTRY_INTEGER ("Random", PLOTTER_COLOUR_RANDOM),
105 VISUAL_PARAM_LIST_ENTRY_INTEGER ("On music", PLOTTER_COLOUR_MUSICTRIG),
106 VISUAL_PARAM_LIST_END
107 };
108
109
110 static VisParamEntry scopeparamchoices[] = {
111 VISUAL_PARAM_LIST_ENTRY_INTEGER ("Lines", PLOTTER_SCOPE_LINES),
112 VISUAL_PARAM_LIST_ENTRY_INTEGER ("Dots", PLOTTER_SCOPE_DOTS),
113 VISUAL_PARAM_LIST_ENTRY_INTEGER ("Solid", PLOTTER_SCOPE_SOLID),
114 VISUAL_PARAM_LIST_ENTRY_INTEGER ("Nothing", PLOTTER_SCOPE_NOTHING),
115 VISUAL_PARAM_LIST_END
116 };
117
118 /* UI vars */
119 VisUIWidget *table;
120 VisUIWidget *label1;
121 VisUIWidget *label2;
122 VisUIWidget *label3;
123 VisUIWidget *popup1;
124 VisUIWidget *popup2;
125 VisUIWidget *popup3;
126
127 #if ENABLE_NLS
128 bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
129 #endif
130
131 priv = visual_mem_new0 (JakdawPrivate, 1);
132 visual_object_set_private (VISUAL_OBJECT (plugin), priv);
133
134 priv->rcontext = visual_plugin_get_random_context (plugin);
135
136 priv->decay_rate = 1;
137
138 priv->zoom_ripplesize = 32;
139 priv->zoom_ripplefact = 0.1;
140 priv->zoom_zoomfact = 0.9;
141
142 priv->plotter_amplitude = 0.5;
143
144 /* FIXME make param of this one as well */
145 priv->plotter_scopecolor = 0xff00ff;
146
147 visual_param_container_add_many (paramcontainer, params);
148
149 table = visual_ui_table_new (3, 2);
150
151 label1 = visual_ui_label_new (_("Blur mode:"), FALSE);
152 label2 = visual_ui_label_new (_("Plotter color:"), FALSE);
153 label3 = visual_ui_label_new (_("Plotter type:"), FALSE);
154
155 popup1 = visual_ui_popup_new ();
156 visual_ui_widget_set_tooltip (popup1, _("The method of blurring"));
157 visual_ui_mutator_set_param (VISUAL_UI_MUTATOR (popup1), visual_param_container_get (paramcontainer, "zoom mode"));
158 visual_ui_choice_add_many (VISUAL_UI_CHOICE (popup1), zoomparamchoices);
159
160 popup2 = visual_ui_popup_new ();
161 visual_ui_widget_set_tooltip (popup2, _("The color of the plotter"));
162 visual_ui_mutator_set_param (VISUAL_UI_MUTATOR (popup2), visual_param_container_get (paramcontainer, "plotter trigger"));
163 visual_ui_choice_add_many (VISUAL_UI_CHOICE (popup2), colorparamchoices);
164
165 popup3 = visual_ui_popup_new ();
166 visual_ui_widget_set_tooltip (popup3, _("The plotter it's shape"));
167 visual_ui_mutator_set_param (VISUAL_UI_MUTATOR (popup3), visual_param_container_get (paramcontainer, "plotter type"));
168 visual_ui_choice_add_many (VISUAL_UI_CHOICE (popup3), scopeparamchoices);
169
170 visual_ui_table_attach (VISUAL_UI_TABLE (table), label1, 0, 0);
171 visual_ui_table_attach (VISUAL_UI_TABLE (table), popup1, 0, 1);
172
173 visual_ui_table_attach (VISUAL_UI_TABLE (table), label2, 1, 0);
174 visual_ui_table_attach (VISUAL_UI_TABLE (table), popup2, 1, 1);
175
176 visual_ui_table_attach (VISUAL_UI_TABLE (table), label3, 2, 0);
177 visual_ui_table_attach (VISUAL_UI_TABLE (table), popup3, 2, 1);
178
179 visual_plugin_set_userinterface (plugin, table);
180
181 priv->pcmbuf = visual_buffer_new_allocate (512 * sizeof (float), visual_buffer_destroyer_free);
182 priv->freqbuf = visual_buffer_new_allocate (256 * sizeof (float), visual_buffer_destroyer_free);
183
184 return 0;
185 }
186
act_jakdaw_cleanup(VisPluginData * plugin)187 int act_jakdaw_cleanup (VisPluginData *plugin)
188 {
189 JakdawPrivate *priv = visual_object_get_private (VISUAL_OBJECT (plugin));
190 VisUIWidget *ui;
191
192 ui = visual_plugin_get_userinterface (plugin);
193 visual_object_unref (VISUAL_OBJECT (ui));
194
195 _jakdaw_feedback_close (priv);
196
197 visual_object_unref (VISUAL_OBJECT (priv->pcmbuf));
198 visual_object_unref (VISUAL_OBJECT (priv->freqbuf));
199
200 visual_mem_free (priv);
201
202 return 0;
203 }
204
act_jakdaw_requisition(VisPluginData * plugin,int * width,int * height)205 int act_jakdaw_requisition (VisPluginData *plugin, int *width, int *height)
206 {
207 int reqw, reqh;
208
209 reqw = *width;
210 reqh = *height;
211
212 if (reqw < 32)
213 reqw = 32;
214
215 if (reqh < 32)
216 reqh = 32;
217
218 *width = reqw;
219 *height = reqh;
220
221 return 0;
222 }
223
act_jakdaw_dimension(VisPluginData * plugin,VisVideo * video,int width,int height)224 int act_jakdaw_dimension (VisPluginData *plugin, VisVideo *video, int width, int height)
225 {
226 JakdawPrivate *priv = visual_object_get_private (VISUAL_OBJECT (plugin));
227
228 visual_video_set_dimension (video, width, height);
229
230 priv->xres = width;
231 priv->yres = height;
232
233 _jakdaw_feedback_reset (priv, width, height);
234
235 return 0;
236 }
237
act_jakdaw_events(VisPluginData * plugin,VisEventQueue * events)238 int act_jakdaw_events (VisPluginData *plugin, VisEventQueue *events)
239 {
240 JakdawPrivate *priv = visual_object_get_private (VISUAL_OBJECT (plugin));
241 VisEvent ev;
242 VisParamEntry *param;
243
244 while (visual_event_queue_poll (events, &ev)) {
245 switch (ev.type) {
246 case VISUAL_EVENT_RESIZE:
247 act_jakdaw_dimension (plugin, ev.event.resize.video,
248 ev.event.resize.width, ev.event.resize.height);
249 break;
250
251 case VISUAL_EVENT_PARAM:
252 param = ev.event.param.param;
253
254 visual_log (VISUAL_LOG_DEBUG, "Param changed: %s\n", param->name);
255
256 if (visual_param_entry_is (param, "zoom mode")) {
257 visual_log (VISUAL_LOG_DEBUG, "New value for the zoom mode param: %d\n",
258 param->numeric.integer);
259
260 priv->zoom_mode = visual_param_entry_get_integer (param);
261
262 _jakdaw_feedback_reset (priv, priv->xres, priv->yres);
263 }
264 else if (visual_param_entry_is (param, "plotter trigger")) {
265 visual_log (VISUAL_LOG_DEBUG, "New value for the plotter trigger param: %d\n",
266 param->numeric.integer);
267
268 priv->plotter_colortype = visual_param_entry_get_integer (param);
269
270 }
271 else if (visual_param_entry_is (param, "plotter type")) {
272 visual_log (VISUAL_LOG_DEBUG, "New value for the plotter type param: %d\n",
273 param->numeric.integer);
274
275 priv->plotter_scopetype = visual_param_entry_get_integer (param);
276
277 _jakdaw_feedback_reset (priv, priv->xres, priv->yres);
278 }
279
280 break;
281
282 default: /* to avoid warnings */
283 break;
284 }
285 }
286
287 return 0;
288 }
289
act_jakdaw_palette(VisPluginData * plugin)290 VisPalette *act_jakdaw_palette (VisPluginData *plugin)
291 {
292 return NULL;
293 }
294
act_jakdaw_render(VisPluginData * plugin,VisVideo * video,VisAudio * audio)295 int act_jakdaw_render (VisPluginData *plugin, VisVideo *video, VisAudio *audio)
296 {
297 JakdawPrivate *priv = visual_object_get_private (VISUAL_OBJECT (plugin));
298 uint32_t *vscr = visual_video_get_pixels (video);
299
300 visual_audio_get_sample_mixed_simple (audio, priv->pcmbuf, 2,
301 VISUAL_AUDIO_CHANNEL_LEFT,
302 VISUAL_AUDIO_CHANNEL_RIGHT);
303
304 visual_audio_get_spectrum_for_sample (priv->freqbuf, priv->pcmbuf, TRUE);
305
306 _jakdaw_feedback_render (priv, vscr);
307 _jakdaw_plotter_draw (priv,
308 visual_buffer_get_data (priv->pcmbuf),
309 visual_buffer_get_data (priv->freqbuf), vscr);
310
311 return 0;
312 }
313
314