Mercurial > hg > xmms-sid
view src/xs_config.c @ 3:279b1e12df2b
Updated to version 0.8-devel
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 03 Jun 2003 11:00:02 +0000 |
parents | 183e7cbc1036 |
children | 271be59be975 |
line wrap: on
line source
/* XMMS-SID - SIDPlay input plugin for X MultiMedia System (XMMS) Configuration dialog Written by Matti "ccr" Hamalainen <ccr@tnsp.org> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <xmms/configfile.h> #include <stdio.h> #include "xmms-sid.h" #include "xs_config.h" #include "xs_glade.h" #include "xs_interface.h" /* * Global widgets */ static GtkWidget *xs_configwin = NULL; /* * Configuration specific stuff */ #define XS_CFGTABLE_MAX 25 t_xs_cfg_item xs_cfgtable[XS_CFGTABLE_MAX] = { {ATYPE_INT, &xs_cfg.fmtBitsPerSample, "bitsPerSample"}, {ATYPE_INT, &xs_cfg.fmtChannels, "channels"}, {ATYPE_INT, &xs_cfg.fmtFrequency, "frequency"}, {ATYPE_BOOL,&xs_cfg.muffledOutput, "muffledOutput"}, {ATYPE_BOOL,&xs_cfg.addStaticNoise, "addStaticNoise"}, {ATYPE_BOOL, &xs_cfg.mos8580, "mos8580"}, {ATYPE_BOOL, &xs_cfg.emulateFilter, "emulateFilter"}, {ATYPE_FLOAT, &xs_cfg.filterFs, "filterFs"}, {ATYPE_FLOAT, &xs_cfg.filterFm, "filterFm"}, {ATYPE_FLOAT, &xs_cfg.filterFt, "filterFt"}, {ATYPE_INT, &xs_cfg.memoryMode, "memoryMode"}, {ATYPE_INT, &xs_cfg.clockSpeed, "clockSpeed"}, {ATYPE_BOOL, &xs_cfg.forceSpeed, "forceSpeed"}, {ATYPE_BOOL,&xs_cfg.playUseMaxTime, "playUseMaxTime"}, {ATYPE_INT, &xs_cfg.playMaxTime, "playMaxTime"}, {ATYPE_INT, &xs_cfg.playMethod, "playMethod"}, {ATYPE_INT, &xs_cfg.playMaxSilentTime, "playMaxSilentTime"}, {ATYPE_INT, &xs_cfg.playSilentPercent, "playSilentPercent"}, {ATYPE_STR, &xs_cfg.playDBPath, "playDBPath"}, {ATYPE_BOOL,&xs_cfg.useSTIL, "useSTIL"}, {ATYPE_STR, &xs_cfg.STILpath, "STILpath"}, {ATYPE_BOOL, &xs_cfg.finfoUseColors, "useColors"}, {ATYPE_BOOL,&xs_cfg.detectMagic, "detectMagic"}, {ATYPE_BOOL, &xs_cfg.titleOverride, "titleOverride"}, {ATYPE_STR, &xs_cfg.titleFormat, "fileInfo"} }; /* * Reset the filter settings */ void xs_reset_filters(void) { /* Reset filter values */ // FIXME FIX ME /* xs_cfg.filterFs = XMMS_SID_DEFAULT_FILTERFS; xs_cfg.filterFm = XMMS_SID_DEFAULT_FILTERFM; xs_cfg.filterFt = XMMS_SID_DEFAULT_FILTERFT; */ } /* * Get the configuration (from file or default) */ void xs_get_configure(void) { gchar *cfg_fn, *tmpstr; ConfigFile *cfg_file; gint i; XSDEBUG("initializing configuration ...\n"); /* Pre-initialize configuration structure */ xs_cfg.fmtBitsPerSample = 16; xs_cfg.fmtChannels = XMMS_SID_CHN_MONO; xs_cfg.fmtFrequency = 44100; xs_cfg.muffledOutput = FALSE; xs_cfg.addStaticNoise = FALSE; xs_cfg.mos8580 = FALSE; xs_cfg.emulateFilter = TRUE; xs_reset_filters(); xs_cfg.memoryMode = XMMS_SID_MPU_BANK_SWITCHING; xs_cfg.clockSpeed = XMMS_SID_CLOCK_PAL; xs_cfg.forceSpeed = FALSE; xs_cfg.playUseMaxTime = FALSE; xs_cfg.playMaxTime = 150; xs_cfg.playMethod = XMMS_SID_PMETHOD_NONE; xs_cfg.playMaxSilentTime = 20; xs_cfg.playSilentPercent = 3; xs_strcalloc(&xs_cfg.playDBPath, "~/C64Music/Songlength.txt"); xs_cfg.useSTIL = FALSE; xs_strcalloc(&xs_cfg.STILpath, "~/C64Music/DOCUMENTS/STIL.txt"); xs_cfg.finfoUseColors = TRUE; xs_cfg.detectMagic = FALSE; xs_cfg.titleOverride = FALSE; xs_strcalloc(&xs_cfg.titleFormat, "%1 - %2"); /* Try to open the XMMS configuration file */ XSDEBUG("loading from config-file ...\n"); cfg_fn = g_strconcat(g_get_home_dir(), "/.xmms/config", NULL); cfg_file = xmms_cfg_open_file(cfg_fn); g_free(cfg_fn); if (cfg_file == NULL) return; /* Read the new settings from XMMS configuration file */ for (i = 0; i < XS_CFGTABLE_MAX; i++) { switch (xs_cfgtable[i].atype) { case ATYPE_INT: xmms_cfg_read_int(cfg_file, XMMS_SID_CONFIG_IDENT, xs_cfgtable[i].aname, (gint *) xs_cfgtable[i].adata); break; case ATYPE_BOOL: xmms_cfg_read_boolean(cfg_file, XMMS_SID_CONFIG_IDENT, xs_cfgtable[i].aname, (gboolean *) xs_cfgtable[i].adata); break; case ATYPE_FLOAT: xmms_cfg_read_float(cfg_file, XMMS_SID_CONFIG_IDENT, xs_cfgtable[i].aname, (gfloat *) xs_cfgtable[i].adata); break; case ATYPE_STR: if (xmms_cfg_read_string(cfg_file, XMMS_SID_CONFIG_IDENT, xs_cfgtable[i].aname, (gchar **) &tmpstr)) { /* Read was successfull */ xs_strcalloc((gchar **) xs_cfgtable[i].adata, tmpstr); g_free(tmpstr); } break; default: XSERR("Internal: Unsupported setting type found while reading configuration file. Please report to author!\n"); break; } } /* Free the config file */ xmms_cfg_free(cfg_file); XSDEBUG("OK\n"); } /* * Configuration panel was canceled */ void xs_configure_cancel(void) { gtk_widget_destroy(xs_configwin); xs_configwin = NULL; } /* * Configuration was accepted (OK), save the settings */ void xs_configure_ok(void) { ConfigFile *cfg_file; gchar *cfg_fn; gint i; XSDEBUG("get data from widgets to config...\n"); /* Check the resolution settings */ if (GTK_TOGGLE_BUTTON(cfg_res_16bit)->active) xs_cfg.fmtBitsPerSample = 16; else if (GTK_TOGGLE_BUTTON(cfg_res_8bit)->active) xs_cfg.fmtBitsPerSample = 8; /* Channel settings */ if (GTK_TOGGLE_BUTTON(cfg_chn_mono)->active) xs_cfg.fmtChannels = XMMS_SID_CHN_MONO; else if (GTK_TOGGLE_BUTTON(cfg_chn_stereo)->active) xs_cfg.fmtChannels = XMMS_SID_CHN_STEREO; else if (GTK_TOGGLE_BUTTON(cfg_chn_autopan)->active) xs_cfg.fmtChannels = XMMS_SID_CHN_AUTOPAN; /* Frequency setting */ xs_cfg.fmtFrequency = (gint) GTK_ADJUSTMENT(cfg_samplerate_adj)->value; /* Experimental settings */ xs_cfg.muffledOutput = GTK_TOGGLE_BUTTON(cfg_muffledoutput)->active; xs_cfg.addStaticNoise = GTK_TOGGLE_BUTTON(cfg_addstaticnoise)->active; /* Filter and waveform settings */ xs_cfg.mos8580 = ((GTK_TOGGLE_BUTTON(cfg_wav_mos8580)->active) && (!GTK_TOGGLE_BUTTON(cfg_wav_mos6581)->active)); xs_cfg.emulateFilter = GTK_TOGGLE_BUTTON(cfg_emufilters)->active; xs_cfg.filterFs = GTK_ADJUSTMENT(cfg_filt_fs_adj)->value; xs_cfg.filterFm = GTK_ADJUSTMENT(cfg_filt_fm_adj)->value; xs_cfg.filterFt = GTK_ADJUSTMENT(cfg_filt_ft_adj)->value; /* Memorymode settings */ if (GTK_TOGGLE_BUTTON(cfg_mem_banksw)->active) xs_cfg.memoryMode = XMMS_SID_MPU_BANK_SWITCHING; else if (GTK_TOGGLE_BUTTON(cfg_mem_transrom)->active) xs_cfg.memoryMode = XMMS_SID_MPU_TRANSPARENT_ROM; else if (GTK_TOGGLE_BUTTON(cfg_mem_playsid)->active) xs_cfg.memoryMode = XMMS_SID_MPU_PLAYSID_ENVIRONMENT; /* Clockspeed settings */ if (GTK_TOGGLE_BUTTON(cfg_clock_pal)->active) xs_cfg.clockSpeed = XMMS_SID_CLOCK_PAL; else if (GTK_TOGGLE_BUTTON(cfg_clock_ntsc)->active) xs_cfg.clockSpeed = XMMS_SID_CLOCK_NTSC; xs_cfg.forceSpeed = GTK_TOGGLE_BUTTON(cfg_clock_force)->active; /* Songlength-detection settings */ xs_cfg.playUseMaxTime = GTK_TOGGLE_BUTTON(cfg_sld_usemaxtime)->active; xs_cfg.playMaxTime = GTK_ADJUSTMENT(cfg_sld_maxtime_adj)->value; if (GTK_TOGGLE_BUTTON(cfg_sld_none)->active) xs_cfg.playMethod = XMMS_SID_PMETHOD_NONE; else if (GTK_TOGGLE_BUTTON(cfg_sld_maxsilence)->active) xs_cfg.playMethod = XMMS_SID_PMETHOD_MAXSILENCE; else if (GTK_TOGGLE_BUTTON(cfg_sld_database)->active) xs_cfg.playMethod = XMMS_SID_PMETHOD_DATABASE; xs_cfg.playMaxSilentTime = GTK_ADJUSTMENT(cfg_sld_silencetime_adj)->value; xs_cfg.playSilentPercent = GTK_ADJUSTMENT(cfg_sld_percentage_adj)->value; xs_strcalloc(&xs_cfg.playDBPath, gtk_entry_get_text(GTK_ENTRY(cfg_sld_dbpath))); /* STIL and miscellaneous settings */ xs_cfg.useSTIL = GTK_TOGGLE_BUTTON(cfg_stil_use)->active; xs_strcalloc(&xs_cfg.STILpath, gtk_entry_get_text(GTK_ENTRY(cfg_stil_path))); xs_cfg.finfoUseColors = GTK_TOGGLE_BUTTON(cfg_finfo_usecolors)->active; xs_cfg.detectMagic = GTK_TOGGLE_BUTTON(cfg_detectmagic)->active; /* Title settings */ xs_cfg.titleOverride = GTK_TOGGLE_BUTTON(cfg_ftitle_override)->active; xs_strcalloc(&xs_cfg.titleFormat, gtk_entry_get_text(GTK_ENTRY(cfg_ftitle_format))); /* * Try to open the XMMS configuration file */ cfg_fn = g_strconcat(g_get_home_dir(), "/.xmms/config", NULL); cfg_file = xmms_cfg_open_file(cfg_fn); if (!cfg_file) cfg_file = xmms_cfg_new(); /* Write the new settings to XMMS configuration file */ for (i = 0; i < XS_CFGTABLE_MAX; i++) { switch (xs_cfgtable[i].atype) { case ATYPE_INT: xmms_cfg_write_int(cfg_file, XMMS_SID_CONFIG_IDENT, xs_cfgtable[i].aname, *(gint *) xs_cfgtable[i].adata); break; case ATYPE_BOOL: xmms_cfg_write_boolean(cfg_file, XMMS_SID_CONFIG_IDENT, xs_cfgtable[i].aname, *(gboolean *) xs_cfgtable[i].adata); break; case ATYPE_FLOAT: xmms_cfg_write_float(cfg_file, XMMS_SID_CONFIG_IDENT, xs_cfgtable[i].aname, *(gfloat *) xs_cfgtable[i].adata); break; case ATYPE_STR: xmms_cfg_write_string(cfg_file, XMMS_SID_CONFIG_IDENT, xs_cfgtable[i].aname, *(gchar **) xs_cfgtable[i].adata); break; default: XSERR("Internal: Unsupported setting type found while writing configuration file. Please report to author!\n"); break; } } /* Flush the file */ xmms_cfg_write_file(cfg_file, cfg_fn); /* Free the memory areas */ xmms_cfg_free(cfg_file); g_free(cfg_fn); gtk_widget_destroy(xs_configwin); xs_configwin = NULL; } /* * Update filter setting sliders */ static void xs_update_filters(void) { gtk_adjustment_set_value(GTK_ADJUSTMENT(cfg_filt_fs_adj), xs_cfg.filterFs); gtk_adjustment_set_value(GTK_ADJUSTMENT(cfg_filt_fm_adj), xs_cfg.filterFm); gtk_adjustment_set_value(GTK_ADJUSTMENT(cfg_filt_ft_adj), xs_cfg.filterFt); } /* * Reset filter settings to defaults */ static void xs_cfg_filter_reset(void) { xs_reset_filters(); xs_update_filters(); } /* * HVSC songlength-database file selector response-functions */ void xs_cfg_sld_fs_ok(void) { /* Selection was accepted! */ gtk_entry_set_text(GTK_ENTRY(cfg_sld_dbpath), gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_sld_fileselector)) ); /* Close file selector window */ gtk_widget_destroy(xs_sld_fileselector); xs_sld_fileselector = NULL; } void xs_cfg_sld_fs_cancel(void) { /* Close file selector window */ gtk_widget_destroy(xs_sld_fileselector); xs_sld_fileselector = NULL; } /* * STIL-database file selector response-functions */ void xs_cfg_stil_fs_ok(void) { /* Selection was accepted! */ gtk_entry_set_text(GTK_ENTRY(cfg_stil_path), gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_stil_fileselector)) ); /* Close file selector window */ gtk_widget_destroy(xs_stil_fileselector); xs_stil_fileselector = NULL; } void xs_cfg_stil_fs_cancel(void) { /* Close file selector window */ gtk_widget_destroy(xs_stil_fileselector); xs_stil_fileselector = NULL; } /* * Execute the configuration panel */ void xs_configure(void) { /* Check if the window already exists */ if (xs_configwin != NULL) { gdk_window_raise(xs_configwin->window); return; } /* Set the states of widgets */ /* Sound resolution settings */ switch (xs_cfg.fmtBitsPerSample) { case 16: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_res_16bit), TRUE); break; case 8: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_res_8bit), TRUE); break; } gtk_adjustment_set_value(GTK_ADJUSTMENT(cfg_samplerate_adj), xs_cfg.fmtFrequency); /* Channel settings */ switch (xs_cfg.fmtChannels) { case 0: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_chn_mono), TRUE); break; case 1: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_chn_stereo), TRUE); break; case 2: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_chn_autopan), TRUE); break; } /* Memorymode settings */ switch (xs_cfg.memoryMode) { case XMMS_SID_MPU_BANK_SWITCHING: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_mem_banksw), TRUE); break; case XMMS_SID_MPU_TRANSPARENT_ROM: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_mem_transrom), TRUE); break; case XMMS_SID_MPU_PLAYSID_ENVIRONMENT: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_mem_playsid), TRUE); break; } /* Filter and waveform settings */ if (xs_cfg.mos8580) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_wav_mos8580), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_wav_mos6581), TRUE); } if (xs_cfg.emulateFilter) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_emufilters), TRUE); } xs_cfg_filt_update(); /* Song-length detection */ switch (xs_cfg.playMethod) { case XMMS_SID_PMETHOD_NONE: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_sld_none), TRUE); break; case XMMS_SID_PMETHOD_MAXSILENCE: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_sld_maxsilence), TRUE); break; case XMMS_SID_PMETHOD_DATABASE: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_sld_database), TRUE); break; } if (xs_cfg.playUseMaxTime) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_sld_usemaxtime), TRUE); } gtk_adjustment_set_value(GTK_ADJUSTMENT(cfg_sld_maxtime_adj), xs_cfg.playMaxTime); gtk_adjustment_set_value(GTK_ADJUSTMENT(cfg_sld_silencetime_adj), xs_cfg.playMaxSilentTime); gtk_adjustment_set_value(GTK_ADJUSTMENT(cfg_sld_percentage_adj), xs_cfg.playSilentPercent); if (xs_cfg.playDBPath != NULL) { gtk_entry_set_text(GTK_ENTRY(cfg_sld_dbpath), xs_cfg.playDBPath); } /* STIL and miscellaneous settings */ if (xs_cfg.useSTIL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_stil_use), TRUE); } if (xs_cfg.STILpath != NULL) { gtk_entry_set_text(GTK_ENTRY(cfg_stil_path), xs_cfg.STILpath); } if (xs_cfg.finfoUseColors) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_finfo_usecolors), TRUE); } if (xs_cfg.detectMagic) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_detectmagic), TRUE); } /* Title-settings */ if (xs_cfg.titleOverride) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_ftitle_override), TRUE); } if (xs_cfg.titleFormat != NULL) { gtk_entry_set_text(GTK_ENTRY(cfg_ftitle_format), xs_cfg.titleFormat); } gtk_widget_show(xs_configwin); }