1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-09-19 20:15:40 +00:00
QB64-PE/internal/c/parts/audio/extras/libxmp-lite/player.h
Matthew Kilgore 481906977e Add a740g's miniaudio backend
This is a single commit adding all of a740g's audio backend. Later
commits will connect it together with QB64PE itself.
2022-08-27 14:27:55 -04:00

258 lines
6.7 KiB
C

#ifndef LIBXMP_PLAYER_H
#define LIBXMP_PLAYER_H
#include "lfo.h"
/* Quirk control */
#define HAS_QUIRK(x) (m->quirk & (x))
/* Channel flag control */
#define SET(f) SET_FLAG(xc->flags,(f))
#define RESET(f) RESET_FLAG(xc->flags,(f))
#define TEST(f) TEST_FLAG(xc->flags,(f))
/* Persistent effect flag control */
#define SET_PER(f) SET_FLAG(xc->per_flags,(f))
#define RESET_PER(f) RESET_FLAG(xc->per_flags,(f))
#define TEST_PER(f) TEST_FLAG(xc->per_flags,(f))
/* Note flag control */
#define SET_NOTE(f) SET_FLAG(xc->note_flags,(f))
#define RESET_NOTE(f) RESET_FLAG(xc->note_flags,(f))
#define TEST_NOTE(f) TEST_FLAG(xc->note_flags,(f))
struct retrig_control {
int s;
int m;
int d;
};
/* The following macros are used to set the flags for each channel */
#define VOL_SLIDE (1 << 0)
#define PAN_SLIDE (1 << 1)
#define TONEPORTA (1 << 2)
#define PITCHBEND (1 << 3)
#define VIBRATO (1 << 4)
#define TREMOLO (1 << 5)
#define FINE_VOLS (1 << 6)
#define FINE_BEND (1 << 7)
#define OFFSET (1 << 8)
#define TRK_VSLIDE (1 << 9)
#define TRK_FVSLIDE (1 << 10)
#define NEW_INS (1 << 11)
#define NEW_VOL (1 << 12)
#define VOL_SLIDE_2 (1 << 13)
#define NOTE_SLIDE (1 << 14)
#define FINE_NSLIDE (1 << 15)
#define NEW_NOTE (1 << 16)
#define FINE_TPORTA (1 << 17)
#define RETRIG (1 << 18)
#define PANBRELLO (1 << 19)
#define GVOL_SLIDE (1 << 20)
#define TEMPO_SLIDE (1 << 21)
#define VENV_PAUSE (1 << 22)
#define PENV_PAUSE (1 << 23)
#define FENV_PAUSE (1 << 24)
#define FINE_VOLS_2 (1 << 25)
#define KEY_OFF (1 << 26) /* for IT release on envloop end */
#define TREMOR (1 << 27) /* for XM tremor */
#define NOTE_FADEOUT (1 << 0)
#define NOTE_RELEASE (1 << 1)
#define NOTE_END (1 << 2)
#define NOTE_CUT (1 << 3)
#define NOTE_ENV_END (1 << 4)
#define NOTE_SAMPLE_END (1 << 5)
#define NOTE_SET (1 << 6) /* for IT portamento after keyoff */
#define NOTE_SUSEXIT (1 << 7) /* for delayed note release */
#define NOTE_KEY_CUT (1 << 8) /* note cut with XMP_KEY_CUT event */
#define NOTE_GLISSANDO (1 << 9)
#define IS_VALID_INSTRUMENT(x) ((uint32)(x) < mod->ins && mod->xxi[(x)].nsm > 0)
#define IS_VALID_INSTRUMENT_OR_SFX(x) (((uint32)(x) < mod->ins && mod->xxi[(x)].nsm > 0) || (smix->ins > 0 && (uint32)(x) < mod->ins + smix->ins))
struct instrument_vibrato {
int phase;
int sweep;
};
struct channel_data {
int flags; /* Channel flags */
int per_flags; /* Persistent effect channel flags */
int note_flags; /* Note release, fadeout or end */
int note; /* Note number */
int key; /* Key number */
double period; /* Amiga or linear period */
double per_adj; /* MED period/pitch adjustment factor hack */
int finetune; /* Guess what */
int ins; /* Instrument number */
int old_ins; /* Last instruemnt */
int smp; /* Sample number */
int mastervol; /* Master vol -- for IT track vol effect */
int delay; /* Note delay in frames */
int keyoff; /* Key off counter */
int fadeout; /* Current fadeout (release) value */
int ins_fade; /* Instrument fadeout value */
int volume; /* Current volume */
int gvl; /* Global volume for instrument for IT */
int rvv; /* Random volume variation */
int rpv; /* Random pan variation */
uint8 split; /* Split channel */
uint8 pair; /* Split channel pair */
int v_idx; /* Volume envelope index */
int p_idx; /* Pan envelope index */
int f_idx; /* Freq envelope index */
int key_porta; /* Key number for portamento target
* -- needed to handle IT portamento xpo */
struct {
struct lfo lfo;
int memory;
} vibrato;
struct {
struct lfo lfo;
int memory;
} tremolo;
#ifndef LIBXMP_CORE_DISABLE_IT
struct {
struct lfo lfo;
int memory;
} panbrello;
#endif
struct {
int8 val[16]; /* 16 for Smaksak MegaArps */
int size;
int count;
int memory;
} arpeggio;
struct {
struct lfo lfo;
int sweep;
} insvib;
struct {
int val;
int val2; /* For fx9 bug emulation */
int memory;
} offset;
struct {
int val; /* Retrig value */
int count; /* Retrig counter */
int type; /* Retrig type */
} retrig;
struct {
uint8 up,down; /* Tremor value */
uint8 count; /* Tremor counter */
uint8 memory; /* Tremor memory */
} tremor;
struct {
int slide; /* Volume slide value */
int fslide; /* Fine volume slide value */
int slide2; /* Volume slide value */
int memory; /* Volume slide effect memory */
#ifndef LIBXMP_CORE_DISABLE_IT
int fslide2;
int memory2; /* Volume slide effect memory */
#endif
} vol;
struct {
int up_memory; /* Fine volume slide up memory (XM) */
int down_memory;/* Fine volume slide up memory (XM) */
} fine_vol;
struct {
int slide; /* Global volume slide value */
int fslide; /* Fine global volume slide value */
int memory; /* Global volume memory is saved per channel */
} gvol;
struct {
int slide; /* Track volume slide value */
int fslide; /* Track fine volume slide value */
int memory; /* Track volume slide effect memory */
} trackvol;
struct {
int slide; /* Frequency slide value */
double fslide; /* Fine frequency slide value */
int memory; /* Portamento effect memory */
} freq;
struct {
double target; /* Target period for tone portamento */
int dir; /* Tone portamento up/down directionh */
int slide; /* Delta for tone portamento */
int memory; /* Tone portamento effect memory */
} porta;
struct {
int up_memory; /* FT2 has separate memories for these */
int down_memory;/* cases (see Porta-LinkMem.xm) */
} fine_porta;
struct {
int val; /* Current pan value */
int slide; /* Pan slide value */
int fslide; /* Pan fine slide value */
int memory; /* Pan slide effect memory */
int surround; /* Surround channel flag */
} pan;
struct {
int speed;
int count;
int pos;
} invloop;
#ifndef LIBXMP_CORE_DISABLE_IT
struct {
int slide; /* IT tempo slide */
} tempo;
struct {
int cutoff; /* IT filter cutoff frequency */
int resonance; /* IT filter resonance */
int envelope; /* IT filter envelope */
} filter;
#endif
#ifndef LIBXMP_CORE_PLAYER
struct {
int slide; /* PTM note slide amount */
int fslide; /* OKT fine note slide amount */
int speed; /* PTM note slide speed */
int count; /* PTM note slide counter */
} noteslide;
void *extra;
#endif
struct xmp_event delayed_event;
int delayed_ins; /* IT save instrument emulation */
int info_period; /* Period */
int info_pitchbend; /* Linear pitchbend */
int info_position; /* Position before mixing */
int info_finalvol; /* Final volume including envelopes */
int info_finalpan; /* Final pan including envelopes */
};
void libxmp_process_fx (struct context_data *, struct channel_data *,
int, struct xmp_event *, int);
void libxmp_filter_setup (int, int, int, int*, int*, int *);
int libxmp_read_event (struct context_data *, struct xmp_event *, int);
#endif /* LIBXMP_PLAYER_H */