Mercurial > hg > xmms-sid
diff src/xs_config.c @ 1:183e7cbc1036
Initial revision
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 03 Jun 2003 10:23:04 +0000 |
parents | |
children | 279b1e12df2b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/xs_config.c Tue Jun 03 10:23:04 2003 +0000 @@ -0,0 +1,863 @@ +/* + xmms-sid - SIDPlay input plugin for X MultiMedia System (XMMS) + + Configuration dialog + + Written by Matti "ccr" Hamalainen <mhamalai@ratol.fi> + (Interface created with Glade, the Gtk+ interface builder, + code edited by hand afterwards to make it work here) + + 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-sid.h" +#include <xmms/configfile.h> +#include <gtk/gtk.h> +#include <stdio.h> + + +/* + * General stuff + */ +static GtkWidget *xs_configwin = NULL; +static GtkWidget *xs_fileselector = NULL; + +static GtkObject *cfg_samplerate_adj, *cfg_filt_fm_adj, *cfg_filt_ft_adj, *cfg_filt_fs_adj; +static GtkWidget *cfg_res_8bit, *cfg_res_16bit, *cfg_checkfilecontent, *cfg_chn_mono; +static GtkWidget *cfg_chn_stereo, *cfg_chn_autopan, *cfg_mem_banksw, *cfg_mem_transrom, *cfg_mem_playsid; +static GtkWidget *cfg_songnameformat, *cfg_clock_pal, *cfg_clock_ntsc, *cfg_clock_force, *cfg_ok, *cfg_cancel; +static GtkWidget *cfg_wav_mos6581, *cfg_wav_mos8580, *cfg_emufilters, *cfg_stil_browse, *cfg_stil_use, *cfg_stil_path; + + + +/* + * Configuration specific stuff + */ +#define XS_CFGTABLE_MAX 15 + +T_sid_cfg_entry xs_cfgtable[XS_CFGTABLE_MAX] = { + { ATYPE_INT, &xs_cfg.bitsPerSample, "bitsPerSample",}, + { ATYPE_INT, &xs_cfg.channels, "channels" }, + { ATYPE_INT, &xs_cfg.frequency, "frequency" }, + { 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.detectMagic, "detectMagic" }, + { ATYPE_STR, &xs_cfg.stilpath, "STILpath" }, + { ATYPE_BOOL, &xs_cfg.usestil, "useSTIL" }, + { ATYPE_STR, &xs_cfg.fileInfo, "fileInfo" } +}; + + + +/* + * Get the configuration (from file or default) + */ +void xs_cfg_filter_reset(void) +{ + /* Reset filter values */ + xs_cfg.filterFs = XMMS_SID_DEFAULT_FILTERFS; + xs_cfg.filterFm = XMMS_SID_DEFAULT_FILTERFM; + xs_cfg.filterFt = XMMS_SID_DEFAULT_FILTERFT; +} + + +void xs_get_configure(void) +{ + gchar *cfg_fn, *tmpstr; + ConfigFile *cfg_file; + gint i; + + /* Pre-initialize configuration structure */ + xs_cfg.bitsPerSample = 16; + xs_cfg.channels = XMMS_SID_CHN_MONO; + xs_cfg.frequency = 44100; + xs_cfg.mos8580 = FALSE; + xs_cfg.emulateFilter = TRUE; + xs_cfg.memoryMode = XMMS_SID_MPU_BANK_SWITCHING; + xs_cfg.clockSpeed = XMMS_SID_CLOCK_PAL; + xs_cfg.forceSpeed = FALSE; + xs_cfg.detectMagic = FALSE; + xs_strcalloc(&xs_cfg.stilpath, "~/C64Music/DOCUMENTS/STIL.txt"); + xs_cfg.usestil = FALSE; + xs_strcalloc(&xs_cfg.fileInfo, "%1 - %2"); + + xs_cfg_filter_reset(); + + + /* 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); + g_free(cfg_fn); + if (cfg_file == 0) return; + + /* Read the new settings from XMMS configuration file */ + + /* WARNING: Some "goto magic" coming up! */ + + for (i = 0; i < XS_CFGTABLE_MAX; i++) { + + switch (xs_cfgtable[i].atype) { + case ATYPE_INT: if (!xmms_cfg_read_int(cfg_file, XMMS_SID_CONFIG_IDENT, + xs_cfgtable[i].aname, (gint *) xs_cfgtable[i].adata)) goto rexit; + break; + + case ATYPE_BOOL: if (!xmms_cfg_read_boolean(cfg_file, XMMS_SID_CONFIG_IDENT, + xs_cfgtable[i].aname, (gboolean *) xs_cfgtable[i].adata)) goto rexit; + break; + + case ATYPE_FLOAT: if (!xmms_cfg_read_float(cfg_file, XMMS_SID_CONFIG_IDENT, + xs_cfgtable[i].aname, (gfloat *) xs_cfgtable[i].adata)) goto rexit; + break; + + case ATYPE_STR: if (!xmms_cfg_read_string(cfg_file, XMMS_SID_CONFIG_IDENT, + xs_cfgtable[i].aname, &tmpstr)) goto rexit; + + /* 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; + } + + } + +rexit: + /* Free the config file */ + xmms_cfg_free(cfg_file); +} + + +/* + * Configuration panel was canceled + */ +void xs_configure_cancel(void) +{ + gtk_widget_destroy(xs_configwin); +} + + +/* + * Configuration was accepted (OK), save the settings + */ +void xs_configure_ok(void) +{ + ConfigFile *cfg_file; + gchar *cfg_fn; + gint i; + + /* Check the resolution settings */ + if (GTK_TOGGLE_BUTTON(cfg_res_16bit)->active) + xs_cfg.bitsPerSample = 16; + else if (GTK_TOGGLE_BUTTON(cfg_res_8bit)->active) + xs_cfg.bitsPerSample = 8; + + if (GTK_TOGGLE_BUTTON(cfg_chn_mono)->active) + xs_cfg.channels = XMMS_SID_CHN_MONO; + else if (GTK_TOGGLE_BUTTON(cfg_chn_stereo)->active) + xs_cfg.channels = XMMS_SID_CHN_STEREO; + else if (GTK_TOGGLE_BUTTON(cfg_chn_autopan)->active) + xs_cfg.channels = XMMS_SID_CHN_AUTOPAN; + + xs_cfg.frequency = (gint)GTK_ADJUSTMENT(cfg_samplerate_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; + + + /* 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; + + + /* STIL and miscellaneous settings */ + xs_cfg.detectMagic = GTK_TOGGLE_BUTTON(cfg_checkfilecontent)->active; + 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_strcalloc(&xs_cfg.fileInfo, gtk_entry_get_text(GTK_ENTRY(cfg_songnameformat))); + + + /* 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; + } + + } + + xmms_cfg_write_file(cfg_file, cfg_fn); + + xmms_cfg_free(cfg_file); + + g_free(cfg_fn); + + gtk_widget_destroy(xs_configwin); +} + + +/* + * Update filter setting sliders + */ +static void xs_cfg_filt_update(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_filt_reset(void) +{ + xs_cfg_filter_reset(); + xs_cfg_filt_update(); +} + + +/* + * STIL-database file selector response-functions + */ +void xs_cfg_fs_ok(void) +{ + /* Selection was accepted! */ + gtk_entry_set_text( + GTK_ENTRY(cfg_stil_path), + gtk_file_selection_get_filename(GTK_FILE_SELECTION (xs_fileselector)) + ); + + /* Close file selector window */ + gtk_widget_destroy(xs_fileselector); + xs_fileselector = NULL; +} + + +void xs_cfg_fs_cancel(void) +{ + /* Close file selector window */ + gtk_widget_destroy(xs_fileselector); + xs_fileselector = NULL; +} + + +/* + * Open up a file-selection dialog for browsing STIL-database file + */ +void xs_cfg_stil_browse(void) +{ + GtkWidget *fs_but_ok, *fs_but_cancel; + + /* Check if the window already exists */ + if (xs_fileselector != NULL) { + gdk_window_raise(xs_fileselector->window); + return; + } + + /* No, create a new one */ + xs_fileselector = gtk_file_selection_new ("Select STIL Database-File"); + gtk_signal_connect(GTK_OBJECT(xs_fileselector),"destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed),&xs_fileselector); + + gtk_object_set_data (GTK_OBJECT (xs_fileselector), "xs_fileselector", xs_fileselector); + gtk_container_set_border_width (GTK_CONTAINER (xs_fileselector), 10); + GTK_WINDOW (xs_fileselector)->type = GTK_WINDOW_DIALOG; + gtk_window_set_position (GTK_WINDOW (xs_fileselector), GTK_WIN_POS_MOUSE); + gtk_window_set_modal (GTK_WINDOW (xs_fileselector), TRUE); + gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (xs_fileselector)); + + fs_but_ok = GTK_FILE_SELECTION (xs_fileselector)->ok_button; + gtk_object_set_data (GTK_OBJECT (xs_fileselector), "fs_but_ok", fs_but_ok); + gtk_widget_show (fs_but_ok); + GTK_WIDGET_SET_FLAGS (fs_but_ok, GTK_CAN_DEFAULT); + + fs_but_cancel = GTK_FILE_SELECTION (xs_fileselector)->cancel_button; + gtk_object_set_data (GTK_OBJECT (xs_fileselector), "fs_but_cancel", fs_but_cancel); + gtk_widget_show (fs_but_cancel); + GTK_WIDGET_SET_FLAGS (fs_but_cancel, GTK_CAN_DEFAULT); + + + /* Connect signals */ + gtk_signal_connect (GTK_OBJECT (fs_but_ok), "clicked", + GTK_SIGNAL_FUNC (xs_cfg_fs_ok), + NULL); + + gtk_signal_connect (GTK_OBJECT (fs_but_cancel), "clicked", + GTK_SIGNAL_FUNC (xs_cfg_fs_cancel), + NULL); + + /* Show the dialog */ + gtk_widget_show(xs_fileselector); +} + + +/* + * Execute the configuration panel + */ +void xs_configure(void) +{ + GSList *resolution_group = NULL; + GSList *channels_group = NULL; + GSList *speed_group = NULL; + GSList *waveforms_group = NULL; + GSList *memorymode_group = NULL; + GtkWidget *vbox1, *cfg_notebook, *vbox6, *hbox2, *frame4, *vbox9, *frame5, *vbox10; + GtkWidget *frame8, *alignment4, *hbox4, *label8, *label1, *vbox2, *hbox1, *frame2, *vbox4, *frame3; + GtkWidget *vbox3, *frame1, *vbox5, *label2, *vbox7, *frame7, *vbox8, *hbox3, *label4, *alignment2; + GtkWidget *alignment1, *frame9, *vbox11, *alignment3, *label7, *label3, *fixed1,*label9, *frame12; + GtkWidget *cfg_frm2, *cfg_frm1, *label6, *hbuttonbox1; + GtkWidget *cfg_filt_reset, *cfg_samplerate, *cfg_filt_fm,*cfg_filt_fs, *cfg_filt_ft; + GtkTooltips *tooltips; + + /* Check if the window already exists */ + if (xs_configwin != NULL) { + gdk_window_raise(xs_configwin->window); + return; + } + + + /* No, create a new one */ + tooltips = gtk_tooltips_new (); + + xs_configwin = gtk_window_new (GTK_WINDOW_DIALOG); + gtk_signal_connect(GTK_OBJECT(xs_configwin),"destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed),&xs_configwin); + gtk_object_set_data (GTK_OBJECT (xs_configwin), "xs_configwin", xs_configwin); + gtk_window_set_title (GTK_WINDOW (xs_configwin), "xmms-sid configuration"); + gtk_window_set_policy (GTK_WINDOW (xs_configwin), FALSE, FALSE, FALSE); + gtk_window_set_position (GTK_WINDOW(xs_configwin), GTK_WIN_POS_MOUSE); + + /* Start creating the widgets ! */ + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox1); + gtk_widget_show (vbox1); + gtk_container_add (GTK_CONTAINER (xs_configwin), vbox1); + gtk_container_set_border_width (GTK_CONTAINER (vbox1), 8); + + cfg_notebook = gtk_notebook_new (); + gtk_widget_ref (cfg_notebook); + gtk_widget_show (cfg_notebook); + gtk_box_pack_start (GTK_BOX (vbox1), cfg_notebook, TRUE, TRUE, 0); + + vbox6 = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox6); + gtk_widget_show (vbox6); + gtk_container_add (GTK_CONTAINER (cfg_notebook), vbox6); + + hbox2 = gtk_hbox_new (FALSE, 0); + gtk_widget_ref (hbox2); + gtk_widget_show (hbox2); + gtk_box_pack_start (GTK_BOX (vbox6), hbox2, TRUE, TRUE, 0); + + frame4 = gtk_frame_new ("Resolution:"); + gtk_widget_ref (frame4); + gtk_widget_show (frame4); + gtk_box_pack_start (GTK_BOX (hbox2), frame4, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (frame4), 4); + + vbox9 = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox9); + gtk_widget_show (vbox9); + gtk_container_add (GTK_CONTAINER (frame4), vbox9); + + cfg_res_8bit = gtk_radio_button_new_with_label (resolution_group, "8-bit"); + resolution_group = gtk_radio_button_group (GTK_RADIO_BUTTON (cfg_res_8bit)); + gtk_widget_ref (cfg_res_8bit); + gtk_widget_show (cfg_res_8bit); + gtk_box_pack_start (GTK_BOX (vbox9), cfg_res_8bit, FALSE, FALSE, 0); + + cfg_res_16bit = gtk_radio_button_new_with_label (resolution_group, "16-bit"); + resolution_group = gtk_radio_button_group (GTK_RADIO_BUTTON (cfg_res_16bit)); + gtk_widget_ref (cfg_res_16bit); + gtk_widget_show (cfg_res_16bit); + gtk_box_pack_start (GTK_BOX (vbox9), cfg_res_16bit, FALSE, FALSE, 0); + + frame5 = gtk_frame_new ("Channels:"); + gtk_widget_ref (frame5); + gtk_widget_show (frame5); + gtk_box_pack_start (GTK_BOX (hbox2), frame5, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (frame5), 4); + + vbox10 = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox10); + gtk_widget_show (vbox10); + gtk_container_add (GTK_CONTAINER (frame5), vbox10); + + cfg_chn_mono = gtk_radio_button_new_with_label (channels_group, "Mono"); + channels_group = gtk_radio_button_group (GTK_RADIO_BUTTON (cfg_chn_mono)); + gtk_widget_ref (cfg_chn_mono); + gtk_widget_show (cfg_chn_mono); + gtk_box_pack_start (GTK_BOX (vbox10), cfg_chn_mono, FALSE, FALSE, 0); + + cfg_chn_stereo = gtk_radio_button_new_with_label (channels_group, "Stereo"); + channels_group = gtk_radio_button_group (GTK_RADIO_BUTTON (cfg_chn_stereo)); + gtk_widget_ref (cfg_chn_stereo); + gtk_widget_show (cfg_chn_stereo); + gtk_box_pack_start (GTK_BOX (vbox10), cfg_chn_stereo, FALSE, FALSE, 0); + + cfg_chn_autopan = gtk_radio_button_new_with_label (channels_group, "Autopanning"); + channels_group = gtk_radio_button_group (GTK_RADIO_BUTTON (cfg_chn_autopan)); + gtk_widget_ref (cfg_chn_autopan); + gtk_widget_show (cfg_chn_autopan); + gtk_box_pack_start (GTK_BOX (vbox10), cfg_chn_autopan, FALSE, FALSE, 0); + + frame8 = gtk_frame_new ("Samplerate:"); + gtk_widget_ref (frame8); + gtk_widget_show (frame8); + gtk_box_pack_start (GTK_BOX (vbox6), frame8, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (frame8), 4); + + alignment4 = gtk_alignment_new (0.04, 0, 0.12, 0.5); + gtk_widget_ref (alignment4); + gtk_widget_show (alignment4); + gtk_container_add (GTK_CONTAINER (frame8), alignment4); + + hbox4 = gtk_hbox_new (FALSE, 0); + gtk_widget_ref (hbox4); + gtk_widget_show (hbox4); + gtk_container_add (GTK_CONTAINER (alignment4), hbox4); + + cfg_samplerate_adj = gtk_adjustment_new (44100, 4000, 48000, 100, 1000, 0); + cfg_samplerate = gtk_spin_button_new (GTK_ADJUSTMENT (cfg_samplerate_adj), 1, 0); + gtk_widget_ref (cfg_samplerate); + gtk_widget_show (cfg_samplerate); + gtk_box_pack_start (GTK_BOX (hbox4), cfg_samplerate, TRUE, TRUE, 0); + + label8 = gtk_label_new ("Hz"); + gtk_widget_ref (label8); + gtk_widget_show (label8); + gtk_box_pack_start (GTK_BOX (hbox4), label8, FALSE, TRUE, 4); + + cfg_checkfilecontent = gtk_check_button_new_with_label ("Determine filetype by contents (slower)"); + gtk_widget_ref (cfg_checkfilecontent); + gtk_widget_show (cfg_checkfilecontent); + gtk_box_pack_start (GTK_BOX (vbox6), cfg_checkfilecontent, FALSE, FALSE, 0); + + label1 = gtk_label_new ("Audio"); + gtk_widget_ref (label1); + gtk_widget_show (label1); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (cfg_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (cfg_notebook), 0), label1); + + vbox2 = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox2); + gtk_widget_show (vbox2); + gtk_container_add (GTK_CONTAINER (cfg_notebook), vbox2); + + hbox1 = gtk_hbox_new (FALSE, 0); + gtk_widget_ref (hbox1); + gtk_widget_show (hbox1); + gtk_box_pack_start (GTK_BOX (vbox2), hbox1, TRUE, TRUE, 0); + + frame2 = gtk_frame_new ("Clock Speed:"); + gtk_widget_ref (frame2); + gtk_widget_show (frame2); + gtk_box_pack_start (GTK_BOX (hbox1), frame2, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (frame2), 4); + + vbox4 = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox4); + gtk_widget_show (vbox4); + gtk_container_add (GTK_CONTAINER (frame2), vbox4); + + cfg_clock_pal = gtk_radio_button_new_with_label (speed_group, "PAL"); + speed_group = gtk_radio_button_group (GTK_RADIO_BUTTON (cfg_clock_pal)); + gtk_widget_ref (cfg_clock_pal); + gtk_widget_show (cfg_clock_pal); + gtk_box_pack_start (GTK_BOX (vbox4), cfg_clock_pal, FALSE, FALSE, 0); + + cfg_clock_ntsc = gtk_radio_button_new_with_label (speed_group, "NTSC"); + speed_group = gtk_radio_button_group (GTK_RADIO_BUTTON (cfg_clock_ntsc)); + gtk_widget_ref (cfg_clock_ntsc); + gtk_widget_show (cfg_clock_ntsc); + gtk_box_pack_start (GTK_BOX (vbox4), cfg_clock_ntsc, FALSE, FALSE, 0); + + cfg_clock_force = gtk_check_button_new_with_label ("Force speed"); + gtk_widget_ref (cfg_clock_force); + gtk_widget_show (cfg_clock_force); + gtk_box_pack_start (GTK_BOX (vbox4), cfg_clock_force, FALSE, FALSE, 0); + + frame3 = gtk_frame_new ("Waveforms:"); + gtk_widget_ref (frame3); + gtk_widget_show (frame3); + gtk_box_pack_start (GTK_BOX (hbox1), frame3, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (frame3), 4); + + vbox3 = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox3); + gtk_widget_show (vbox3); + gtk_container_add (GTK_CONTAINER (frame3), vbox3); + + cfg_wav_mos6581 = gtk_radio_button_new_with_label (waveforms_group, "MOS 6581"); + waveforms_group = gtk_radio_button_group (GTK_RADIO_BUTTON (cfg_wav_mos6581)); + gtk_widget_ref (cfg_wav_mos6581); + gtk_widget_show (cfg_wav_mos6581); + gtk_box_pack_start (GTK_BOX (vbox3), cfg_wav_mos6581, FALSE, FALSE, 0); + + cfg_wav_mos8580 = gtk_radio_button_new_with_label (waveforms_group, "MOS 8580"); + waveforms_group = gtk_radio_button_group (GTK_RADIO_BUTTON (cfg_wav_mos8580)); + gtk_widget_ref (cfg_wav_mos8580); + gtk_widget_show (cfg_wav_mos8580); + gtk_box_pack_start (GTK_BOX (vbox3), cfg_wav_mos8580, FALSE, FALSE, 0); + + cfg_emufilters = gtk_check_button_new_with_label ("Emulate filters"); + gtk_widget_ref (cfg_emufilters); + gtk_widget_show (cfg_emufilters); + gtk_box_pack_start (GTK_BOX (vbox3), cfg_emufilters, FALSE, FALSE, 0); + + frame1 = gtk_frame_new ("Memory Mode:"); + gtk_widget_ref (frame1); + gtk_widget_show (frame1); + gtk_box_pack_start (GTK_BOX (vbox2), frame1, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (frame1), 4); + + vbox5 = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox5); + gtk_widget_show (vbox5); + gtk_container_add (GTK_CONTAINER (frame1), vbox5); + + cfg_mem_banksw = gtk_radio_button_new_with_label (memorymode_group, "Bank switching"); + memorymode_group = gtk_radio_button_group (GTK_RADIO_BUTTON (cfg_mem_banksw)); + gtk_widget_ref (cfg_mem_banksw); + gtk_widget_show (cfg_mem_banksw); + gtk_box_pack_start (GTK_BOX (vbox5), cfg_mem_banksw, FALSE, FALSE, 0); + + cfg_mem_transrom = gtk_radio_button_new_with_label (memorymode_group, "Transparent ROM"); + memorymode_group = gtk_radio_button_group (GTK_RADIO_BUTTON (cfg_mem_transrom)); + gtk_widget_ref (cfg_mem_transrom); + gtk_widget_show (cfg_mem_transrom); + gtk_box_pack_start (GTK_BOX (vbox5), cfg_mem_transrom, FALSE, FALSE, 0); + + cfg_mem_playsid = gtk_radio_button_new_with_label (memorymode_group, "PlaySID environment"); + memorymode_group = gtk_radio_button_group (GTK_RADIO_BUTTON (cfg_mem_playsid)); + gtk_widget_ref (cfg_mem_playsid); + gtk_widget_show (cfg_mem_playsid); + gtk_box_pack_start (GTK_BOX (vbox5), cfg_mem_playsid, FALSE, FALSE, 0); + + label2 = gtk_label_new ("Emulation"); + gtk_widget_ref (label2); + gtk_widget_show (label2); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (cfg_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (cfg_notebook), 1), label2); + + vbox7 = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox7); + gtk_widget_show (vbox7); + gtk_container_add (GTK_CONTAINER (cfg_notebook), vbox7); + + frame7 = gtk_frame_new ("STIL Configuration:"); + gtk_widget_ref (frame7); + gtk_widget_show (frame7); + gtk_box_pack_start (GTK_BOX (vbox7), frame7, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (frame7), 4); + + vbox8 = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox8); + gtk_widget_show (vbox8); + gtk_container_add (GTK_CONTAINER (frame7), vbox8); + + cfg_stil_use = gtk_check_button_new_with_label ("Use STIL information database"); + gtk_widget_ref (cfg_stil_use); + gtk_widget_show (cfg_stil_use); + gtk_box_pack_start (GTK_BOX (vbox8), cfg_stil_use, TRUE, FALSE, 0); + + hbox3 = gtk_hbox_new (FALSE, 0); + gtk_widget_ref (hbox3); + gtk_widget_show (hbox3); + gtk_box_pack_start (GTK_BOX (vbox8), hbox3, TRUE, TRUE, 0); + + label4 = gtk_label_new ("STIL path:"); + gtk_widget_ref (label4); + gtk_widget_show (label4); + gtk_box_pack_start (GTK_BOX (hbox3), label4, FALSE, FALSE, 0); + gtk_misc_set_padding (GTK_MISC (label4), 4, 0); + + alignment2 = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_widget_ref (alignment2); + gtk_widget_show (alignment2); + gtk_box_pack_start (GTK_BOX (hbox3), alignment2, TRUE, TRUE, 4); + + cfg_stil_path = gtk_entry_new (); + gtk_widget_ref (cfg_stil_path); + gtk_widget_show (cfg_stil_path); + gtk_container_add (GTK_CONTAINER (alignment2), cfg_stil_path); + + alignment1 = gtk_alignment_new (0.5, 0.5, 1, 0.300001); + gtk_widget_ref (alignment1); + gtk_widget_show (alignment1); + gtk_box_pack_end (GTK_BOX (hbox3), alignment1, FALSE, FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (alignment1), 4); + + cfg_stil_browse = gtk_button_new_with_label ("Browse"); + gtk_widget_ref (cfg_stil_browse); + gtk_widget_show (cfg_stil_browse); + gtk_container_add (GTK_CONTAINER (alignment1), cfg_stil_browse); + + frame9 = gtk_frame_new ("Songname (Fileinfo) format:"); + gtk_widget_ref (frame9); + gtk_widget_show (frame9); + gtk_box_pack_start (GTK_BOX (vbox7), frame9, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (frame9), 4); + + vbox11 = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox11); + gtk_widget_show (vbox11); + gtk_container_add (GTK_CONTAINER (frame9), vbox11); + + alignment3 = gtk_alignment_new (0.5, 0.5, 0.96, 1); + gtk_widget_ref (alignment3); + gtk_widget_show (alignment3); + gtk_box_pack_start (GTK_BOX (vbox11), alignment3, FALSE, FALSE, 0); + + cfg_songnameformat = gtk_entry_new (); + gtk_widget_ref (cfg_songnameformat); + gtk_widget_show (cfg_songnameformat); + gtk_container_add (GTK_CONTAINER (alignment3), cfg_songnameformat); + + label7 = gtk_label_new ( + "%1 - Composer\n" + "%2 - Song name (title)\n" + "%3 - Copyright\n" + "%4 - SID-file type"); + gtk_widget_ref (label7); + gtk_widget_show (label7); + gtk_box_pack_start (GTK_BOX (vbox11), label7, TRUE, TRUE, 0); + gtk_label_set_justify (GTK_LABEL (label7), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (label7), 0.04, 0.5); + + label3 = gtk_label_new ("STIL"); + gtk_widget_ref (label3); + gtk_widget_show (label3); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (cfg_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (cfg_notebook), 2), label3); + + fixed1 = gtk_fixed_new (); + gtk_widget_ref (fixed1); + gtk_widget_show (fixed1); + gtk_container_add (GTK_CONTAINER (cfg_notebook), fixed1); + gtk_tooltips_set_tip (tooltips, fixed1, "Reset filter to default values", NULL); + + cfg_filt_reset = gtk_button_new_with_label ("Reset values"); + gtk_widget_ref (cfg_filt_reset); + gtk_widget_show (cfg_filt_reset); + gtk_fixed_put (GTK_FIXED (fixed1), cfg_filt_reset, 224, 16); + gtk_widget_set_uposition (cfg_filt_reset, 224, 16); + gtk_widget_set_usize (cfg_filt_reset, 120, 32); + + label9 = gtk_label_new ( + "These sliders affect the emulated SID's filter values.\n" + "Defaults are what the libsidplay sets them on init."); + gtk_widget_ref (label9); + gtk_widget_show (label9); + gtk_fixed_put (GTK_FIXED (fixed1), label9, 224, 56); + gtk_widget_set_uposition (label9, 224, 56); + gtk_widget_set_usize (label9, 136, 104); + gtk_label_set_justify (GTK_LABEL (label9), GTK_JUSTIFY_LEFT); + gtk_label_set_line_wrap (GTK_LABEL (label9), TRUE); + gtk_misc_set_alignment (GTK_MISC (label9), 0.5, 7.45058e-09); + + frame12 = gtk_frame_new ("FT"); + gtk_widget_ref (frame12); + gtk_widget_show (frame12); + gtk_fixed_put (GTK_FIXED (fixed1), frame12, 160, 16); + gtk_widget_set_uposition (frame12, 160, 16); + gtk_widget_set_usize (frame12, 48, 152); + + cfg_filt_ft_adj = gtk_adjustment_new (0, 0, 1, 0.01, 0.1, 0); + cfg_filt_ft = gtk_vscale_new (GTK_ADJUSTMENT (cfg_filt_ft_adj)); + gtk_widget_ref (cfg_filt_ft); + gtk_widget_show (cfg_filt_ft); + gtk_container_add (GTK_CONTAINER (frame12), cfg_filt_ft); + gtk_scale_set_digits (GTK_SCALE (cfg_filt_ft), 2); + + cfg_frm2 = gtk_frame_new ("FM"); + gtk_widget_ref (cfg_frm2); + gtk_widget_show (cfg_frm2); + gtk_fixed_put (GTK_FIXED (fixed1), cfg_frm2, 88, 16); + gtk_widget_set_uposition (cfg_frm2, 88, 16); + gtk_widget_set_usize (cfg_frm2, 48, 152); + + cfg_filt_fm_adj = gtk_adjustment_new (0, 0, 100, 1, 10, 0); + cfg_filt_fm = gtk_vscale_new (GTK_ADJUSTMENT (cfg_filt_fm_adj)); + gtk_widget_ref (cfg_filt_fm); + gtk_widget_show (cfg_filt_fm); + gtk_container_add (GTK_CONTAINER (cfg_frm2), cfg_filt_fm); + + cfg_frm1 = gtk_frame_new ("FS"); + gtk_widget_ref (cfg_frm1); + gtk_widget_show (cfg_frm1); + gtk_fixed_put (GTK_FIXED (fixed1), cfg_frm1, 16, 16); + gtk_widget_set_uposition (cfg_frm1, 16, 16); + gtk_widget_set_usize (cfg_frm1, 56, 152); + + cfg_filt_fs_adj = gtk_adjustment_new (0, 0, 1000, 1, 100, 0); + cfg_filt_fs = gtk_vscale_new (GTK_ADJUSTMENT (cfg_filt_fs_adj)); + gtk_widget_ref (cfg_filt_fs); + gtk_widget_show (cfg_filt_fs); + gtk_container_add (GTK_CONTAINER (cfg_frm1), cfg_filt_fs); + + label6 = gtk_label_new ("Filters"); + gtk_widget_ref (label6); + gtk_widget_show (label6); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (cfg_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (cfg_notebook), 3), label6); + + hbuttonbox1 = gtk_hbutton_box_new (); + gtk_widget_ref (hbuttonbox1); + gtk_widget_show (hbuttonbox1); + gtk_box_pack_end (GTK_BOX (vbox1), hbuttonbox1, FALSE, FALSE, 0); + gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_END); + gtk_button_box_set_child_size (GTK_BUTTON_BOX (hbuttonbox1), 85, 30); + + cfg_ok = gtk_button_new_with_label ("OK"); + gtk_widget_ref (cfg_ok); + gtk_widget_show (cfg_ok); + gtk_container_add (GTK_CONTAINER (hbuttonbox1), cfg_ok); + GTK_WIDGET_SET_FLAGS (cfg_ok, GTK_CAN_DEFAULT); + gtk_tooltips_set_tip (tooltips, cfg_ok, "Accept and update changes", NULL); + + cfg_cancel = gtk_button_new_with_label ("Cancel"); + gtk_widget_ref (cfg_cancel); + gtk_widget_show (cfg_cancel); + gtk_container_add (GTK_CONTAINER (hbuttonbox1), cfg_cancel); + GTK_WIDGET_SET_FLAGS (cfg_cancel, GTK_CAN_DEFAULT); + gtk_tooltips_set_tip (tooltips, cfg_cancel, "Cancel any changes", NULL); + + + /* Set the states of widgets */ + + /* Sound resolution settings */ + switch (xs_cfg.bitsPerSample) { + 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.frequency); + + /* Channel settings */ + switch (xs_cfg.channels) { + 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(); + + + /* STIL and miscellaneous settings */ + if (xs_cfg.usestil) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_stil_use), TRUE); + } + + if (xs_cfg.detectMagic) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cfg_checkfilecontent), TRUE); + } + + if (xs_cfg.stilpath != NULL) { + gtk_entry_set_text(GTK_ENTRY(cfg_stil_path), xs_cfg.stilpath); + } + + if (xs_cfg.fileInfo != NULL) { + gtk_entry_set_text(GTK_ENTRY(cfg_songnameformat), xs_cfg.fileInfo); + } + + /* Connect the signals */ + gtk_signal_connect (GTK_OBJECT (cfg_stil_browse), "clicked", GTK_SIGNAL_FUNC (xs_cfg_stil_browse), NULL); + + gtk_signal_connect (GTK_OBJECT (cfg_filt_reset), "clicked", GTK_SIGNAL_FUNC (xs_cfg_filt_reset), NULL); + + gtk_signal_connect (GTK_OBJECT (cfg_ok), "clicked", GTK_SIGNAL_FUNC (xs_configure_ok), NULL); + + gtk_signal_connect (GTK_OBJECT (cfg_cancel), "clicked", GTK_SIGNAL_FUNC (xs_configure_cancel), NULL); + + gtk_object_set_data (GTK_OBJECT (xs_configwin), "tooltips", tooltips); + + gtk_widget_show(xs_configwin); +} +