view src/xs_config.h @ 957:0e60e5d56fdd

Change how the backend emulator library is initialized for libSIDPlay2 and FP, as it seems the engine configuration has some persistence despite reconfiguration between loaded files if same engine object is retained. This caused, for example, 2SID stereo tunes being played "mono" if played after a normal 1-SID tune. Duh.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 20 Nov 2012 22:13:48 +0200
parents d624258d7800
children be2a8436461a
line wrap: on
line source

#ifndef XS_CONFIG_H
#define XS_CONFIG_H

#include "xmms-sid.h"
#include "xs_curve.h"

#ifdef __cplusplus
extern "C" {
#endif


/* Configuration structure
 */
enum XS_EMUENGINE
{
    XS_ENG_SIDPLAY1 = 1,
    XS_ENG_SIDPLAY2,
    XS_ENG_SIDPLAYFP
};


enum XS_BUILDER
{
    XS_BLD_RESID = 1,
    XS_BLD_HARDSID,
    XS_BLD_RESID_FP
};


enum XS_RESID
{
    XS_RESID_INTERPOLATE = 1,
    XS_RESID_RESAMPLE_FIR,
};


enum XS_RESOLUTION
{
    XS_RES_8BIT = 8,
    XS_RES_16BIT = 16
};

enum XS_CHANNELS
{
    XS_CHN_MONO = 1,
    XS_CHN_STEREO = 2,
    XS_CHN_AUTOPAN = 3
};


enum XS_CLOCK
{
    XS_CLOCK_PAL = 1,
    XS_CLOCK_NTSC,
    XS_CLOCK_VBI,
    XS_CLOCK_CIA,
    XS_CLOCK_ANY
};


enum XS_MPU
{
    XS_MPU_BANK_SWITCHING = 1,
    XS_MPU_TRANSPARENT_ROM,
    XS_MPU_PLAYSID_ENVIRONMENT,
    XS_MPU_REAL
};


enum XS_SSC
{
    XS_SSC_NONE = 1,
    XS_SSC_POPUP,
    XS_SSC_PATCH,
    XS_SSC_SEEK
};


enum XS_SIDMODEL
{
    XS_SIDMODEL_UNKNOWN = 0,
    XS_SIDMODEL_6581,
    XS_SIDMODEL_8580,
    XS_SIDMODEL_ANY
};


typedef struct
{
    gchar           *name;
    gint            type;
    
    /* Filter type 0 for SIDPlay 1 */
    gfloat          fs, fm, ft;
    
    /* Filter type 1-2 points */
    xs_int_point_t  points[XS_SIDPLAY2_NFPOINTS];
    gint            npoints;
    
    /* Distortion patch tunables */
    gfloat          rate, point, voice_nonlinearity,
                    cf_treshold;
    
    /* Filter Type 3 tunables */
    gfloat          baseresistance, offset, steepness,
                    minimumfetresistance;
    
    /* Filter Type 4 tunables */
    gfloat          k, b;
} xs_sid_filter_t;


extern struct xs_cfg_t
{
    /* General audio settings */
    gint        audioBitsPerSample;
    gint        audioChannels;
    gint        audioFrequency;

    /* Emulation settings */
    gboolean    mos8580;            /* TRUE = 8580, FALSE = 6581 */
    gboolean    forceModel;
    gint        memoryMode;         /* See XS_MPU-constants */
    gint        clockSpeed;         /* PAL (50Hz) or NTSC (60Hz) */
    gboolean    forceSpeed;         /* TRUE = force to given clockspeed */

    gint        playerEngine;       /* Selected player engine */

    gboolean    emulateFilters;
    xs_sid_filter_t    sid1Filter;  /* Current SIDPlay1 filter */

    gint        sid2OptLevel;       /* SIDPlay2 emulation optimization */
    gint        sid2Builder;        /* SIDPlay2 "builder" aka SID-emu */
    xs_sid_filter_t    sid2Filter;  /* Current SIDPlay2 filter */
    xs_sid_filter_t    **sid2FilterPresets;
    gint        sid2NFilterPresets;
    gint        residSampling;
    
    
    /* Playing settings */
    gboolean    playMaxTimeEnable,
                playMaxTimeUnknown; /* Use max-time only when song-length is unknown */
    gint        playMaxTime;        /* MAX playtime in seconds */

    gboolean    playMinTimeEnable;
    gint        playMinTime;        /* MIN playtime in seconds */

    gboolean    songlenDBEnable;
    gchar       *songlenDBPath;     /* Path to Songlengths.txt */


    /* Miscellaneous settings */
    gboolean    stilDBEnable;
    gchar       *stilDBPath;        /* Path to STIL.txt */
    gchar       *hvscPath;          /* Path-prefix for HVSC */

    gint        subsongControl;
    gboolean    detectMagic;

    gboolean    titleOverride;      /* TRUE if XMMS titles are overriden */
    gchar       *titleFormat;

    gboolean    subAutoEnable,
                subAutoMinOnly;
    gint        subAutoMinTime;

    gchar       *romPath;
} xs_cfg;

XS_MUTEX_H(xs_cfg);


/* Configuration-file
 */
enum
{
    CTYPE_INT = 1,
    CTYPE_FLOAT,
    CTYPE_STR,
    CTYPE_BOOL
};

enum
{
    WTYPE_BGROUP = 1,
    WTYPE_SPIN,
    WTYPE_SCALE,
    WTYPE_BUTTON,
    WTYPE_TEXT,
    WTYPE_COMBO
};


typedef struct
{
    gint    itemType;   /* Type of item (CTYPE_*) */
    void    *itemData;  /* Pointer to variable */
    gchar   *itemName;  /* Name of configuration item */
} xs_cfg_item_t;


typedef struct
{
    gint    widType;
    gint    itemType;
    gchar   *widName;
    void    *itemData;
    gint    itemSet;
} xs_wid_item_t;


/* Functions
 */
void      xs_messagebox_const(const gchar *title, const gchar *msg);
void      xs_messagebox(const gchar *title, const gchar *fmt, ...);

void      xs_init_configuration(void);
void      xs_configure(void);
gboolean  xs_read_configuration(void);
gint      xs_write_configuration(void);


#ifdef __cplusplus
}
#endif
#endif    /* XS_CONFIG_H */