annotate src/echo_plugin/echo.c @ 2545:585f2fc4134e

MIDI files were never properly supported (and probably shouldn't be, because we have separate and working plugins for handling MIDI files), thus references to MIDI are removed.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 30 Apr 2008 05:01:37 +0300
parents 769e17da93dd
children 1e67df1a1edc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2499
4d6045c20cc5 Include cleanups, part #4.
Matti Hamalainen <ccr@tnsp.org>
parents: 2124
diff changeset
1 #include "config.h"
127
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
2 #include <audacious/plugin.h>
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
3 #include <stdlib.h>
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
4 #include <stdio.h>
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
5 #include <string.h>
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
6 #include <gtk/gtk.h>
527
d124034ebea3 [svn] - glib/gi18n.h -> audacious/i18n.h for automatic dgettext support
nenolod
parents: 127
diff changeset
7 #include <audacious/i18n.h>
127
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
8 #include "echo.h"
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
9
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
10
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
11 static void init(void);
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
12 static void cleanup(void);
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
13 static int mod_samples(gpointer * d, gint length, AFormat afmt, gint srate, gint nch);
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
14
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
15 #define MAX_SRATE 50000
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
16 #define MAX_CHANNELS 2
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
17 #define BYTES_PS 2
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
18 #define BUFFER_SAMPLES (MAX_SRATE * MAX_DELAY / 1000)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
19 #define BUFFER_SHORTS (BUFFER_SAMPLES * MAX_CHANNELS)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
20 #define BUFFER_BYTES (BUFFER_SHORTS * BYTES_PS)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
21
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
22 EffectPlugin echo_ep =
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
23 {
1640
a5045f10f80c echo_plugin: C99 initialisers
William Pitcock <nenolod@atheme.org>
parents: 1395
diff changeset
24 .description = "Echo Plugin", /* Description */
a5045f10f80c echo_plugin: C99 initialisers
William Pitcock <nenolod@atheme.org>
parents: 1395
diff changeset
25 .init = init,
a5045f10f80c echo_plugin: C99 initialisers
William Pitcock <nenolod@atheme.org>
parents: 1395
diff changeset
26 .cleanup = cleanup,
a5045f10f80c echo_plugin: C99 initialisers
William Pitcock <nenolod@atheme.org>
parents: 1395
diff changeset
27 .about = echo_about,
a5045f10f80c echo_plugin: C99 initialisers
William Pitcock <nenolod@atheme.org>
parents: 1395
diff changeset
28 .configure = echo_configure,
a5045f10f80c echo_plugin: C99 initialisers
William Pitcock <nenolod@atheme.org>
parents: 1395
diff changeset
29 .mod_samples = mod_samples,
127
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
30 };
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
31
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
32 static gint16 *buffer = NULL;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
33 gint echo_delay = 500, echo_feedback = 50, echo_volume = 50;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
34 gboolean echo_surround_enable = FALSE;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
35 static int w_ofs;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
36
1106
8ca72224786a [svn] - echo: convert to plugin API v2
nenolod
parents: 527
diff changeset
37 EffectPlugin *echo_eplist[] = { &echo_ep, NULL };
8ca72224786a [svn] - echo: convert to plugin API v2
nenolod
parents: 527
diff changeset
38
1395
761e17b23e0c added Discovery plugin type
Cristi Magherusan <majeru@atheme-project.org>
parents: 1106
diff changeset
39 DECLARE_PLUGIN(echo, NULL, NULL, NULL, NULL, echo_eplist, NULL, NULL, NULL);
127
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
40
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
41 static void init(void)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
42 {
2523
769e17da93dd Replaced s/ConfigDb/mcs_handle_t/g, as per changes in the core.
Matti Hamalainen <ccr@tnsp.org>
parents: 2499
diff changeset
43 mcs_handle_t *cfg;
127
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
44
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
45 if (sizeof(short) != sizeof(gint16))
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
46 abort();
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
47
2124
b8da6a0b0da2 s/bmp_cfg_/aud_cfg_/g
Matti Hamalainen <ccr@tnsp.org>
parents: 1950
diff changeset
48 cfg = aud_cfg_db_open();
b8da6a0b0da2 s/bmp_cfg_/aud_cfg_/g
Matti Hamalainen <ccr@tnsp.org>
parents: 1950
diff changeset
49 aud_cfg_db_get_int(cfg, "echo_plugin", "delay", &echo_delay);
b8da6a0b0da2 s/bmp_cfg_/aud_cfg_/g
Matti Hamalainen <ccr@tnsp.org>
parents: 1950
diff changeset
50 aud_cfg_db_get_int(cfg, "echo_plugin", "feedback", &echo_feedback);
b8da6a0b0da2 s/bmp_cfg_/aud_cfg_/g
Matti Hamalainen <ccr@tnsp.org>
parents: 1950
diff changeset
51 aud_cfg_db_get_int(cfg, "echo_plugin", "volume", &echo_volume);
b8da6a0b0da2 s/bmp_cfg_/aud_cfg_/g
Matti Hamalainen <ccr@tnsp.org>
parents: 1950
diff changeset
52 aud_cfg_db_get_bool(cfg, "echo_plugin", "enable_surround", &echo_surround_enable);
b8da6a0b0da2 s/bmp_cfg_/aud_cfg_/g
Matti Hamalainen <ccr@tnsp.org>
parents: 1950
diff changeset
53 aud_cfg_db_close(cfg);
127
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
54 }
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
55
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
56 static void cleanup(void)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
57 {
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
58 g_free(buffer);
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
59 buffer = NULL;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
60 }
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
61
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
62 static int mod_samples(gpointer * d, gint length, AFormat afmt, gint srate, gint nch)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
63 {
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
64 gint i, in, out, buf, r_ofs, fb_div;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
65 gint16 *data = (gint16 *) * d;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
66 static gint old_srate, old_nch;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
67
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
68 if (!(afmt == FMT_S16_NE ||
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
69 (afmt == FMT_S16_LE && G_BYTE_ORDER == G_LITTLE_ENDIAN) ||
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
70 (afmt == FMT_S16_BE && G_BYTE_ORDER == G_BIG_ENDIAN)))
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
71 return length;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
72
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
73 if (!buffer)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
74 buffer = g_malloc0(BUFFER_BYTES + 2);
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
75
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
76 if (nch != old_nch || srate != old_srate)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
77 {
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
78 memset(buffer, 0, BUFFER_BYTES);
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
79 w_ofs = 0;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
80 old_nch = nch;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
81 old_srate = srate;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
82 }
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
83
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
84 if (echo_surround_enable && nch == 2)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
85 fb_div = 200;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
86 else
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
87 fb_div = 100;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
88
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
89 r_ofs = w_ofs - (srate * echo_delay / 1000) * nch;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
90 if (r_ofs < 0)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
91 r_ofs += BUFFER_SHORTS;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
92
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
93 for (i = 0; i < length / BYTES_PS; i++)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
94 {
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
95 in = data[i];
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
96 buf = buffer[r_ofs];
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
97 if (echo_surround_enable && nch == 2)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
98 {
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
99 if (i & 1)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
100 buf -= buffer[r_ofs - 1];
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
101 else
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
102 buf -= buffer[r_ofs + 1];
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
103 }
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
104 out = in + buf * echo_volume / 100;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
105 buf = in + buf * echo_feedback / fb_div;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
106 out = CLAMP(out, -32768, 32767);
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
107 buf = CLAMP(buf, -32768, 32767);
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
108 buffer[w_ofs] = buf;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
109 data[i] = out;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
110 if (++r_ofs >= BUFFER_SHORTS)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
111 r_ofs -= BUFFER_SHORTS;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
112 if (++w_ofs >= BUFFER_SHORTS)
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
113 w_ofs -= BUFFER_SHORTS;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
114 }
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
115
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
116 return length;
46730e83b1e2 [svn] - echo plugin support by Christian Birchinger <joker -at- gentoo.org>
nenolod
parents:
diff changeset
117 }