cog/ThirdParty/libvgm/include/libvgm/emu/EmuStructs.h

146 lines
5.3 KiB
C

#ifndef __EMUSTRUCTS_H__
#define __EMUSTRUCTS_H__
#ifdef __cplusplus
extern "C"
{
#endif
#include "../stdtype.h"
#include "snddef.h"
typedef struct _device_definition DEV_DEF;
typedef struct _device_info DEV_INFO;
typedef struct _device_generic_config DEV_GEN_CFG;
typedef struct _device_link_info DEVLINK_INFO;
typedef void (*DEVCB_SRATE_CHG)(void* userParam, UINT32 newSRate);
typedef void (*DEVCB_LOG)(void* userParam, void* source, UINT8 level, const char* message);
typedef UINT8 (*DEVFUNC_START)(const DEV_GEN_CFG* cfg, DEV_INFO* retDevInf);
typedef void (*DEVFUNC_CTRL)(void* info);
typedef void (*DEVFUNC_UPDATE)(void* info, UINT32 samples, DEV_SMPL** outputs);
typedef void (*DEVFUNC_OPTMASK)(void* info, UINT32 optionBits);
typedef void (*DEVFUNC_PANALL)(void* info, const INT16* channelPanVal);
typedef void (*DEVFUNC_SRCCB)(void* info, DEVCB_SRATE_CHG SmpRateChgCallback, void* paramPtr);
typedef UINT8 (*DEVFUNC_LINKDEV)(void* info, UINT8 devID, const DEV_INFO* devInfLink);
typedef void (*DEVFUNC_SETLOGCB)(void* info, DEVCB_LOG logFunc, void* userParam);
typedef UINT8 (*DEVFUNC_READ_A8D8)(void* info, UINT8 addr);
typedef UINT16 (*DEVFUNC_READ_A8D16)(void* info, UINT8 addr);
typedef UINT8 (*DEVFUNC_READ_A16D8)(void* info, UINT16 addr);
typedef UINT16 (*DEVFUNC_READ_A16D16)(void* info, UINT16 addr);
typedef UINT32 (*DEVFUNC_READ_CLOCK)(void* info);
typedef UINT32 (*DEVFUNC_READ_SRATE)(void* info);
typedef UINT32 (*DEVFUNC_READ_VOLUME)(void* info);
typedef void (*DEVFUNC_WRITE_A8D8)(void* info, UINT8 addr, UINT8 data);
typedef void (*DEVFUNC_WRITE_A8D16)(void* info, UINT8 addr, UINT16 data);
typedef void (*DEVFUNC_WRITE_A16D8)(void* info, UINT16 addr, UINT8 data);
typedef void (*DEVFUNC_WRITE_A16D16)(void* info, UINT16 addr, UINT16 data);
typedef void (*DEVFUNC_WRITE_MEMSIZE)(void* info, UINT32 memsize);
typedef void (*DEVFUNC_WRITE_BLOCK)(void* info, UINT32 offset, UINT32 length, const UINT8* data);
typedef void (*DEVFUNC_WRITE_CLOCK)(void* info, UINT32 clock);
typedef void (*DEVFUNC_WRITE_VOLUME)(void* info, INT32 volume); // 16.16 fixed point
typedef void (*DEVFUNC_WRITE_VOL_LR)(void* info, INT32 volL, INT32 volR);
#define RWF_WRITE 0x00
#define RWF_READ 0x01
#define RWF_QUICKWRITE (0x02 | RWF_WRITE)
#define RWF_QUICKREAD (0x02 | RWF_READ)
#define RWF_REGISTER 0x00 // register r/w
#define RWF_MEMORY 0x10 // memory (RAM) r/w
// Note: These chip setting constants can be ORed with RWF_WRITE/RWF_READ.
#define RWF_CLOCK 0x80 // chip clock
#define RWF_SRATE 0x82 // sample rate
#define RWF_VOLUME 0x84 // volume (all speakers)
#define RWF_VOLUME_LR 0x86 // volume (left/right separately)
#define RWF_CHN_MUTE 0x90 // set channel muting (DEVRW_VALUE = single channel, DEVRW_ALL = mask)
#define RWF_CHN_PAN 0x92 // set channel panning (DEVRW_VALUE = single channel, DEVRW_ALL = array)
// register/memory DEVRW constants
#define DEVRW_A8D8 0x11 // 8-bit address, 8-bit data
#define DEVRW_A8D16 0x12 // 8-bit address, 16-bit data
#define DEVRW_A16D8 0x21 // 16-bit address, 8-bit data
#define DEVRW_A16D16 0x22 // 16-bit address, 16-bit data
#define DEVRW_BLOCK 0x80 // write sample ROM/RAM
#define DEVRW_MEMSIZE 0x81 // set ROM/RAM size
// chip setting DEVRW constants
#define DEVRW_VALUE 0x00
#define DEVRW_ALL 0x01
#define DEVLOG_OFF 0x00
#define DEVLOG_ERROR 0x01
#define DEVLOG_WARN 0x02
#define DEVLOG_INFO 0x03
#define DEVLOG_DEBUG 0x04
#define DEVLOG_TRACE 0x05
typedef struct _devdef_readwrite_function
{
UINT8 funcType; // function type, see RWF_ constants
UINT8 rwType; // read/write function type, see DEVRW_ constants
UINT16 user; // user-defined value
void* funcPtr;
} DEVDEF_RWFUNC;
struct _device_definition
{
const char* name; // name of the device
const char* author; // author/origin of emulation
UINT32 coreID; // 4-character identifier ID to distinguish between
// multiple emulators of a device
DEVFUNC_START Start;
DEVFUNC_CTRL Stop;
DEVFUNC_CTRL Reset;
DEVFUNC_UPDATE Update;
DEVFUNC_OPTMASK SetOptionBits;
DEVFUNC_OPTMASK SetMuteMask;
DEVFUNC_PANALL SetPanning; // **NOTE: deprecated, moved to rwFuncs**
DEVFUNC_SRCCB SetSRateChgCB; // used to set callback function for realtime sample rate changes
DEVFUNC_SETLOGCB SetLogCB; // set callback for logging
DEVFUNC_LINKDEV LinkDevice; // used to link multiple devices together
const DEVDEF_RWFUNC* rwFuncs; // terminated by (funcPtr == NULL)
}; // DEV_DEF
struct _device_info
{
DEV_DATA* dataPtr; // points to chip data structure
UINT32 sampleRate;
const DEV_DEF* devDef;
UINT32 linkDevCount; // number of link-able devices
DEVLINK_INFO* linkDevs; // [freed by caller]
}; // DEV_INFO
struct _device_link_info
{
UINT8 devID; // device ID (DEVID_ constant)
UINT8 linkID; // device link ID
DEV_GEN_CFG* cfg; // pointer to DEV_GEN_CFG structures and derivates [freed by caller]
}; // DEVLINK_INFO
// device resampling info constants
#define DEVRI_SRMODE_NATIVE 0x00
#define DEVRI_SRMODE_CUSTOM 0x01
#define DEVRI_SRMODE_HIGHEST 0x02
struct _device_generic_config
{
UINT32 emuCore; // emulation core (4-character code, 0 = default)
UINT8 srMode; // sample rate mode
UINT8 flags; // chip flags
UINT32 clock; // chip clock
UINT32 smplRate; // sample rate for SRMODE_CUSTOM/DEVRI_SRMODE_HIGHEST
// Note: Some cores ignore the srMode setting and always use smplRate.
}; // DEV_GEN_CFG
#ifdef __cplusplus
}
#endif
#endif // __EMUSTRUCTS_H__