From e7d6fe784b7d4f704e9ac04544e8b563b46524fd Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Fri, 15 Jul 2022 15:04:50 -0700
Subject: [PATCH] Added missing xmp.h for Visual Studio build
---
VisualC/external/include/xmp.h | 389 +++++++++++++++++++++++++++++++++
1 file changed, 389 insertions(+)
create mode 100644 VisualC/external/include/xmp.h
diff --git a/VisualC/external/include/xmp.h b/VisualC/external/include/xmp.h
new file mode 100644
index 00000000..2d725411
--- /dev/null
+++ b/VisualC/external/include/xmp.h
@@ -0,0 +1,389 @@
+#ifndef XMP_H
+#define XMP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define XMP_VERSION "4.5.0"
+#define XMP_VERCODE 0x040500
+#define XMP_VER_MAJOR 4
+#define XMP_VER_MINOR 5
+#define XMP_VER_RELEASE 0
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+# if defined(BUILDING_STATIC)
+# define LIBXMP_EXPORT
+# elif defined(BUILDING_DLL)
+# define LIBXMP_EXPORT __declspec(dllexport)
+# else
+# define LIBXMP_EXPORT __declspec(dllimport)
+# endif
+#elif defined(__OS2__) && defined(__WATCOMC__) && defined(__SW_BD)
+# define LIBXMP_EXPORT __declspec(dllexport)
+#elif (defined(__GNUC__) || defined(__clang__) || defined(__HP_cc)) && defined(XMP_SYM_VISIBILITY)
+# define LIBXMP_EXPORT __attribute__((visibility ("default")))
+#elif defined(__SUNPRO_C) && defined(XMP_LDSCOPE_GLOBAL)
+# define LIBXMP_EXPORT __global
+#elif defined(EMSCRIPTEN)
+# include <emscripten.h>
+# define LIBXMP_EXPORT EMSCRIPTEN_KEEPALIVE
+# define LIBXMP_EXPORT_VAR
+#else
+# define LIBXMP_EXPORT
+#endif
+
+#if !defined (LIBXMP_EXPORT_VAR)
+# define LIBXMP_EXPORT_VAR LIBXMP_EXPORT
+#endif
+
+#define XMP_NAME_SIZE 64 /* Size of module name and type */
+
+#define XMP_KEY_OFF 0x81 /* Note number for key off event */
+#define XMP_KEY_CUT 0x82 /* Note number for key cut event */
+#define XMP_KEY_FADE 0x83 /* Note number for fade event */
+
+/* mixer parameter macros */
+
+/* sample format flags */
+#define XMP_FORMAT_8BIT (1 << 0) /* Mix to 8-bit instead of 16 */
+#define XMP_FORMAT_UNSIGNED (1 << 1) /* Mix to unsigned samples */
+#define XMP_FORMAT_MONO (1 << 2) /* Mix to mono instead of stereo */
+
+/* player parameters */
+#define XMP_PLAYER_AMP 0 /* Amplification factor */
+#define XMP_PLAYER_MIX 1 /* Stereo mixing */
+#define XMP_PLAYER_INTERP 2 /* Interpolation type */
+#define XMP_PLAYER_DSP 3 /* DSP effect flags */
+#define XMP_PLAYER_FLAGS 4 /* Player flags */
+#define XMP_PLAYER_CFLAGS 5 /* Player flags for current module */
+#define XMP_PLAYER_SMPCTL 6 /* Sample control flags */
+#define XMP_PLAYER_VOLUME 7 /* Player module volume */
+#define XMP_PLAYER_STATE 8 /* Internal player state (read only) */
+#define XMP_PLAYER_SMIX_VOLUME 9 /* SMIX volume */
+#define XMP_PLAYER_DEFPAN 10 /* Default pan setting */
+#define XMP_PLAYER_MODE 11 /* Player personality */
+#define XMP_PLAYER_MIXER_TYPE 12 /* Current mixer (read only) */
+#define XMP_PLAYER_VOICES 13 /* Maximum number of mixer voices */
+
+/* interpolation types */
+#define XMP_INTERP_NEAREST 0 /* Nearest neighbor */
+#define XMP_INTERP_LINEAR 1 /* Linear (default) */
+#define XMP_INTERP_SPLINE 2 /* Cubic spline */
+
+/* dsp effect types */
+#define XMP_DSP_LOWPASS (1 << 0) /* Lowpass filter effect */
+#define XMP_DSP_ALL (XMP_DSP_LOWPASS)
+
+/* player state */
+#define XMP_STATE_UNLOADED 0 /* Context created */
+#define XMP_STATE_LOADED 1 /* Module loaded */
+#define XMP_STATE_PLAYING 2 /* Module playing */
+
+/* player flags */
+#define XMP_FLAGS_VBLANK (1 << 0) /* Use vblank timing */
+#define XMP_FLAGS_FX9BUG (1 << 1) /* Emulate FX9 bug */
+#define XMP_FLAGS_FIXLOOP (1 << 2) /* Emulate sample loop bug */
+#define XMP_FLAGS_A500 (1 << 3) /* Use Paula mixer in Amiga modules */
+
+/* player modes */
+#define XMP_MODE_AUTO 0 /* Autodetect mode (default) */
+#define XMP_MODE_MOD 1 /* Play as a generic MOD player */
+#define XMP_MODE_NOISETRACKER 2 /* Play using Noisetracker quirks */
+#define XMP_MODE_PROTRACKER 3 /* Play using Protracker quirks */
+#define XMP_MODE_S3M 4 /* Play as a generic S3M player */
+#define XMP_MODE_ST3 5 /* Play using ST3 bug emulation */
+#define XMP_MODE_ST3GUS 6 /* Play using ST3+GUS quirks */
+#define XMP_MODE_XM 7 /* Play as a generic XM player */
+#define XMP_MODE_FT2 8 /* Play using FT2 bug emulation */
+#define XMP_MODE_IT 9 /* Play using IT quirks */
+#define XMP_MODE_ITSMP 10 /* Play using IT sample mode quirks */
+
+/* mixer types */
+#define XMP_MIXER_STANDARD 0 /* Standard mixer */
+#define XMP_MIXER_A500 1 /* Amiga 500 */
+#define XMP_MIXER_A500F 2 /* Amiga 500 with led filter */
+
+/* sample flags */
+#define XMP_SMPCTL_SKIP (1 << 0) /* Don't load samples */
+
+/* limits */
+#define XMP_MAX_KEYS 121 /* Number of valid keys */
+#define XMP_MAX_ENV_POINTS 32 /* Max number of envelope points */
+#define XMP_MAX_MOD_LENGTH 256 /* Max number of patterns in module */
+#define XMP_MAX_CHANNELS 64 /* Max number of channels in module */
+#define XMP_MAX_SRATE 49170 /* max sampling rate (Hz) */
+#define XMP_MIN_SRATE 4000 /* min sampling rate (Hz) */
+#define XMP_MIN_BPM 20 /* min BPM */
+/* frame rate = (50 * bpm / 125) Hz */
+/* frame size = (sampling rate * channels * size) / frame rate */
+#define XMP_MAX_FRAMESIZE (5 * XMP_MAX_SRATE * 2 / XMP_MIN_BPM)
+
+/* error codes */
+#define XMP_END 1
+#define XMP_ERROR_INTERNAL 2 /* Internal error */
+#define XMP_ERROR_FORMAT 3 /* Unsupported module format */
+#define XMP_ERROR_LOAD 4 /* Error loading file */
+#define XMP_ERROR_DEPACK 5 /* Error depacking file */
+#define XMP_ERROR_SYSTEM 6 /* System error */
+#define XMP_ERROR_INVALID 7 /* Invalid parameter */
+#define XMP_ERROR_STATE 8 /* Invalid player state */
+
+struct xmp_channel {
+ int pan; /* Channel pan (0x80 is center) */
+ int vol; /* Channel volume */
+#define XMP_CHANNEL_SYNTH (1 << 0) /* Channel is synthesized */
+#define XMP_CHANNEL_MUTE (1 << 1) /* Channel is muted */
+#define XMP_CHANNEL_SPLIT (1 << 2) /* Split Amiga channel in bits 5-4 */
+#define XMP_CHANNEL_SURROUND (1 << 4) /* Surround channel */
+ int flg; /* Channel flags */
+};
+
+struct xmp_pattern {
+ int rows; /* Number of rows */
+ int index[1]; /* Track index */
+};
+
+struct xmp_event {
+ unsigned char note; /* Note number (0 means no note) */
+ unsigned char ins; /* Patch number */
+ unsigned char vol; /* Volume (0 to basevol) */
+ unsigned char fxt; /* Effect type */
+ unsigned char fxp; /* Effect parameter */
+ unsigned char f2t; /* Secondary effect type */
+ unsigned char f2p; /* Secondary effect parameter */
+ unsigned char _flag; /* Internal (reserved) flags */
+};
+
+struct xmp_track {
+ int rows; /* Number of rows */
+ struct xmp_event event[1]; /* Event data */
+};
+
+struct xmp_envelope {
+#define XMP_ENVELOPE_ON (1 << 0) /* Envelope is enabled */
+#define XMP_ENVELOPE_SUS (1 << 1) /* Envelope has sustain point */
+#define XMP_ENVELOPE_LOOP (1 << 2) /* Envelope has loop */
+#define XMP_ENVELOPE_FLT (1 << 3) /* Envelope is used for filter */
+#define XMP_ENVELOPE_SLOOP (1 << 4) /* Envelope has sustain loop */
+#define XMP_ENVELOPE_CARRY (1 << 5) /* Don't reset envelope position */
+ int flg; /* Flags */
+ int npt; /* Number of envelope points */
+ int scl; /* Envelope scaling */
+ int sus; /* Sustain start point */
+ int sue; /* Sustain end point */
+ int lps; /* Loop start point */
+ int lpe; /* Loop end point */
+ short data[XMP_MAX_ENV_POINTS * 2];
+};
+
+struct xmp_subinstrument {
+ int vol; /* Default volume */
+ int gvl; /* Global volume */
+ int pan; /* Pan */
+ int xpo; /* Transpose */
+ int fin; /* Finetune */
+ int vwf; /* Vibrato waveform */
+ int vde; /* Vibrato depth */
+ int vra; /* Vibrato rate */
+ int vsw; /* Vibrato sweep */
+ int rvv; /* Random volume/pan variation (IT) */
+ int sid; /* Sample number */
+#define XMP_INST_NNA_CUT 0x00
+#define XMP_INST_NNA_CONT 0x01
+#define XMP_INST_NNA_OFF 0x02
+#define XMP_INST_NNA_FADE 0x03
+ int nna; /* New note action */
+#define XMP_INST_DCT_OFF 0x00
+#define XMP_INST_DCT_NOTE 0x01
+#define XMP_INST_DCT_SMP 0x02
+#define XMP_INST_DCT_INST 0x03
+ int dct; /* Duplicate check type */
+#define XMP_INST_DCA_CUT XMP_INST_NNA_CUT
+#define XMP_INST_DCA_OFF XMP_INST_NNA_OFF
+#define XMP_INST_DCA_FADE XMP_INST_NNA_FADE
+ int dca; /* Duplicate check action */
+ int ifc; /* Initial filter cutoff */
+ int ifr; /* Initial filter resonance */
+};
+
+struct xmp_instrument {
+ char name[32]; /* Instrument name */
+ int vol; /* Instrument volume */
+ int nsm; /* Number of samples */
+ int rls; /* Release (fadeout) */
+ struct xmp_envelope aei; /* Amplitude envelope info */
+ struct xmp_envelope pei; /* Pan envelope info */
+ struct xmp_envelope fei; /* Frequency envelope info */
+
+ struct {
+ unsigned char ins; /* Instrument number for each key */
+ signed char xpo; /* Instrument transpose for each key */
+ } map[XMP_MAX_KEYS];
+
+ struct xmp_subinstrument *sub;
+
+ void *extra; /* Extra fields */
+};
+
+struct xmp_sample {
+ char name[32]; /* Sample name */
+ int len; /* Sample length */
+ int lps; /* Loop start */
+ int lpe; /* Loop end */
+#define XMP_SAMPLE_16BIT (1 << 0) /* 16bit sample */
+#define XMP_SAMPLE_LOOP (1 << 1) /* Sample is looped */
+#define XMP_SAMPLE_LOOP_BIDIR (1 << 2) /* Bidirectional sample loop */
+#define XMP_SAMPLE_LOOP_REVERSE (1 << 3) /* Backwards sample loop */
+#define XMP_SAMPLE_LOOP_FULL (1 << 4) /* Play full sample before looping */
+#define XMP_SAMPLE_SLOOP (1 << 5) /* Sample has sustain loop */
+#define XMP_SAMPLE_SLOOP_BIDIR (1 << 6) /* Bidirectional sustain loop */
+#define XMP_SAMPLE_SYNTH (1 << 15) /* Data contains synth patch */
+ int flg; /* Flags */
+ unsigned char *data; /* Sample data */
+};
+
+struct xmp_sequence {
+ int entry_point;
+ int duration;
+};
+
+struct xmp_module {
+ char name[XMP_NAME_SIZE]; /* Module title */
+ char type[XMP_NAME_SIZE]; /* Module format */
+ int pat; /* Number of patterns */
+ int trk; /* Number of tracks */
+ int chn; /* Tracks per pattern */
+ int ins; /* Number of instruments */
+ int smp; /* Number of samples */
+ int spd; /* Initial speed */
+ int bpm; /* Initial BPM */
+ int len; /* Module length in patterns */
+ int rst; /* Restart position */
+ int gvl; /* Global volume */
+
+ struct xmp_pattern **xxp; /* Patterns */
+ struct xmp_track **xxt; /* Tracks */
+ struct xmp_instrument *xxi; /* Instruments */
+ struct xmp_sample *xxs; /* Samples */
+ struct xmp_channel xxc[XMP_MAX_CHANNELS]; /* Channel info */
+ unsigned char xxo[XMP_MAX_MOD_LENGTH]; /* Orders */
+};
+
+struct xmp_test_info {
+ char name[XMP_NAME_SIZE]; /* Module title */
+ char type[XMP_NAME_SIZE]; /* Module format */
+};
+
+struct xmp_module_info {
+ unsigned char md5[16]; /* MD5 message digest */
+ int vol_base; /* Volume scale */
+ struct xmp_module *mod; /* Pointer to module data */
+ char *comment; /* Comment text, if any */
+ int num_sequences; /* Number of valid sequences */
+ struct xmp_sequence *seq_data; /* Pointer to sequence data */
+};
+
+struct xmp_channel_info {
+ unsigned int period; /* Sample period (* 4096) */
+ unsigned int position; /* Sample position */
+ short pitchbend; /* Linear bend from base note*/
+ unsigned char note; /* Current base note number */
+ unsigned char instrument; /* Current instrument number */
+ unsigned char sample; /* Current sample number */
+ unsigned char volume; /* Current volume */
+ unsigned char pan; /* Current stereo pan */
+ unsigned char reserved; /* Reserved */
+ struct xmp_event event; /* Current track event */
+};
+
+struct xmp_frame_info { /* Current frame information */
+ int pos; /* Current position */
+ int pattern; /* Current pattern */
+ int row; /* Current row in pattern */
+ int num_rows; /* Number of rows in current pattern */
+ int frame; /* Current frame */
+ int speed; /* Current replay speed */
+ int bpm; /* Current bpm */
+ int time; /* Current module time in ms */
+ int total_time; /* Estimated replay time in ms*/
+ int frame_time; /* Frame replay time in us */
+ void *buffer; /* Pointer to sound buffer */
+ int buffer_size; /* Used buffer size */
+ int total_size; /* Total buffer size */
+ int volume; /* Current master volume */
+ int loop_count; /* Loop counter */
+ int virt_channels; /* Number of virtual channels */
+ int virt_used; /* Used virtual channels */
+ int sequence; /* Current sequence */
+
+ struct xmp_channel_info channel_info[XMP_MAX_CHANNELS]; /* Current channel information */
+};
+
+struct xmp_callbacks {
+ unsigned long (*read_func)(void *dest, unsigned long len,
+ unsigned long nmemb, void *priv);
+ int (*seek_func)(void *priv, long offset, int whence);
+ long (*tell_func)(void *priv);
+ int (*close_func)(void *priv);
+};
+
+typedef char *xmp_context;
+
+LIBXMP_EXPORT_VAR extern const char *xmp_version;
+LIBXMP_EXPORT_VAR extern const unsigned int xmp_vercode;
+
+LIBXMP_EXPORT int xmp_syserrno (void);
+
+LIBXMP_EXPORT xmp_context xmp_create_context (void);
+LIBXMP_EXPORT void xmp_free_context (xmp_context);
+
+LIBXMP_EXPORT int xmp_load_module (xmp_context, const char *);
+LIBXMP_EXPORT int xmp_load_module_from_memory (xmp_context, const void *, long);
+LIBXMP_EXPORT int xmp_load_module_from_file (xmp_context, void *, long);
+LIBXMP_EXPORT int xmp_load_module_from_callbacks (xmp_context, void *, struct xmp_callbacks);
+
+LIBXMP_EXPORT int xmp_test_module (const char *, struct xmp_test_info *);
+LIBXMP_EXPORT int xmp_test_module_from_memory (const void *, long, struct xmp_test_info *);
+LIBXMP_EXPORT int xmp_test_module_from_file (void *, struct xmp_test_info *);
+LIBXMP_EXPORT int xmp_test_module_from_callbacks (void *, struct xmp_callbacks, struct xmp_test_info *);
+
+LIBXMP_EXPORT void xmp_scan_module (xmp_context);
+LIBXMP_EXPORT void xmp_release_module (xmp_context);
+
+LIBXMP_EXPORT int xmp_start_player (xmp_context, int, int);
+LIBXMP_EXPORT int xmp_play_frame (xmp_context);
+LIBXMP_EXPORT int xmp_play_buffer (xmp_context, void *, int, int);
+LIBXMP_EXPORT void xmp_get_frame_info (xmp_context, struct xmp_frame_info *);
+LIBXMP_EXPORT void xmp_end_player (xmp_context);
+LIBXMP_EXPORT void xmp_inject_event (xmp_context, int, struct xmp_event *);
+LIBXMP_EXPORT void xmp_get_module_info (xmp_context, struct xmp_module_info *);
+LIBXMP_EXPORT const char *const *xmp_get_format_list (void);
+LIBXMP_EXPORT int xmp_next_position (xmp_context);
+LIBXMP_EXPORT int xmp_prev_position (xmp_context);
+LIBXMP_EXPORT int xmp_set_position (xmp_context, int);
+LIBXMP_EXPORT int xmp_set_row (xmp_context, int);
+LIBXMP_EXPORT int xmp_set_tempo_factor(xmp_context, double);
+LIBXMP_EXPORT void xmp_stop_module (xmp_context);
+LIBXMP_EXPORT void xmp_restart_module (xmp_context);
+LIBXMP_EXPORT int xmp_seek_time (xmp_context, int);
+LIBXMP_EXPORT int xmp_channel_mute (xmp_context, int, int);
+LIBXMP_EXPORT int xmp_channel_vol (xmp_context, int, int);
+LIBXMP_EXPORT int xmp_set_player (xmp_context, int, int);
+LIBXMP_EXPORT int xmp_get_player (xmp_context, int);
+LIBXMP_EXPORT int xmp_set_instrument_path (xmp_context, const char *);
+
+/* External sample mixer API */
+LIBXMP_EXPORT int xmp_start_smix (xmp_context, int, int);
+LIBXMP_EXPORT void xmp_end_smix (xmp_context);
+LIBXMP_EXPORT int xmp_smix_play_instrument(xmp_context, int, int, int, int);
+LIBXMP_EXPORT int xmp_smix_play_sample (xmp_context, int, int, int, int);
+LIBXMP_EXPORT int xmp_smix_channel_pan (xmp_context, int, int);
+LIBXMP_EXPORT int xmp_smix_load_sample (xmp_context, int, const char *);
+LIBXMP_EXPORT int xmp_smix_release_sample (xmp_context, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* XMP_H */