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);
}