comparison src/xs_config.c @ 487:6357b7fe5b0d

Added new WTYPE_COMBO, the audio frequency selection now uses a combobox.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 26 Jan 2007 15:47:03 +0000
parents faf12767a6f1
children cdea37aef52c
comparison
equal deleted inserted replaced
486:4c599be2d349 487:6357b7fe5b0d
98 { WTYPE_BGROUP, CTYPE_INT, "cfg_res_16bit", &xs_cfg.audioBitsPerSample, XS_RES_16BIT }, 98 { WTYPE_BGROUP, CTYPE_INT, "cfg_res_16bit", &xs_cfg.audioBitsPerSample, XS_RES_16BIT },
99 { WTYPE_BGROUP, CTYPE_INT, "cfg_res_8bit", &xs_cfg.audioBitsPerSample, XS_RES_8BIT }, 99 { WTYPE_BGROUP, CTYPE_INT, "cfg_res_8bit", &xs_cfg.audioBitsPerSample, XS_RES_8BIT },
100 { WTYPE_BGROUP, CTYPE_INT, "cfg_chn_mono", &xs_cfg.audioChannels, XS_CHN_MONO }, 100 { WTYPE_BGROUP, CTYPE_INT, "cfg_chn_mono", &xs_cfg.audioChannels, XS_CHN_MONO },
101 { WTYPE_BGROUP, CTYPE_INT, "cfg_chn_stereo", &xs_cfg.audioChannels, XS_CHN_STEREO }, 101 { WTYPE_BGROUP, CTYPE_INT, "cfg_chn_stereo", &xs_cfg.audioChannels, XS_CHN_STEREO },
102 { WTYPE_BGROUP, CTYPE_INT, "cfg_chn_autopan", &xs_cfg.audioChannels, XS_CHN_AUTOPAN }, 102 { WTYPE_BGROUP, CTYPE_INT, "cfg_chn_autopan", &xs_cfg.audioChannels, XS_CHN_AUTOPAN },
103 { WTYPE_SPIN, CTYPE_INT, "cfg_samplerate", &xs_cfg.audioFrequency, 0 }, 103 { WTYPE_COMBO, CTYPE_INT, "cfg_samplerate", &xs_cfg.audioFrequency, XS_AUDIO_FREQ },
104 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_oversample", &xs_cfg.oversampleEnable, 0 }, 104 { WTYPE_BUTTON, CTYPE_BOOL, "cfg_oversample", &xs_cfg.oversampleEnable, 0 },
105 { WTYPE_SPIN, CTYPE_INT, "cfg_oversample_factor",&xs_cfg.oversampleFactor, 0 }, 105 { WTYPE_SPIN, CTYPE_INT, "cfg_oversample_factor",&xs_cfg.oversampleFactor, 0 },
106 106
107 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_sidplay1", &xs_cfg.playerEngine, XS_ENG_SIDPLAY1 }, 107 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_sidplay1", &xs_cfg.playerEngine, XS_ENG_SIDPLAY1 },
108 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_sidplay2", &xs_cfg.playerEngine, XS_ENG_SIDPLAY2 }, 108 { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_sidplay2", &xs_cfg.playerEngine, XS_ENG_SIDPLAY2 },
166 XS_MUTEX_LOCK(xs_cfg); 166 XS_MUTEX_LOCK(xs_cfg);
167 167
168 /* Initialize values with sensible defaults */ 168 /* Initialize values with sensible defaults */
169 xs_cfg.audioBitsPerSample = XS_RES_16BIT; 169 xs_cfg.audioBitsPerSample = XS_RES_16BIT;
170 xs_cfg.audioChannels = XS_CHN_MONO; 170 xs_cfg.audioChannels = XS_CHN_MONO;
171 xs_cfg.audioFrequency = 44100; 171 xs_cfg.audioFrequency = XS_AUDIO_FREQ;
172 172
173 xs_cfg.mos8580 = FALSE; 173 xs_cfg.mos8580 = FALSE;
174 xs_cfg.forceModel = FALSE; 174 xs_cfg.forceModel = FALSE;
175 175
176 xs_cfg.emulateFilters = TRUE; 176 xs_cfg.emulateFilters = TRUE;
234 #ifdef HAVE_XMMSEXTRA 234 #ifdef HAVE_XMMSEXTRA
235 xs_cfg.titleOverride = FALSE; 235 xs_cfg.titleOverride = FALSE;
236 #else 236 #else
237 xs_cfg.titleOverride = TRUE; 237 xs_cfg.titleOverride = TRUE;
238 #endif 238 #endif
239 xs_pstrcpy(&xs_cfg.titleFormat, "%p - %t (%c) [%n/%N][%m]"); 239 xs_pstrcpy(&xs_cfg.titleFormat, "%p - %t (%c) [%n/%N][%m/%C]");
240 240
241 241
242 xs_cfg.subAutoEnable = FALSE; 242 xs_cfg.subAutoEnable = FALSE;
243 xs_cfg.subAutoMinOnly = TRUE; 243 xs_cfg.subAutoMinOnly = TRUE;
244 xs_cfg.subAutoMinTime = 15; 244 xs_cfg.subAutoMinTime = 15;
281 281
282 /* Read the new settings from XMMS configuration file */ 282 /* Read the new settings from XMMS configuration file */
283 for (i = 0; i < xs_cfgtable_max; i++) { 283 for (i = 0; i < xs_cfgtable_max; i++) {
284 switch (xs_cfgtable[i].itemType) { 284 switch (xs_cfgtable[i].itemType) {
285 case CTYPE_INT: 285 case CTYPE_INT:
286 xmms_cfg_read_int(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, 286 xmms_cfg_read_int(cfgFile, XS_CONFIG_IDENT,
287 (gint *) xs_cfgtable[i].itemData); 287 xs_cfgtable[i].itemName,
288 (gint *) xs_cfgtable[i].itemData);
288 break; 289 break;
289 290
290 case CTYPE_BOOL: 291 case CTYPE_BOOL:
291 xmms_cfg_read_boolean(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, 292 xmms_cfg_read_boolean(cfgFile, XS_CONFIG_IDENT,
292 (gboolean *) xs_cfgtable[i].itemData); 293 xs_cfgtable[i].itemName,
294 (gboolean *) xs_cfgtable[i].itemData);
293 break; 295 break;
294 296
295 case CTYPE_FLOAT: 297 case CTYPE_FLOAT:
296 xmms_cfg_read_float(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, 298 xmms_cfg_read_float(cfgFile, XS_CONFIG_IDENT,
297 (gfloat *) xs_cfgtable[i].itemData); 299 xs_cfgtable[i].itemName,
298 break; 300 (gfloat *) xs_cfgtable[i].itemData);
299 301 break;
302
300 case CTYPE_STR: 303 case CTYPE_STR:
301 if (xmms_cfg_read_string 304 if (xmms_cfg_read_string(cfgFile, XS_CONFIG_IDENT,
302 (cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, (gchar **) & tmpStr)) { 305 xs_cfgtable[i].itemName, (gchar **) &tmpStr)) {
303 /* Read was successfull */ 306 /* Read was successfull */
304 xs_pstrcpy((gchar **) xs_cfgtable[i].itemData, tmpStr); 307 xs_pstrcpy((gchar **) xs_cfgtable[i].itemData, tmpStr);
305 g_free(tmpStr); 308 g_free(tmpStr);
306 } 309 }
307 break; 310 break;
308
309 default:
310 xs_error(_("Internal: Unsupported setting type found while reading configuration file. Please report to author!\n"));
311 break;
312 } 311 }
313 } 312 }
314 313
315 314
316 /* Free the config file */ 315 /* Free the config file */
349 348
350 /* Write the new settings to XMMS configuration file */ 349 /* Write the new settings to XMMS configuration file */
351 for (i = 0; i < xs_cfgtable_max; i++) { 350 for (i = 0; i < xs_cfgtable_max; i++) {
352 switch (xs_cfgtable[i].itemType) { 351 switch (xs_cfgtable[i].itemType) {
353 case CTYPE_INT: 352 case CTYPE_INT:
354 xmms_cfg_write_int(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, 353 xmms_cfg_write_int(cfgFile, XS_CONFIG_IDENT,
355 *(gint *) xs_cfgtable[i].itemData); 354 xs_cfgtable[i].itemName,
355 *(gint *) xs_cfgtable[i].itemData);
356 break; 356 break;
357 357
358 case CTYPE_BOOL: 358 case CTYPE_BOOL:
359 xmms_cfg_write_boolean(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, 359 xmms_cfg_write_boolean(cfgFile, XS_CONFIG_IDENT,
360 *(gboolean *) xs_cfgtable[i].itemData); 360 xs_cfgtable[i].itemName,
361 *(gboolean *) xs_cfgtable[i].itemData);
361 break; 362 break;
362 363
363 case CTYPE_FLOAT: 364 case CTYPE_FLOAT:
364 xmms_cfg_write_float(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, 365 xmms_cfg_write_float(cfgFile, XS_CONFIG_IDENT,
365 *(gfloat *) xs_cfgtable[i].itemData); 366 xs_cfgtable[i].itemName,
367 *(gfloat *) xs_cfgtable[i].itemData);
366 break; 368 break;
367 369
368 case CTYPE_STR: 370 case CTYPE_STR:
369 xmms_cfg_write_string(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].itemName, 371 xmms_cfg_write_string(cfgFile, XS_CONFIG_IDENT,
370 *(gchar **) xs_cfgtable[i].itemData); 372 xs_cfgtable[i].itemName,
371 break; 373 *(gchar **) xs_cfgtable[i].itemData);
372
373 default:
374 xs_error(_("Internal: Unsupported setting type found while writing configuration file. Please report to author!\n"));
375 break; 374 break;
376 } 375 }
377 } 376 }
378 377
379 /* Flush the file */ 378 /* Flush the file */
408 */ 407 */
409 void xs_cfg_ok(void) 408 void xs_cfg_ok(void)
410 { 409 {
411 gint i; 410 gint i;
412 gfloat tmpValue; 411 gfloat tmpValue;
412 gint tmpInt;
413 gchar *tmpStr;
414
415 /* Get lock on configuration */
416 XS_MUTEX_LOCK(xs_cfg);
413 417
414 XSDEBUG("get data from widgets to config...\n"); 418 XSDEBUG("get data from widgets to config...\n");
415 419
416 for (i = 0; i < xs_widtable_max; i++) { 420 for (i = 0; i < xs_widtable_max; i++) {
417 switch (xs_widtable[i].widType) { 421 switch (xs_widtable[i].widType) {
421 /* Yes, set the constant value */ 425 /* Yes, set the constant value */
422 *((gint *) xs_widtable[i].itemData) = xs_widtable[i].itemSet; 426 *((gint *) xs_widtable[i].itemData) = xs_widtable[i].itemSet;
423 } 427 }
424 break; 428 break;
425 429
430 case WTYPE_COMBO:
431 /* Get text from text-widget */
432 tmpStr = gtk_entry_get_text(GTK_ENTRY(LUW(xs_widtable[i].widName)));
433 if (sscanf(tmpStr, "%d", &tmpInt) != 1)
434 tmpInt = xs_widtable[i].itemSet;
435
436 *((gint *) xs_widtable[i].itemData) = tmpInt;
437 break;
438
426 case WTYPE_SPIN: 439 case WTYPE_SPIN:
427 case WTYPE_SCALE: 440 case WTYPE_SCALE:
428 /* Get the value */ 441 /* Get the value */
429 switch (xs_widtable[i].widType) { 442 switch (xs_widtable[i].widType) {
430 case WTYPE_SPIN: 443 case WTYPE_SPIN:
431 tmpValue = 444 tmpValue = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(LUW(xs_widtable[i].widName)))->value;
432 gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(LUW(xs_widtable[i].widName)))->value;
433 break; 445 break;
434 446
435 case WTYPE_SCALE: 447 case WTYPE_SCALE:
436 tmpValue = gtk_range_get_adjustment(GTK_RANGE(LUW(xs_widtable[i].widName)))->value; 448 tmpValue = gtk_range_get_adjustment(GTK_RANGE(LUW(xs_widtable[i].widName)))->value;
437 break; 449 break;
438 450
439 default: 451 default:
440 tmpValue = -1; 452 tmpValue = -1;
453 break;
441 } 454 }
442 455
443 /* Set the value */ 456 /* Set the value */
444 switch (xs_widtable[i].itemType) { 457 switch (xs_widtable[i].itemType) {
445 case CTYPE_INT: 458 case CTYPE_INT:
453 break; 466 break;
454 467
455 case WTYPE_BUTTON: 468 case WTYPE_BUTTON:
456 /* Check if toggle-button is active */ 469 /* Check if toggle-button is active */
457 *((gboolean *) xs_widtable[i].itemData) = 470 *((gboolean *) xs_widtable[i].itemData) =
458 (GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName))->active); 471 (GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName))->active);
459 break; 472 break;
460 473
461 case WTYPE_TEXT: 474 case WTYPE_TEXT:
462 /* Get text from text-widget */ 475 /* Get text from text-widget */
463 xs_pstrcpy((gchar **) xs_widtable[i].itemData, 476 xs_pstrcpy((gchar **) xs_widtable[i].itemData,
464 gtk_entry_get_text(GTK_ENTRY(LUW(xs_widtable[i].widName))) 477 gtk_entry_get_text(GTK_ENTRY(LUW(xs_widtable[i].widName))));
465 );
466 break; 478 break;
467 } 479 }
468 } 480 }
469 481
482 /* Release lock */
483 XS_MUTEX_UNLOCK(xs_cfg);
484
470 /* Close window */ 485 /* Close window */
471 gtk_widget_destroy(xs_configwin); 486 gtk_widget_destroy(xs_configwin);
472 xs_configwin = NULL; 487 xs_configwin = NULL;
473 488
474 /* Write settings */ 489 /* Write settings */
489 504
490 gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_emu_filt_fs"))), XS_SIDPLAY1_FS); 505 gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_emu_filt_fs"))), XS_SIDPLAY1_FS);
491 gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_emu_filt_fm"))), XS_SIDPLAY1_FM); 506 gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_emu_filt_fm"))), XS_SIDPLAY1_FM);
492 gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_emu_filt_ft"))), XS_SIDPLAY1_FT); 507 gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_emu_filt_ft"))), XS_SIDPLAY1_FT);
493 } 508 }
494
495
496 509
497 510
498 /* 511 /*
499 * HVSC songlength-database file selector response-functions 512 * HVSC songlength-database file selector response-functions
500 */ 513 */
817 */ 830 */
818 void xs_configure(void) 831 void xs_configure(void)
819 { 832 {
820 gint i; 833 gint i;
821 gfloat tmpValue; 834 gfloat tmpValue;
835 gchar tmpStr[32];
822 GtkWidget *c; 836 GtkWidget *c;
823 837
824 /* Check if the window already exists */ 838 /* Check if the window already exists */
825 if (xs_configwin != NULL) { 839 if (xs_configwin != NULL) {
826 gdk_window_raise(xs_configwin->window); 840 gdk_window_raise(xs_configwin->window);
828 } 842 }
829 843
830 /* Create the window */ 844 /* Create the window */
831 xs_configwin = create_xs_configwin(); 845 xs_configwin = create_xs_configwin();
832 846
847 /* Get lock on configuration */
848 XS_MUTEX_LOCK(xs_cfg);
849
833 /* Create the custom filter curve widget for libSIDPlay2 */ 850 /* Create the custom filter curve widget for libSIDPlay2 */
834 c = xs_curve_new(); 851 c = xs_curve_new();
835 852
836 gtk_widget_set_name(c, "cfg_filter2_curve"); 853 gtk_widget_set_name(c, "cfg_filter2_curve");
837 gtk_widget_ref(c); 854 gtk_widget_ref(c);
838 gtk_object_set_data_full(GTK_OBJECT(xs_configwin), "cfg_filter2_curve", c, (GtkDestroyNotify) gtk_widget_unref); 855 gtk_object_set_data_full(GTK_OBJECT(xs_configwin), "cfg_filter2_curve", c, (GtkDestroyNotify) gtk_widget_unref);
839 gtk_widget_show(c); 856 gtk_widget_show(c);
840 gtk_box_pack_start(GTK_BOX(LUW("cfg_box_sidplay2")), c, TRUE, TRUE, 4); 857 gtk_box_pack_start(GTK_BOX(LUW("cfg_box_sidplay2")), c, TRUE, TRUE, 4);
841 858
842 xs_cfg_filter2_reset(NULL, NULL); 859 xs_cfg_filter2_reset(NULL, NULL);
843
844 /* Get lock on configuration */
845 XS_MUTEX_LOCK(xs_cfg);
846 860
847 /* Based on available optional parts, gray out options */ 861 /* Based on available optional parts, gray out options */
848 #ifndef HAVE_SIDPLAY1 862 #ifndef HAVE_SIDPLAY1
849 gtk_widget_set_sensitive(LUW("cfg_emu_sidplay1"), FALSE); 863 gtk_widget_set_sensitive(LUW("cfg_emu_sidplay1"), FALSE);
850 gtk_widget_set_sensitive(LUW("cfg_box_sidplay1"), FALSE); 864 gtk_widget_set_sensitive(LUW("cfg_box_sidplay1"), FALSE);
880 894
881 /* Set current data to widgets */ 895 /* Set current data to widgets */
882 for (i = 0; i < xs_widtable_max; i++) { 896 for (i = 0; i < xs_widtable_max; i++) {
883 switch (xs_widtable[i].widType) { 897 switch (xs_widtable[i].widType) {
884 case WTYPE_BGROUP: 898 case WTYPE_BGROUP:
899 assert(xs_widtable[i].itemType == CTYPE_INT);
885 /* Check if current value matches the given one */ 900 /* Check if current value matches the given one */
886 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName)), 901 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName)),
887 (*((gint *) xs_widtable[i].itemData) == xs_widtable[i].itemSet) 902 (*((gint *) xs_widtable[i].itemData) == xs_widtable[i].itemSet));
888 ); 903 break;
889 break; 904
890 905 case WTYPE_COMBO:
891 906 assert(xs_widtable[i].itemType == CTYPE_INT);
907 g_snprintf(tmpStr, sizeof(tmpStr), "%d", *(gint *) xs_widtable[i].itemData);
908 gtk_entry_set_text(GTK_ENTRY(LUW(xs_widtable[i].widName)), tmpStr);
909 break;
910
892 case WTYPE_SPIN: 911 case WTYPE_SPIN:
893 case WTYPE_SCALE: 912 case WTYPE_SCALE:
894 /* Get the value */ 913 /* Get the value */
895 switch (xs_widtable[i].itemType) { 914 switch (xs_widtable[i].itemType) {
896 case CTYPE_INT: 915 case CTYPE_INT:
901 tmpValue = *((gfloat *) xs_widtable[i].itemData); 920 tmpValue = *((gfloat *) xs_widtable[i].itemData);
902 break; 921 break;
903 922
904 default: 923 default:
905 tmpValue = -1; 924 tmpValue = -1;
925 assert(0);
926 break;
906 } 927 }
907 928
908 /* Set the value */ 929 /* Set the value */
909 switch (xs_widtable[i].widType) { 930 switch (xs_widtable[i].widType) {
910 case WTYPE_SPIN: 931 case WTYPE_SPIN:
911 gtk_adjustment_set_value(gtk_spin_button_get_adjustment 932 gtk_adjustment_set_value(gtk_spin_button_get_adjustment
912 (GTK_SPIN_BUTTON(LUW(xs_widtable[i].widName))), tmpValue); 933 (GTK_SPIN_BUTTON(LUW(xs_widtable[i].widName))), tmpValue);
913 break; 934 break;
914 935
915 case WTYPE_SCALE: 936 case WTYPE_SCALE:
916 gtk_adjustment_set_value(gtk_range_get_adjustment 937 gtk_adjustment_set_value(gtk_range_get_adjustment
917 (GTK_RANGE(LUW(xs_widtable[i].widName))), tmpValue); 938 (GTK_RANGE(LUW(xs_widtable[i].widName))), tmpValue);
918 break; 939 break;
919 } 940 }
920 break; 941 break;
921 942
922 case WTYPE_BUTTON: 943 case WTYPE_BUTTON:
944 assert(xs_widtable[i].itemType == CTYPE_BOOL);
923 /* Set toggle-button */ 945 /* Set toggle-button */
924 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName)), 946 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName)),
925 *((gboolean *) xs_widtable[i].itemData) 947 *((gboolean *) xs_widtable[i].itemData));
926 );
927 break; 948 break;
928 949
929 case WTYPE_TEXT: 950 case WTYPE_TEXT:
951 assert(xs_widtable[i].itemType == CTYPE_STR);
930 /* Set text to text-widget */ 952 /* Set text to text-widget */
931 if (*(gchar **) xs_widtable[i].itemData != NULL) { 953 if (*(gchar **) xs_widtable[i].itemData != NULL) {
932 gtk_entry_set_text(GTK_ENTRY(LUW(xs_widtable[i].widName)), 954 gtk_entry_set_text(GTK_ENTRY(LUW(xs_widtable[i].widName)),
933 *(gchar **) xs_widtable[i].itemData); 955 *(gchar **) xs_widtable[i].itemData);
934 } 956 }
935 break; 957 break;
936 } 958 }
937 } 959 }
938 960