mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-10-04 23:11:38 +02:00
Changelog: - Added S-DSP emulation - Added sound output support via DirectSound -- no sound buffering though, so sound is muted by default - Added option to record raw sound output to WAV files - Added multiple color adjustment filters to the video output - Added mode3/4 direct color support - Added mode7 direct color and mosaic support - Greatly improved mode7 rendering algorithm thanks to anomie - Fixed mode7 screen repitition and EXTBG effects - Greatly increased accuracy of NMI and IRQ timing, and emulated many newly discovered hardware quirks involving the two - A few speed improvements courtesy of Nach for profiling the code for me I'm now looking for assistance with sound buffering. Specifically, I need help modifying the DirectSound code to allow the emulator to be ran between 50%-400% normal speed, while keeping the sound output relatively good. If you have experience with this and can help, please get in touch with me (setsunakun0 at hotmail dot com).
99 lines
3.5 KiB
C++
99 lines
3.5 KiB
C++
/*
|
|
libconfig : version 0.05 ~byuu (09/13/05)
|
|
*/
|
|
|
|
#ifndef __LIBCONFIG
|
|
#define __LIBCONFIG
|
|
|
|
#include "libstring.h"
|
|
|
|
class Config;
|
|
|
|
//operator= is the /only/ overloaded operator that isn't inherited by derived classes.
|
|
//similarly, base constructor/destructors with arguments are not inherited.
|
|
//the inclusion of the overloaded virtual function 'toggle' is to allow toggle to call
|
|
//the overloaded set() function, if it exists. for some reason, Setting::toggle() calls
|
|
//Setting::set() no matter what, even if the derived class defines set()...
|
|
//the below macro is a quick way to take care of all of these issues.
|
|
//usage example:
|
|
// class T : public Setting { public: SettingOperators(T); } t;
|
|
// t = 0; // -> t.set(0);
|
|
#define SettingOperators(__name) \
|
|
inline __name &operator=(const bool _data) { set((uint)_data); return *this; } \
|
|
inline __name &operator=(const uint _data) { set(_data); return *this; } \
|
|
inline __name &operator=(const uint8 _data) { set(_data); return *this; } \
|
|
inline __name &operator=(const uint16 _data) { set(_data); return *this; } \
|
|
inline __name &operator=(const uint32 _data) { set(_data); return *this; } \
|
|
inline __name &operator=(const int _data) { set(_data); return *this; } \
|
|
inline __name &operator=(const int8 _data) { set(_data); return *this; } \
|
|
inline __name &operator=(const int16 _data) { set(_data); return *this; } \
|
|
inline __name &operator=(const int32 _data) { set(_data); return *this; } \
|
|
void toggle() { data ^= 1; set(data); } \
|
|
__name(Config *_parent, char *_name, char *_desc = 0, uint _data = 0, uint _type = Setting::DEC) : \
|
|
Setting(_parent, _name, _desc, _data, _type) {}
|
|
|
|
class Setting {
|
|
friend class Config;
|
|
|
|
protected:
|
|
uint data, type, def;
|
|
|
|
public:
|
|
enum {
|
|
TRUE_FALSE,
|
|
ENABLED_DISABLED,
|
|
ON_OFF,
|
|
YES_NO,
|
|
BOOL,
|
|
DEC,
|
|
HEX
|
|
};
|
|
char *name, *desc;
|
|
virtual void toggle();
|
|
virtual uint get();
|
|
virtual void set(uint _data);
|
|
|
|
Setting(Config *_parent, char *_name, char *_desc = 0, uint _data = 0, uint _type = DEC);
|
|
|
|
inline operator bool() { return (bool)get(); }
|
|
inline operator uint() { return get(); }
|
|
inline operator uint8() { return get(); }
|
|
inline operator uint16() { return get(); }
|
|
inline operator uint32() { return get(); }
|
|
inline operator int() { return get(); }
|
|
inline operator int8() { return get(); }
|
|
inline operator int16() { return get(); }
|
|
inline operator int32() { return get(); }
|
|
|
|
inline Setting &operator=(const bool _data) { set((uint)_data); return *this; }
|
|
inline Setting &operator=(const uint _data) { set(_data); return *this; }
|
|
inline Setting &operator=(const uint8 _data) { set(_data); return *this; }
|
|
inline Setting &operator=(const uint16 _data) { set(_data); return *this; }
|
|
inline Setting &operator=(const uint32 _data) { set(_data); return *this; }
|
|
inline Setting &operator=(const int _data) { set(_data); return *this; }
|
|
inline Setting &operator=(const int8 _data) { set(_data); return *this; }
|
|
inline Setting &operator=(const int16 _data) { set(_data); return *this; }
|
|
inline Setting &operator=(const int32 _data) { set(_data); return *this; }
|
|
};
|
|
|
|
class Config {
|
|
protected:
|
|
vector<Setting*> list;
|
|
uint list_count;
|
|
|
|
string data, line, part, subpart;
|
|
|
|
uint string_to_uint(uint type, char *input);
|
|
char *uint_to_string(uint type, uint input);
|
|
|
|
public:
|
|
void add(Setting *setting);
|
|
bool load(char *fn);
|
|
bool load(substring &fn);
|
|
bool save(char *fn);
|
|
bool save(substring &fn);
|
|
Config();
|
|
};
|
|
|
|
#endif
|