Mercurial > audlegacy
comparison Plugins/Input/sid/xs_config.c @ 269:1b82a9932b60 trunk
[svn] Import sid plugin. Ported from XMMS by giacomo.
author | chainsaw |
---|---|
date | Thu, 08 Dec 2005 15:12:12 -0800 |
parents | |
children | d0e9693d2115 |
comparison
equal
deleted
inserted
replaced
268:1368faba73c9 | 269:1b82a9932b60 |
---|---|
1 /* | |
2 XMMS-SID - SIDPlay input plugin for X MultiMedia System (XMMS) | |
3 | |
4 Configuration dialog | |
5 | |
6 Programmed and designed by Matti 'ccr' Hamalainen <ccr@tnsp.org> | |
7 (C) Copyright 1999-2005 Tecnic Software productions (TNSP) | |
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 published by | |
11 the Free Software Foundation; either version 2 of the License, or | |
12 (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 #include "xs_config.h" | |
24 #include "libaudacious/configfile.h" | |
25 #include <stdio.h> | |
26 #include "xs_glade.h" | |
27 #include "xs_interface.h" | |
28 #include "xs_support.h" | |
29 | |
30 /* | |
31 * Global widgets | |
32 */ | |
33 static GtkWidget *xs_configwin = NULL, | |
34 *xs_sldb_fileselector = NULL, | |
35 *xs_stil_fileselector = NULL, | |
36 *xs_hvsc_pathselector = NULL; | |
37 | |
38 #define LUW(x) lookup_widget(xs_configwin, x) | |
39 | |
40 | |
41 /* | |
42 * Configuration specific stuff | |
43 */ | |
44 XS_MUTEX(xs_cfg); | |
45 struct t_xs_cfg xs_cfg; | |
46 | |
47 t_xs_cfg_item xs_cfgtable[] = { | |
48 { CTYPE_INT, &xs_cfg.audioBitsPerSample, "audioBitsPerSample" }, | |
49 { CTYPE_INT, &xs_cfg.audioChannels, "audioChannels" }, | |
50 { CTYPE_INT, &xs_cfg.audioFrequency, "audioFrequency" }, | |
51 | |
52 { CTYPE_BOOL, &xs_cfg.mos8580, "mos8580" }, | |
53 { CTYPE_BOOL, &xs_cfg.forceModel, "forceModel" }, | |
54 { CTYPE_BOOL, &xs_cfg.emulateFilters, "emulateFilters" }, | |
55 { CTYPE_FLOAT, &xs_cfg.filterFs, "filterFs" }, | |
56 { CTYPE_FLOAT, &xs_cfg.filterFm, "filterFm" }, | |
57 { CTYPE_FLOAT, &xs_cfg.filterFt, "filterFt" }, | |
58 { CTYPE_INT, &xs_cfg.memoryMode, "memoryMode" }, | |
59 { CTYPE_INT, &xs_cfg.clockSpeed, "clockSpeed" }, | |
60 { CTYPE_BOOL, &xs_cfg.forceSpeed, "forceSpeed" }, | |
61 | |
62 { CTYPE_INT, &xs_cfg.playerEngine, "playerEngine" }, | |
63 | |
64 { CTYPE_INT, &xs_cfg.sid2Builder, "sid2Builder" }, | |
65 { CTYPE_INT, &xs_cfg.sid2OptLevel, "sid2OptLevel" }, | |
66 | |
67 { CTYPE_BOOL, &xs_cfg.oversampleEnable, "oversampleEnable" }, | |
68 { CTYPE_INT, &xs_cfg.oversampleFactor, "oversampleFactor" }, | |
69 | |
70 { CTYPE_BOOL, &xs_cfg.playMaxTimeEnable, "playMaxTimeEnable" }, | |
71 { CTYPE_BOOL, &xs_cfg.playMaxTimeUnknown, "playMaxTimeUnknown" }, | |
72 { CTYPE_INT, &xs_cfg.playMaxTime, "playMaxTime" }, | |
73 { CTYPE_BOOL, &xs_cfg.playMinTimeEnable, "playMinTimeEnable" }, | |
74 { CTYPE_INT, &xs_cfg.playMinTime, "playMinTime" }, | |
75 { CTYPE_BOOL, &xs_cfg.songlenDBEnable, "songlenDBEnable" }, | |
76 { CTYPE_STR, &xs_cfg.songlenDBPath, "songlenDBPath" }, | |
77 | |
78 { CTYPE_BOOL, &xs_cfg.stilDBEnable, "stilDBEnable" }, | |
79 { CTYPE_STR, &xs_cfg.stilDBPath, "stilDBPath" }, | |
80 { CTYPE_STR, &xs_cfg.hvscPath, "hvscPath" }, | |
81 | |
82 { CTYPE_INT, &xs_cfg.subsongControl, "subsongControl" }, | |
83 { CTYPE_BOOL, &xs_cfg.detectMagic, "detectMagic" }, | |
84 | |
85 { CTYPE_BOOL, &xs_cfg.titleOverride, "titleOverride" }, | |
86 { CTYPE_STR, &xs_cfg.titleFormat, "titleFormat" }, | |
87 | |
88 { CTYPE_BOOL, &xs_cfg.subAutoEnable, "subAutoEnable" }, | |
89 { CTYPE_BOOL, &xs_cfg.subAutoMinOnly, "subAutoMinOnly" }, | |
90 { CTYPE_INT, &xs_cfg.subAutoMinTime, "subAutoMinTime" }, | |
91 }; | |
92 | |
93 static const gint xs_cfgtable_max = (sizeof(xs_cfgtable) / sizeof(t_xs_cfg_item)); | |
94 | |
95 | |
96 t_xs_wid_item xs_widtable[] = { | |
97 { WTYPE_BGROUP, CTYPE_INT, "cfg_res_16bit", &xs_cfg.audioBitsPerSample, XS_RES_16BIT }, | |
98 { WTYPE_BGROUP, CTYPE_INT, "cfg_res_8bit", &xs_cfg.audioBitsPerSample, XS_RES_8BIT }, | |
99 { WTYPE_BGROUP, CTYPE_INT, "cfg_chn_mono", &xs_cfg.audioChannels, XS_CHN_MONO }, | |
100 { WTYPE_BGROUP, CTYPE_INT, "cfg_chn_stereo", &xs_cfg.audioChannels, XS_CHN_STEREO }, | |
101 { WTYPE_BGROUP, CTYPE_INT, "cfg_chn_autopan", &xs_cfg.audioChannels, XS_CHN_AUTOPAN }, | |
102 { WTYPE_SPIN, CTYPE_INT, "cfg_samplerate", &xs_cfg.audioFrequency, 0 }, | |
103 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_oversample", &xs_cfg.oversampleEnable, 0 }, | |
104 { WTYPE_SPIN, CTYPE_INT, "cfg_oversample_factor",&xs_cfg.oversampleFactor, 0 }, | |
105 | |
106 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_sidplay1", &xs_cfg.playerEngine, XS_ENG_SIDPLAY1 }, | |
107 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_sidplay2", &xs_cfg.playerEngine, XS_ENG_SIDPLAY2 }, | |
108 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_mem_real", &xs_cfg.memoryMode, XS_MPU_REAL }, | |
109 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_mem_banksw", &xs_cfg.memoryMode, XS_MPU_BANK_SWITCHING }, | |
110 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_mem_transrom", &xs_cfg.memoryMode, XS_MPU_TRANSPARENT_ROM }, | |
111 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_mem_playsid", &xs_cfg.memoryMode, XS_MPU_PLAYSID_ENVIRONMENT }, | |
112 | |
113 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_emu_mos8580", &xs_cfg.mos8580, 0 }, | |
114 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_emu_sid_force", &xs_cfg.forceModel, 0 }, | |
115 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_clock_ntsc", &xs_cfg.clockSpeed, XS_CLOCK_NTSC }, | |
116 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_clock_pal", &xs_cfg.clockSpeed, XS_CLOCK_PAL }, | |
117 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_emu_clock_force", &xs_cfg.forceSpeed, 0 }, | |
118 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_emu_sidplay2_opt", &xs_cfg.sid2OptLevel, 0 }, | |
119 | |
120 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_sidplay2_resid",&xs_cfg.sid2Builder, XS_BLD_RESID }, | |
121 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_sidplay2_hardsid",&xs_cfg.sid2Builder, XS_BLD_HARDSID }, | |
122 | |
123 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_emu_filters", &xs_cfg.emulateFilters, 0 }, | |
124 { WTYPE_SCALE, CTYPE_FLOAT, "cfg_emu_filt_fs", &xs_cfg.filterFs, 0 }, | |
125 { WTYPE_SCALE, CTYPE_FLOAT, "cfg_emu_filt_fm", &xs_cfg.filterFm, 0 }, | |
126 { WTYPE_SCALE, CTYPE_FLOAT, "cfg_emu_filt_ft", &xs_cfg.filterFt, 0 }, | |
127 | |
128 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_maxtime_enable", &xs_cfg.playMaxTimeEnable, 0 }, | |
129 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_maxtime_unknown", &xs_cfg.playMaxTimeUnknown, 0 }, | |
130 { WTYPE_SPIN, CTYPE_INT, "cfg_maxtime", &xs_cfg.playMaxTime, 0 }, | |
131 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_mintime_enable", &xs_cfg.playMinTimeEnable, 0 }, | |
132 { WTYPE_SPIN, CTYPE_INT, "cfg_mintime", &xs_cfg.playMinTime, 0 }, | |
133 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_sld_enable", &xs_cfg.songlenDBEnable, 0 }, | |
134 { WTYPE_TEXT, CTYPE_STR, "cfg_sld_dbpath", &xs_cfg.songlenDBPath, 0 }, | |
135 | |
136 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_stil_enable", &xs_cfg.stilDBEnable, 0 }, | |
137 { WTYPE_TEXT, CTYPE_STR, "cfg_stil_dbpath", &xs_cfg.stilDBPath, 0 }, | |
138 { WTYPE_TEXT, CTYPE_STR, "cfg_hvsc_path", &xs_cfg.hvscPath, 0 }, | |
139 | |
140 { WTYPE_BGROUP, CTYPE_INT, "cfg_subctrl_none", &xs_cfg.subsongControl, XS_SSC_NONE }, | |
141 { WTYPE_BGROUP, CTYPE_INT, "cfg_subctrl_seek", &xs_cfg.subsongControl, XS_SSC_SEEK }, | |
142 { WTYPE_BGROUP, CTYPE_INT, "cfg_subctrl_popup", &xs_cfg.subsongControl, XS_SSC_POPUP }, | |
143 { WTYPE_BGROUP, CTYPE_INT, "cfg_subctrl_patch", &xs_cfg.subsongControl, XS_SSC_PATCH }, | |
144 | |
145 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_detectmagic", &xs_cfg.detectMagic, 0 }, | |
146 | |
147 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_ftitle_override", &xs_cfg.titleOverride, 0 }, | |
148 { WTYPE_TEXT, CTYPE_STR, "cfg_ftitle_format", &xs_cfg.titleFormat, 0 }, | |
149 | |
150 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_subauto_enable", &xs_cfg.subAutoEnable, 0 }, | |
151 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_subauto_min_only", &xs_cfg.subAutoMinOnly, 0 }, | |
152 { WTYPE_SPIN, CTYPE_INT, "cfg_subauto_mintime", &xs_cfg.subAutoMinTime, 0 }, | |
153 }; | |
154 | |
155 static const gint xs_widtable_max = (sizeof(xs_widtable) / sizeof(t_xs_wid_item)); | |
156 | |
157 | |
158 /* | |
159 * Reset/initialize the configuration | |
160 */ | |
161 void xs_init_configuration(void) | |
162 { | |
163 /* Lock configuration mutex */ | |
164 XSDEBUG("initializing configuration ...\n"); | |
165 XS_MUTEX_LOCK(xs_cfg); | |
166 | |
167 /* Initialize values with sensible defaults */ | |
168 xs_cfg.audioBitsPerSample = XS_RES_16BIT; | |
169 xs_cfg.audioChannels = XS_CHN_MONO; | |
170 xs_cfg.audioFrequency = 44100; | |
171 | |
172 xs_cfg.mos8580 = FALSE; | |
173 xs_cfg.forceModel = FALSE; | |
174 | |
175 xs_cfg.emulateFilters = TRUE; | |
176 xs_cfg.filterFs = XS_SIDPLAY1_FS; | |
177 xs_cfg.filterFm = XS_SIDPLAY1_FM; | |
178 xs_cfg.filterFt = XS_SIDPLAY1_FT; | |
179 | |
180 #ifdef HAVE_SIDPLAY2 | |
181 xs_cfg.playerEngine = XS_ENG_SIDPLAY2; | |
182 xs_cfg.memoryMode = XS_MPU_REAL; | |
183 #else | |
184 #ifdef HAVE_SIDPLAY1 | |
185 xs_cfg.playerEngine = XS_ENG_SIDPLAY1; | |
186 xs_cfg.memoryMode = XS_MPU_BANK_SWITCHING; | |
187 #else | |
188 #error This should not happen! No emulator engines configured in! | |
189 #endif | |
190 #endif | |
191 | |
192 xs_cfg.clockSpeed = XS_CLOCK_PAL; | |
193 xs_cfg.forceSpeed = FALSE; | |
194 | |
195 xs_cfg.sid2OptLevel = FALSE; | |
196 #ifdef HAVE_RESID_BUILDER | |
197 xs_cfg.sid2Builder = XS_BLD_RESID; | |
198 #else | |
199 #ifdef HAVE_HARDSID_BUILDER | |
200 xs_cfg.sid2Builder = XS_BLD_HARDSID; | |
201 #else | |
202 #ifdef HAVE_SIDPLAY2 | |
203 #error This should not happen! No supported SIDPlay2 builders configured in! | |
204 #endif | |
205 #endif | |
206 #endif | |
207 | |
208 xs_cfg.oversampleEnable = FALSE; | |
209 xs_cfg.oversampleFactor = XS_MIN_OVERSAMPLE; | |
210 | |
211 xs_cfg.playMaxTimeEnable = FALSE; | |
212 xs_cfg.playMaxTimeUnknown = FALSE; | |
213 xs_cfg.playMaxTime = 150; | |
214 | |
215 xs_cfg.playMinTimeEnable = FALSE; | |
216 xs_cfg.playMinTime = 15; | |
217 | |
218 xs_cfg.songlenDBEnable = FALSE; | |
219 xs_pstrcpy(&xs_cfg.songlenDBPath, "~/C64Music/Songlengths.txt"); | |
220 | |
221 xs_cfg.stilDBEnable = FALSE; | |
222 xs_pstrcpy(&xs_cfg.stilDBPath, "~/C64Music/DOCUMENTS/STIL.txt"); | |
223 xs_pstrcpy(&xs_cfg.hvscPath, "~/C64Music"); | |
224 | |
225 #ifdef HAVE_SONG_POSITION | |
226 xs_cfg.subsongControl = XS_SSC_PATCH; | |
227 #else | |
228 xs_cfg.subsongControl = XS_SSC_POPUP; | |
229 #endif | |
230 | |
231 xs_cfg.detectMagic = FALSE; | |
232 | |
233 #ifdef HAVE_XMMSEXTRA | |
234 xs_cfg.titleOverride = FALSE; | |
235 #else | |
236 xs_cfg.titleOverride = TRUE; | |
237 #endif | |
238 xs_pstrcpy(&xs_cfg.titleFormat, "%p - %t (%c) [%n/%N][%m]"); | |
239 | |
240 | |
241 xs_cfg.subAutoEnable = FALSE; | |
242 xs_cfg.subAutoMinOnly = TRUE; | |
243 xs_cfg.subAutoMinTime = 15; | |
244 | |
245 | |
246 /* Unlock the configuration */ | |
247 XS_MUTEX_UNLOCK(xs_cfg); | |
248 } | |
249 | |
250 | |
251 /* | |
252 * Get the configuration (from file or default) | |
253 */ | |
254 void xs_read_configuration(void) | |
255 { | |
256 #ifdef HAVE_NODEFAULTCFG | |
257 gchar *cfgFilename; | |
258 #endif | |
259 gchar *tmpStr; | |
260 ConfigFile *cfgFile; | |
261 gint i; | |
262 | |
263 /* Try to open the XMMS configuration file */ | |
264 XS_MUTEX_LOCK(xs_cfg); | |
265 XSDEBUG("loading from config-file ...\n"); | |
266 | |
267 #ifdef HAVE_NODEFAULTCFG | |
268 cfgFilename = g_strconcat(g_get_home_dir(), XS_CONFIG_FILE, NULL); | |
269 cfgFile = xmms_cfg_open_file(cfgFilename); | |
270 g_free(cfgFilename); | |
271 #else | |
272 cfgFile = xmms_cfg_open_default_file(); | |
273 #endif | |
274 | |
275 if (cfgFile == NULL) { | |
276 XSDEBUG("could not open configuration file, trying to write defaults...\n"); | |
277 xs_write_configuration(); | |
278 return; | |
279 } | |
280 | |
281 /* Read the new settings from XMMS configuration file */ | |
282 for (i = 0; i < xs_cfgtable_max; i++) { | |
283 switch (xs_cfgtable[i].itemType) { | |
284 case CTYPE_INT: | |
285 xmms_cfg_read_int(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, | |
286 (gint *) xs_cfgtable[i].itemData); | |
287 break; | |
288 | |
289 case CTYPE_BOOL: | |
290 xmms_cfg_read_boolean(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, | |
291 (gboolean *) xs_cfgtable[i].itemData); | |
292 break; | |
293 | |
294 case CTYPE_FLOAT: | |
295 xmms_cfg_read_float(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, | |
296 (gfloat *) xs_cfgtable[i].itemData); | |
297 break; | |
298 | |
299 case CTYPE_STR: | |
300 if (xmms_cfg_read_string | |
301 (cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, (gchar **) & tmpStr)) { | |
302 /* Read was successfull */ | |
303 xs_pstrcpy((gchar **) xs_cfgtable[i].itemData, tmpStr); | |
304 g_free(tmpStr); | |
305 } | |
306 break; | |
307 | |
308 default: | |
309 XSERR | |
310 ("Internal: Unsupported setting type found while reading configuration file. Please report to author!\n"); | |
311 break; | |
312 } | |
313 } | |
314 | |
315 | |
316 /* Free the config file */ | |
317 xmms_cfg_free(cfgFile); | |
318 | |
319 XS_MUTEX_UNLOCK(xs_cfg); | |
320 XSDEBUG("OK\n"); | |
321 } | |
322 | |
323 | |
324 | |
325 /* | |
326 * Write the current configuration | |
327 */ | |
328 gint xs_write_configuration(void) | |
329 { | |
330 #ifdef HAVE_NODEFAULTCFG | |
331 gchar *cfgFilename; | |
332 #endif | |
333 ConfigFile *cfgFile; | |
334 gint i; | |
335 | |
336 XSDEBUG("writing configuration ...\n"); | |
337 XS_MUTEX_LOCK(xs_cfg); | |
338 | |
339 /* Try to open the XMMS configuration file */ | |
340 #ifdef HAVE_NODEFAULTCFG | |
341 cfgFilename = g_strconcat(g_get_home_dir(), XS_CONFIG_FILE, NULL); | |
342 cfgFile = xmms_cfg_open_file(cfgFilename); | |
343 #else | |
344 cfgFile = xmms_cfg_open_default_file(); | |
345 #endif | |
346 | |
347 if (!cfgFile) | |
348 cfgFile = xmms_cfg_new(); | |
349 | |
350 /* Write the new settings to XMMS configuration file */ | |
351 for (i = 0; i < xs_cfgtable_max; i++) { | |
352 switch (xs_cfgtable[i].itemType) { | |
353 case CTYPE_INT: | |
354 xmms_cfg_write_int(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, | |
355 *(gint *) xs_cfgtable[i].itemData); | |
356 break; | |
357 | |
358 case CTYPE_BOOL: | |
359 xmms_cfg_write_boolean(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, | |
360 *(gboolean *) xs_cfgtable[i].itemData); | |
361 break; | |
362 | |
363 case CTYPE_FLOAT: | |
364 xmms_cfg_write_float(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, | |
365 *(gfloat *) xs_cfgtable[i].itemData); | |
366 break; | |
367 | |
368 case CTYPE_STR: | |
369 xmms_cfg_write_string(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, | |
370 *(gchar **) xs_cfgtable[i].itemData); | |
371 break; | |
372 | |
373 default: | |
374 XSERR | |
375 ("Internal: Unsupported setting type found while writing configuration file. Please report to author!\n"); | |
376 break; | |
377 } | |
378 } | |
379 | |
380 /* Flush the file */ | |
381 #ifdef HAVE_NODEFAULTCFG | |
382 xmms_cfg_write_file(cfgFile, cfgFilename); | |
383 g_free(cfgFilename); | |
384 #else | |
385 xmms_cfg_write_default_file(cfgFile); | |
386 #endif | |
387 | |
388 /* Free the memory areas */ | |
389 xmms_cfg_free(cfgFile); | |
390 | |
391 XS_MUTEX_UNLOCK(xs_cfg); | |
392 | |
393 return 0; | |
394 } | |
395 | |
396 | |
397 /* | |
398 * Configuration panel was canceled | |
399 */ | |
400 void xs_cfg_cancel(void) | |
401 { | |
402 gtk_widget_destroy(xs_configwin); | |
403 xs_configwin = NULL; | |
404 } | |
405 | |
406 | |
407 /* | |
408 * Configuration was accepted (OK), save the settings | |
409 */ | |
410 void xs_cfg_ok(void) | |
411 { | |
412 gint i; | |
413 gfloat tmpValue; | |
414 | |
415 XSDEBUG("get data from widgets to config...\n"); | |
416 | |
417 for (i = 0; i < xs_widtable_max; i++) { | |
418 switch (xs_widtable[i].widType) { | |
419 case WTYPE_BGROUP: | |
420 /* Check if toggle-button is active */ | |
421 if (GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName))->active) { | |
422 /* Yes, set the constant value */ | |
423 *((gint *) xs_widtable[i].itemData) = xs_widtable[i].itemSet; | |
424 } | |
425 break; | |
426 | |
427 case WTYPE_SPIN: | |
428 case WTYPE_SCALE: | |
429 /* Get the value */ | |
430 switch (xs_widtable[i].widType) { | |
431 case WTYPE_SPIN: | |
432 tmpValue = | |
433 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(LUW(xs_widtable[i].widName)))->value; | |
434 break; | |
435 | |
436 case WTYPE_SCALE: | |
437 tmpValue = gtk_range_get_adjustment(GTK_RANGE(LUW(xs_widtable[i].widName)))->value; | |
438 break; | |
439 | |
440 default: | |
441 tmpValue = -1; | |
442 } | |
443 | |
444 /* Set the value */ | |
445 switch (xs_widtable[i].itemType) { | |
446 case CTYPE_INT: | |
447 *((gint *) xs_widtable[i].itemData) = (gint) tmpValue; | |
448 break; | |
449 | |
450 case CTYPE_FLOAT: | |
451 *((gfloat *) xs_widtable[i].itemData) = tmpValue; | |
452 break; | |
453 } | |
454 break; | |
455 | |
456 case WTYPE_BUTTON: | |
457 /* Check if toggle-button is active */ | |
458 *((gboolean *) xs_widtable[i].itemData) = | |
459 (GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName))->active); | |
460 break; | |
461 | |
462 case WTYPE_TEXT: | |
463 /* Get text from text-widget */ | |
464 xs_pstrcpy((gchar **) xs_widtable[i].itemData, | |
465 gtk_entry_get_text(GTK_ENTRY(LUW(xs_widtable[i].widName))) | |
466 ); | |
467 break; | |
468 } | |
469 } | |
470 | |
471 /* Close window */ | |
472 gtk_widget_destroy(xs_configwin); | |
473 xs_configwin = NULL; | |
474 | |
475 /* Write settings */ | |
476 xs_write_configuration(); | |
477 | |
478 /* Re-initialize */ | |
479 xs_reinit(); | |
480 } | |
481 | |
482 | |
483 /* | |
484 * Reset filter settings to defaults | |
485 */ | |
486 void xs_cfg_filter_reset(GtkButton * button, gpointer user_data) | |
487 { | |
488 (void) button; | |
489 (void) user_data; | |
490 | |
491 gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_emu_filt_fs"))), XS_SIDPLAY1_FS); | |
492 gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_emu_filt_fm"))), XS_SIDPLAY1_FM); | |
493 gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_emu_filt_ft"))), XS_SIDPLAY1_FT); | |
494 } | |
495 | |
496 | |
497 | |
498 | |
499 /* | |
500 * HVSC songlength-database file selector response-functions | |
501 */ | |
502 void xs_cfg_sld_dbbrowse(GtkButton * button, gpointer user_data) | |
503 { | |
504 (void) button; | |
505 (void) user_data; | |
506 | |
507 if (xs_sldb_fileselector != NULL) { | |
508 gdk_window_raise(xs_sldb_fileselector->window); | |
509 return; | |
510 } | |
511 | |
512 xs_sldb_fileselector = create_xs_sldbfileselector(); | |
513 XS_MUTEX_LOCK(xs_cfg); | |
514 gtk_file_selection_set_filename(GTK_FILE_SELECTION(xs_sldb_fileselector), xs_cfg.songlenDBPath); | |
515 XS_MUTEX_UNLOCK(xs_cfg); | |
516 gtk_widget_show(xs_sldb_fileselector); | |
517 } | |
518 | |
519 | |
520 void xs_cfg_sldb_fs_ok(void) | |
521 { | |
522 /* Selection was accepted! */ | |
523 gtk_entry_set_text(GTK_ENTRY(LUW("cfg_sld_dbpath")), | |
524 gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_sldb_fileselector))); | |
525 | |
526 /* Close file selector window */ | |
527 gtk_widget_destroy(xs_sldb_fileselector); | |
528 xs_sldb_fileselector = NULL; | |
529 } | |
530 | |
531 | |
532 void xs_cfg_sldb_fs_cancel(void) | |
533 { | |
534 /* Close file selector window */ | |
535 gtk_widget_destroy(xs_sldb_fileselector); | |
536 xs_sldb_fileselector = NULL; | |
537 } | |
538 | |
539 | |
540 /* | |
541 * STIL-database file selector response-functions | |
542 */ | |
543 void xs_cfg_stil_browse(GtkButton * button, gpointer user_data) | |
544 { | |
545 (void) button; | |
546 (void) user_data; | |
547 | |
548 if (xs_stil_fileselector != NULL) { | |
549 gdk_window_raise(xs_stil_fileselector->window); | |
550 return; | |
551 } | |
552 | |
553 xs_stil_fileselector = create_xs_stilfileselector(); | |
554 XS_MUTEX_LOCK(xs_cfg); | |
555 gtk_file_selection_set_filename(GTK_FILE_SELECTION(xs_stil_fileselector), xs_cfg.stilDBPath); | |
556 XS_MUTEX_UNLOCK(xs_cfg); | |
557 gtk_widget_show(xs_stil_fileselector); | |
558 } | |
559 | |
560 | |
561 void xs_cfg_stil_fs_ok(void) | |
562 { | |
563 /* Selection was accepted! */ | |
564 gtk_entry_set_text(GTK_ENTRY(LUW("cfg_stil_dbpath")), | |
565 gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_stil_fileselector))); | |
566 | |
567 /* Close file selector window */ | |
568 gtk_widget_destroy(xs_stil_fileselector); | |
569 xs_stil_fileselector = NULL; | |
570 } | |
571 | |
572 | |
573 void xs_cfg_stil_fs_cancel(void) | |
574 { | |
575 /* Close file selector window */ | |
576 gtk_widget_destroy(xs_stil_fileselector); | |
577 xs_stil_fileselector = NULL; | |
578 } | |
579 | |
580 | |
581 /* | |
582 * HVSC location selector response-functions | |
583 */ | |
584 void xs_cfg_hvsc_browse(GtkButton * button, gpointer user_data) | |
585 { | |
586 (void) button; | |
587 (void) user_data; | |
588 | |
589 if (xs_hvsc_pathselector != NULL) { | |
590 gdk_window_raise(xs_hvsc_pathselector->window); | |
591 return; | |
592 } | |
593 | |
594 xs_hvsc_pathselector = create_xs_hvscpathselector(); | |
595 XS_MUTEX_LOCK(xs_cfg); | |
596 gtk_file_selection_set_filename(GTK_FILE_SELECTION(xs_hvsc_pathselector), xs_cfg.hvscPath); | |
597 XS_MUTEX_UNLOCK(xs_cfg); | |
598 gtk_widget_show(xs_hvsc_pathselector); | |
599 } | |
600 | |
601 | |
602 void xs_cfg_hvsc_fs_ok(void) | |
603 { | |
604 /* Selection was accepted! */ | |
605 gtk_entry_set_text(GTK_ENTRY(LUW("cfg_hvsc_path")), | |
606 gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_hvsc_pathselector))); | |
607 | |
608 /* Close file selector window */ | |
609 gtk_widget_destroy(xs_hvsc_pathselector); | |
610 xs_hvsc_pathselector = NULL; | |
611 } | |
612 | |
613 | |
614 void xs_cfg_hvsc_fs_cancel(void) | |
615 { | |
616 /* Close file selector window */ | |
617 gtk_widget_destroy(xs_hvsc_pathselector); | |
618 xs_hvsc_pathselector = NULL; | |
619 } | |
620 | |
621 | |
622 /* | |
623 * Selection toggle handlers | |
624 */ | |
625 void xs_cfg_emu_filters_toggled(GtkToggleButton * togglebutton, gpointer user_data) | |
626 { | |
627 gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active; | |
628 | |
629 (void) user_data; | |
630 | |
631 gtk_widget_set_sensitive(LUW("cfg_filters_notebook"), isActive); | |
632 } | |
633 | |
634 | |
635 void xs_cfg_ftitle_override_toggled(GtkToggleButton * togglebutton, gpointer user_data) | |
636 { | |
637 gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active; | |
638 | |
639 (void) user_data; | |
640 | |
641 gtk_widget_set_sensitive(LUW("cfg_ftitle_format"), isActive); | |
642 gtk_widget_set_sensitive(LUW("cfg_ftitle_desc1"), isActive); | |
643 gtk_widget_set_sensitive(LUW("cfg_ftitle_desc2"), isActive); | |
644 } | |
645 | |
646 | |
647 void xs_cfg_emu_sidplay1_toggled(GtkToggleButton * togglebutton, gpointer user_data) | |
648 { | |
649 (void) togglebutton; | |
650 (void) user_data; | |
651 } | |
652 | |
653 | |
654 void xs_cfg_emu_sidplay2_toggled(GtkToggleButton * togglebutton, gpointer user_data) | |
655 { | |
656 gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active; | |
657 | |
658 (void) user_data; | |
659 | |
660 gtk_widget_set_sensitive(LUW("cfg_emu_mem_real"), isActive); | |
661 | |
662 gtk_widget_set_sensitive(LUW("cfg_sidplay2_grp"), isActive); | |
663 gtk_widget_set_sensitive(LUW("cfg_emu_sidplay2_opt"), isActive); | |
664 | |
665 gtk_widget_set_sensitive(LUW("cfg_chn_autopan"), !isActive); | |
666 | |
667 #ifdef HAVE_RESID_BUILDER | |
668 gtk_widget_set_sensitive(LUW("cfg_emu_sidplay2_resid"), isActive); | |
669 #else | |
670 gtk_widget_set_sensitive(LUW("cfg_emu_sidplay2_resid"), FALSE); | |
671 #endif | |
672 | |
673 #ifdef HAVE_HARDSID_BUILDER | |
674 gtk_widget_set_sensitive(LUW("cfg_emu_sidplay2_hardsid"), isActive); | |
675 #else | |
676 gtk_widget_set_sensitive(LUW("cfg_emu_sidplay2_hardsid"), FALSE); | |
677 #endif | |
678 } | |
679 | |
680 | |
681 void xs_cfg_oversample_toggled(GtkToggleButton * togglebutton, gpointer user_data) | |
682 { | |
683 gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active; | |
684 | |
685 (void) user_data; | |
686 | |
687 gtk_widget_set_sensitive(LUW("cfg_oversample_factor"), isActive); | |
688 gtk_widget_set_sensitive(LUW("cfg_oversample_label1"), isActive); | |
689 gtk_widget_set_sensitive(LUW("cfg_oversample_label2"), isActive); | |
690 } | |
691 | |
692 | |
693 void xs_cfg_mintime_enable_toggled(GtkToggleButton * togglebutton, gpointer user_data) | |
694 { | |
695 gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active; | |
696 | |
697 (void) user_data; | |
698 | |
699 gtk_widget_set_sensitive(LUW("cfg_mintime"), isActive); | |
700 gtk_widget_set_sensitive(LUW("cfg_mintime_label1"), isActive); | |
701 gtk_widget_set_sensitive(LUW("cfg_mintime_label2"), isActive); | |
702 } | |
703 | |
704 | |
705 void xs_cfg_maxtime_enable_toggled(GtkToggleButton * togglebutton, gpointer user_data) | |
706 { | |
707 gboolean isActive = GTK_TOGGLE_BUTTON(LUW("cfg_maxtime_enable"))->active; | |
708 | |
709 (void) togglebutton; | |
710 (void) user_data; | |
711 | |
712 gtk_widget_set_sensitive(LUW("cfg_maxtime_unknown"), isActive); | |
713 gtk_widget_set_sensitive(LUW("cfg_maxtime"), isActive); | |
714 gtk_widget_set_sensitive(LUW("cfg_maxtime_label1"), isActive); | |
715 gtk_widget_set_sensitive(LUW("cfg_maxtime_label2"), isActive); | |
716 } | |
717 | |
718 | |
719 void xs_cfg_sld_enable_toggled(GtkToggleButton * togglebutton, gpointer user_data) | |
720 { | |
721 gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active; | |
722 | |
723 (void) user_data; | |
724 | |
725 gtk_widget_set_sensitive(LUW("cfg_sld_dbpath"), isActive); | |
726 gtk_widget_set_sensitive(LUW("cfg_sld_dbbrowse"), isActive); | |
727 gtk_widget_set_sensitive(LUW("cfg_sld_label1"), isActive); | |
728 } | |
729 | |
730 | |
731 void xs_cfg_stil_enable_toggled(GtkToggleButton * togglebutton, gpointer user_data) | |
732 { | |
733 gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active; | |
734 | |
735 (void) user_data; | |
736 | |
737 gtk_widget_set_sensitive(LUW("cfg_stil_dbpath"), isActive); | |
738 gtk_widget_set_sensitive(LUW("cfg_stil_browse"), isActive); | |
739 gtk_widget_set_sensitive(LUW("cfg_stil_label1"), isActive); | |
740 | |
741 gtk_widget_set_sensitive(LUW("cfg_hvsc_path"), isActive); | |
742 gtk_widget_set_sensitive(LUW("cfg_hvsc_browse"), isActive); | |
743 gtk_widget_set_sensitive(LUW("cfg_hvsc_label1"), isActive); | |
744 } | |
745 | |
746 | |
747 void xs_cfg_subauto_enable_toggled(GtkToggleButton * togglebutton, gpointer user_data) | |
748 { | |
749 gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active; | |
750 | |
751 (void) user_data; | |
752 | |
753 gtk_widget_set_sensitive(LUW("cfg_subauto_min_only"), isActive); | |
754 gtk_widget_set_sensitive(LUW("cfg_subauto_mintime"), isActive); | |
755 } | |
756 | |
757 | |
758 void xs_cfg_subauto_min_only_toggled(GtkToggleButton * togglebutton, gpointer user_data) | |
759 { | |
760 gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active && | |
761 GTK_TOGGLE_BUTTON(LUW("cfg_subauto_enable"))->active; | |
762 | |
763 (void) user_data; | |
764 | |
765 gtk_widget_set_sensitive(LUW("cfg_subauto_mintime"), isActive); | |
766 } | |
767 | |
768 | |
769 void xs_cfg_mintime_changed(GtkEditable * editable, gpointer user_data) | |
770 { | |
771 gint tmpValue; | |
772 GtkAdjustment *tmpAdj; | |
773 | |
774 (void) user_data; | |
775 | |
776 tmpAdj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(LUW("cfg_maxtime"))); | |
777 | |
778 tmpValue = (gint) gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(editable))->value; | |
779 | |
780 if (tmpValue > tmpAdj->value) | |
781 gtk_adjustment_set_value(tmpAdj, tmpValue); | |
782 } | |
783 | |
784 | |
785 void xs_cfg_maxtime_changed(GtkEditable * editable, gpointer user_data) | |
786 { | |
787 gint tmpValue; | |
788 GtkAdjustment *tmpAdj; | |
789 | |
790 (void) user_data; | |
791 | |
792 tmpAdj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(LUW("cfg_mintime"))); | |
793 | |
794 tmpValue = (gint) gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(editable))->value; | |
795 | |
796 if (tmpValue < tmpAdj->value) | |
797 gtk_adjustment_set_value(tmpAdj, tmpValue); | |
798 } | |
799 | |
800 | |
801 void xs_cfg_filter2_reset(GtkButton * button, gpointer user_data) | |
802 { | |
803 (void) button; (void) user_data; | |
804 } | |
805 | |
806 /* | |
807 * Execute the configuration panel | |
808 */ | |
809 void xs_configure(void) | |
810 { | |
811 gint i; | |
812 gfloat tmpValue; | |
813 | |
814 /* Check if the window already exists */ | |
815 if (xs_configwin != NULL) { | |
816 gdk_window_raise(xs_configwin->window); | |
817 return; | |
818 } | |
819 | |
820 /* Create the window */ | |
821 xs_configwin = create_xs_configwin(); | |
822 | |
823 /* Get lock on configuration */ | |
824 XS_MUTEX_LOCK(xs_cfg); | |
825 | |
826 /* Based on available optional parts, gray out options */ | |
827 #ifndef HAVE_SIDPLAY1 | |
828 gtk_widget_set_sensitive(LUW("cfg_emu_sidplay1"), FALSE); | |
829 gtk_widget_set_sensitive(LUW("cfg_box_sidplay1"), FALSE); | |
830 #endif | |
831 | |
832 #ifndef HAVE_SIDPLAY2 | |
833 gtk_widget_set_sensitive(LUW("cfg_emu_sidplay2"), FALSE); | |
834 gtk_widget_set_sensitive(LUW("cfg_box_sidplay2"), FALSE); | |
835 #endif | |
836 | |
837 #ifndef HAVE_XMMSEXTRA | |
838 gtk_widget_set_sensitive(LUW("cfg_ftitle_override"), FALSE); | |
839 xs_cfg.titleOverride = TRUE; | |
840 #endif | |
841 | |
842 #ifndef HAVE_SONG_POSITION | |
843 gtk_widget_set_sensitive(LUW("cfg_subctrl_patch"), FALSE); | |
844 #endif | |
845 | |
846 /* Update the widget sensitivities */ | |
847 xs_cfg_emu_filters_toggled((GtkToggleButton *) LUW("cfg_emu_filters"), NULL); | |
848 xs_cfg_ftitle_override_toggled((GtkToggleButton *) LUW("cfg_ftitle_override"), NULL); | |
849 xs_cfg_emu_sidplay1_toggled((GtkToggleButton *) LUW("cfg_emu_sidplay1"), NULL); | |
850 xs_cfg_emu_sidplay2_toggled((GtkToggleButton *) LUW("cfg_emu_sidplay2"), NULL); | |
851 xs_cfg_oversample_toggled((GtkToggleButton *) LUW("cfg_oversample"), NULL); | |
852 xs_cfg_mintime_enable_toggled((GtkToggleButton *) LUW("cfg_mintime_enable"), NULL); | |
853 xs_cfg_maxtime_enable_toggled((GtkToggleButton *) LUW("cfg_maxtime_enable"), NULL); | |
854 xs_cfg_sld_enable_toggled((GtkToggleButton *) LUW("cfg_sld_enable"), NULL); | |
855 xs_cfg_stil_enable_toggled((GtkToggleButton *) LUW("cfg_stil_enable"), NULL); | |
856 xs_cfg_subauto_enable_toggled((GtkToggleButton *) LUW("cfg_subauto_enable"), NULL); | |
857 xs_cfg_subauto_min_only_toggled((GtkToggleButton *) LUW("cfg_subauto_min_only"), NULL); | |
858 | |
859 | |
860 /* Set current data to widgets */ | |
861 for (i = 0; i < xs_widtable_max; i++) { | |
862 switch (xs_widtable[i].widType) { | |
863 case WTYPE_BGROUP: | |
864 /* Check if current value matches the given one */ | |
865 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName)), | |
866 (*((gint *) xs_widtable[i].itemData) == xs_widtable[i].itemSet) | |
867 ); | |
868 break; | |
869 | |
870 | |
871 case WTYPE_SPIN: | |
872 case WTYPE_SCALE: | |
873 /* Get the value */ | |
874 switch (xs_widtable[i].itemType) { | |
875 case CTYPE_INT: | |
876 tmpValue = (gfloat) * ((gint *) xs_widtable[i].itemData); | |
877 break; | |
878 | |
879 case CTYPE_FLOAT: | |
880 tmpValue = *((gfloat *) xs_widtable[i].itemData); | |
881 break; | |
882 | |
883 default: | |
884 tmpValue = -1; | |
885 } | |
886 | |
887 /* Set the value */ | |
888 switch (xs_widtable[i].widType) { | |
889 case WTYPE_SPIN: | |
890 gtk_adjustment_set_value(gtk_spin_button_get_adjustment | |
891 (GTK_SPIN_BUTTON(LUW(xs_widtable[i].widName))), tmpValue); | |
892 break; | |
893 | |
894 case WTYPE_SCALE: | |
895 gtk_adjustment_set_value(gtk_range_get_adjustment | |
896 (GTK_RANGE(LUW(xs_widtable[i].widName))), tmpValue); | |
897 break; | |
898 } | |
899 break; | |
900 | |
901 case WTYPE_BUTTON: | |
902 /* Set toggle-button */ | |
903 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName)), | |
904 *((gboolean *) xs_widtable[i].itemData) | |
905 ); | |
906 break; | |
907 | |
908 case WTYPE_TEXT: | |
909 /* Set text to text-widget */ | |
910 if (*(gchar **) xs_widtable[i].itemData != NULL) { | |
911 gtk_entry_set_text(GTK_ENTRY(LUW(xs_widtable[i].widName)), | |
912 *(gchar **) xs_widtable[i].itemData); | |
913 } | |
914 break; | |
915 } | |
916 } | |
917 | |
918 /* Release the configuration */ | |
919 XS_MUTEX_UNLOCK(xs_cfg); | |
920 | |
921 /* Show the widget */ | |
922 gtk_widget_show(xs_configwin); | |
923 } |