1 /*
2 Waveform seekbar plugin for the DeaDBeeF audio player
3
4 Copyright (C) 2014 Christian Boxdörfer <christian.boxdoerfer@posteo.de>
5
6 Based on sndfile-tools waveform by Erik de Castro Lopo.
7 waveform.c - v1.04
8 Copyright (C) 2007-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
9 Copyright (C) 2012 Robin Gareus <robin@gareus.org>
10 Copyright (C) 2013 driedfruit <driedfruit@mindloop.net>
11
12 This program is free software; you can redistribute it and/or
13 modify it under the terms of the GNU General Public License
14 as published by the Free Software Foundation; either version 2
15 of the License, or (at your option) any later version.
16
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
25 */
26
27 #include <sys/types.h>
28 #include <sys/stat.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <assert.h>
32 #include <math.h>
33 #include <fcntl.h>
34 #include <gtk/gtk.h>
35
36 #include <deadbeef/deadbeef.h>
37
38 #include "config.h"
39 #include "waveform.h"
40
41 gboolean CONFIG_LOG_ENABLED = FALSE;
42 gboolean CONFIG_MIX_TO_MONO = FALSE;
43 gboolean CONFIG_CACHE_ENABLED = TRUE;
44 gboolean CONFIG_SCROLL_ENABLED = TRUE;
45 gboolean CONFIG_DISPLAY_RMS = TRUE;
46 gboolean CONFIG_DISPLAY_RULER = FALSE;
47 gboolean CONFIG_SHADE_WAVEFORM = FALSE;
48 gboolean CONFIG_SOUNDCLOUD_STYLE = FALSE;
49 GdkColor CONFIG_BG_COLOR;
50 GdkColor CONFIG_FG_COLOR;
51 GdkColor CONFIG_PB_COLOR;
52 GdkColor CONFIG_FG_RMS_COLOR;
53 guint16 CONFIG_BG_ALPHA;
54 guint16 CONFIG_FG_ALPHA;
55 guint16 CONFIG_PB_ALPHA;
56 guint16 CONFIG_FG_RMS_ALPHA;
57 gint CONFIG_RENDER_METHOD = SPIKES;
58 gint CONFIG_FILL_WAVEFORM = 1;
59 gint CONFIG_BORDER_WIDTH = 1;
60 gint CONFIG_CURSOR_WIDTH = 3;
61 gint CONFIG_FONT_SIZE = 18;
62 gint CONFIG_MAX_FILE_LENGTH = 180;
63 gint CONFIG_NUM_SAMPLES = 2048;
64 gint CONFIG_REFRESH_INTERVAL = 33;
65
66 void
save_config(void)67 save_config (void)
68 {
69 deadbeef->conf_set_int (CONFSTR_WF_LOG_ENABLED, CONFIG_LOG_ENABLED);
70 deadbeef->conf_set_int (CONFSTR_WF_MIX_TO_MONO, CONFIG_MIX_TO_MONO);
71 deadbeef->conf_set_int (CONFSTR_WF_DISPLAY_RMS, CONFIG_DISPLAY_RMS);
72 deadbeef->conf_set_int (CONFSTR_WF_DISPLAY_RULER, CONFIG_DISPLAY_RULER);
73 deadbeef->conf_set_int (CONFSTR_WF_SHADE_WAVEFORM, CONFIG_SHADE_WAVEFORM);
74 deadbeef->conf_set_int (CONFSTR_WF_SOUNDCLOUD_STYLE, CONFIG_SOUNDCLOUD_STYLE);
75 deadbeef->conf_set_int (CONFSTR_WF_RENDER_METHOD, CONFIG_RENDER_METHOD);
76 deadbeef->conf_set_int (CONFSTR_WF_FILL_WAVEFORM, CONFIG_FILL_WAVEFORM);
77 deadbeef->conf_set_int (CONFSTR_WF_BORDER_WIDTH, CONFIG_BORDER_WIDTH);
78 deadbeef->conf_set_int (CONFSTR_WF_CURSOR_WIDTH, CONFIG_CURSOR_WIDTH);
79 deadbeef->conf_set_int (CONFSTR_WF_FONT_SIZE, CONFIG_FONT_SIZE);
80 deadbeef->conf_set_int (CONFSTR_WF_MAX_FILE_LENGTH, CONFIG_MAX_FILE_LENGTH);
81 deadbeef->conf_set_int (CONFSTR_WF_REFRESH_INTERVAL, CONFIG_REFRESH_INTERVAL);
82 deadbeef->conf_set_int (CONFSTR_WF_NUM_SAMPLES, CONFIG_NUM_SAMPLES);
83 deadbeef->conf_set_int (CONFSTR_WF_CACHE_ENABLED, CONFIG_CACHE_ENABLED);
84 deadbeef->conf_set_int (CONFSTR_WF_SCROLL_ENABLED, CONFIG_SCROLL_ENABLED);
85 deadbeef->conf_set_int (CONFSTR_WF_BG_COLOR_R, CONFIG_BG_COLOR.red);
86 deadbeef->conf_set_int (CONFSTR_WF_BG_COLOR_G, CONFIG_BG_COLOR.green);
87 deadbeef->conf_set_int (CONFSTR_WF_BG_COLOR_B, CONFIG_BG_COLOR.blue);
88 deadbeef->conf_set_int (CONFSTR_WF_BG_ALPHA, CONFIG_BG_ALPHA);
89 deadbeef->conf_set_int (CONFSTR_WF_FG_COLOR_R, CONFIG_FG_COLOR.red);
90 deadbeef->conf_set_int (CONFSTR_WF_FG_COLOR_G, CONFIG_FG_COLOR.green);
91 deadbeef->conf_set_int (CONFSTR_WF_FG_COLOR_B, CONFIG_FG_COLOR.blue);
92 deadbeef->conf_set_int (CONFSTR_WF_FG_ALPHA, CONFIG_FG_ALPHA);
93 deadbeef->conf_set_int (CONFSTR_WF_PB_COLOR_R, CONFIG_PB_COLOR.red);
94 deadbeef->conf_set_int (CONFSTR_WF_PB_COLOR_G, CONFIG_PB_COLOR.green);
95 deadbeef->conf_set_int (CONFSTR_WF_PB_COLOR_B, CONFIG_PB_COLOR.blue);
96 deadbeef->conf_set_int (CONFSTR_WF_PB_ALPHA, CONFIG_PB_ALPHA);
97 deadbeef->conf_set_int (CONFSTR_WF_FG_RMS_COLOR_R, CONFIG_FG_RMS_COLOR.red);
98 deadbeef->conf_set_int (CONFSTR_WF_FG_RMS_COLOR_G, CONFIG_FG_RMS_COLOR.green);
99 deadbeef->conf_set_int (CONFSTR_WF_FG_RMS_COLOR_B, CONFIG_FG_RMS_COLOR.blue);
100 deadbeef->conf_set_int (CONFSTR_WF_FG_RMS_ALPHA, CONFIG_FG_RMS_ALPHA);
101 }
102
103 void
load_config(void)104 load_config (void)
105 {
106 deadbeef->conf_lock ();
107 CONFIG_LOG_ENABLED = deadbeef->conf_get_int (CONFSTR_WF_LOG_ENABLED, FALSE);
108 CONFIG_MIX_TO_MONO = deadbeef->conf_get_int (CONFSTR_WF_MIX_TO_MONO, FALSE);
109 CONFIG_DISPLAY_RMS = deadbeef->conf_get_int (CONFSTR_WF_DISPLAY_RMS, TRUE);
110 CONFIG_DISPLAY_RULER = deadbeef->conf_get_int (CONFSTR_WF_DISPLAY_RULER, FALSE);
111 CONFIG_SHADE_WAVEFORM = deadbeef->conf_get_int (CONFSTR_WF_SHADE_WAVEFORM, FALSE);
112 CONFIG_SOUNDCLOUD_STYLE = deadbeef->conf_get_int (CONFSTR_WF_SOUNDCLOUD_STYLE, FALSE);
113 CONFIG_RENDER_METHOD = deadbeef->conf_get_int (CONFSTR_WF_RENDER_METHOD, SPIKES);
114 CONFIG_FILL_WAVEFORM = deadbeef->conf_get_int (CONFSTR_WF_FILL_WAVEFORM, 1);
115 CONFIG_BORDER_WIDTH = deadbeef->conf_get_int (CONFSTR_WF_BORDER_WIDTH, 1);
116 CONFIG_CURSOR_WIDTH = deadbeef->conf_get_int (CONFSTR_WF_CURSOR_WIDTH, 3);
117 CONFIG_FONT_SIZE = deadbeef->conf_get_int (CONFSTR_WF_FONT_SIZE, 18);
118 CONFIG_REFRESH_INTERVAL = deadbeef->conf_get_int (CONFSTR_WF_REFRESH_INTERVAL, 33);
119 CONFIG_MAX_FILE_LENGTH = deadbeef->conf_get_int (CONFSTR_WF_MAX_FILE_LENGTH, 180);
120 CONFIG_NUM_SAMPLES = deadbeef->conf_get_int (CONFSTR_WF_NUM_SAMPLES, 2048);
121 CONFIG_CACHE_ENABLED = deadbeef->conf_get_int (CONFSTR_WF_CACHE_ENABLED, TRUE);
122 CONFIG_SCROLL_ENABLED = deadbeef->conf_get_int (CONFSTR_WF_SCROLL_ENABLED, TRUE);
123
124 CONFIG_BG_COLOR.red = deadbeef->conf_get_int (CONFSTR_WF_BG_COLOR_R, 50000);
125 CONFIG_BG_COLOR.green = deadbeef->conf_get_int (CONFSTR_WF_BG_COLOR_G, 50000);
126 CONFIG_BG_COLOR.blue = deadbeef->conf_get_int (CONFSTR_WF_BG_COLOR_B, 50000);
127 CONFIG_BG_ALPHA = deadbeef->conf_get_int (CONFSTR_WF_BG_ALPHA, 65535);
128
129 CONFIG_FG_COLOR.red = deadbeef->conf_get_int (CONFSTR_WF_FG_COLOR_R, 20000);
130 CONFIG_FG_COLOR.green = deadbeef->conf_get_int (CONFSTR_WF_FG_COLOR_G, 20000);
131 CONFIG_FG_COLOR.blue = deadbeef->conf_get_int (CONFSTR_WF_FG_COLOR_B, 20000);
132 CONFIG_FG_ALPHA = deadbeef->conf_get_int (CONFSTR_WF_FG_ALPHA, 65535);
133
134 CONFIG_PB_COLOR.red = deadbeef->conf_get_int (CONFSTR_WF_PB_COLOR_R, 0);
135 CONFIG_PB_COLOR.green = deadbeef->conf_get_int (CONFSTR_WF_PB_COLOR_G, 65535);
136 CONFIG_PB_COLOR.blue = deadbeef->conf_get_int (CONFSTR_WF_PB_COLOR_B, 0);
137 CONFIG_PB_ALPHA = deadbeef->conf_get_int (CONFSTR_WF_PB_ALPHA, 20000);
138
139 CONFIG_FG_RMS_COLOR.red = deadbeef->conf_get_int (CONFSTR_WF_FG_RMS_COLOR_R, 5000);
140 CONFIG_FG_RMS_COLOR.green = deadbeef->conf_get_int (CONFSTR_WF_FG_RMS_COLOR_G, 5000);
141 CONFIG_FG_RMS_COLOR.blue = deadbeef->conf_get_int (CONFSTR_WF_FG_RMS_COLOR_B, 5000);
142 CONFIG_FG_RMS_ALPHA = deadbeef->conf_get_int (CONFSTR_WF_FG_RMS_ALPHA, 65535);
143
144 deadbeef->conf_unlock ();
145
146 render =
147 (RENDER) {
148 /*foreground*/ { CONFIG_FG_COLOR.red/65535.f,CONFIG_FG_COLOR.green/65535.f,
149 CONFIG_FG_COLOR.blue/65535.f, CONFIG_FG_ALPHA/65535.f },
150 /*wave-rms*/ { CONFIG_FG_RMS_COLOR.red/65535.f,CONFIG_FG_RMS_COLOR.green/65535.f,
151 CONFIG_FG_RMS_COLOR.blue/65535.f, CONFIG_FG_RMS_ALPHA/65535.f },
152 /*background*/ { CONFIG_BG_COLOR.red/65535.f,CONFIG_BG_COLOR.green/65535.f,
153 CONFIG_BG_COLOR.blue/65535.f, CONFIG_BG_ALPHA/65535.f },
154 };
155 }
156
157