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 }