1 #pragma once
2 
3 typedef struct MusicDevice MusicDevice;
4 
5 typedef enum MusicType
6 {
7     Music_None
8    ,Music_AdlMidi
9    ,Music_Native
10 #ifdef USE_FLUIDSYNTH
11    ,Music_FluidSynth
12 #endif
13 } MusicType;
14 
15 typedef enum MusicMode
16 {
17     Music_GeneralMidi,
18     Music_SoundBlaster,
19 } MusicMode;
20 
21 struct MusicDevice
22 {
23     int  (*init)(MusicDevice *dev, const unsigned int outputIndex, unsigned samplerate);
24     void (*destroy)(MusicDevice *dev);
25     void (*setupMode)(MusicDevice *dev, MusicMode mode);
26     void (*reset)(MusicDevice *dev);
27     void (*generate)(MusicDevice *dev, short *samples, int numframes);
28     void (*sendNoteOff)(MusicDevice *dev, int channel, int note, int vel);
29     void (*sendNoteOn)(MusicDevice *dev, int channel, int note, int vel);
30     void (*sendNoteAfterTouch)(MusicDevice *dev, int channel, int note, int touch);
31     void (*sendControllerChange)(MusicDevice *dev, int channel, int ctl, int val);
32     void (*sendProgramChange)(MusicDevice *dev, int channel, int pgm);
33     void (*sendChannelAfterTouch)(MusicDevice *dev, int channel, int touch);
34     void (*sendPitchBendML)(MusicDevice *dev, int channel, int msb, int lsb);
35     unsigned int (*getOutputCount)(MusicDevice *dev);
36     void (*getOutputName)(MusicDevice *dev, const unsigned int outputIndex, char *buffer, const unsigned int bufferSize);
37     unsigned short isOpen;    // 1 if device open, 0 if closed
38     unsigned int outputIndex; // index of currently opened output
39     MusicType deviceType;     // type of device
40     char *musicType;          // "sblaster" or "genmidi"
41 };
42 
43 #define MUSICTYPE_SBLASTER "sblaster"
44 #define MUSICTYPE_GENMIDI  "genmidi"
45 
46 MusicDevice *CreateMusicDevice(MusicType type);
47