| 126 | 1 #pragma once | 
|  | 2 | 
|  | 3 #include <stdint.h> | 
|  | 4 #include <stdbool.h> | 
|  | 5 | 
|  | 6 // AUDIO DRIVERS | 
|  | 7 #if defined AUDIODRIVER_SDL | 
|  | 8 #include "audiodrivers/sdl/sdldriver.h" | 
|  | 9 #elif defined AUDIODRIVER_WINMM | 
|  | 10 #include "audiodrivers/winmm/winmm.h" | 
|  | 11 #else | 
|  | 12 // Read "audiodrivers/how_to_write_drivers.txt" | 
|  | 13 #endif | 
|  | 14 | 
|  | 15 enum // voice flags | 
|  | 16 { | 
|  | 17 	IS_Vol = 1, | 
|  | 18 	IS_Period = 2, | 
|  | 19 	IS_NyTon = 4, | 
|  | 20 	IS_Pan = 8, | 
|  | 21 	IS_QuickVol = 16 | 
|  | 22 }; | 
|  | 23 | 
|  | 24 enum // note | 
|  | 25 { | 
|  | 26 	NOTE_KEYOFF = 97 | 
|  | 27 }; | 
|  | 28 | 
|  | 29 enum // header flags | 
|  | 30 { | 
|  | 31 	LINEAR_FREQUENCIES = 1 | 
|  | 32 }; | 
|  | 33 | 
|  | 34 enum // sample flags | 
|  | 35 { | 
|  | 36 	LOOP_OFF = 0, | 
|  | 37 	LOOP_FORWARD = 1, | 
|  | 38 	LOOP_PINGPONG = 2, | 
|  | 39 	SAMPLE_16BIT = 16 | 
|  | 40 }; | 
|  | 41 | 
|  | 42 enum // envelope flags | 
|  | 43 { | 
|  | 44 	ENV_ENABLED = 1, | 
|  | 45 	ENV_SUSTAIN = 2, | 
|  | 46 	ENV_LOOP    = 4 | 
|  | 47 }; | 
|  | 48 | 
|  | 49 typedef struct songTyp_t | 
|  | 50 { | 
|  | 51 	char name[20+1]; | 
|  | 52 	uint8_t antChn, pattDelTime, pattDelTime2, pBreakPos, songTab[256]; | 
|  | 53 	bool pBreakFlag, posJumpFlag; | 
|  | 54 	int16_t songPos, pattNr, pattPos, pattLen; | 
|  | 55 	uint16_t len, repS, speed, tempo, globVol, timer, ver; | 
|  | 56 | 
|  | 57 	uint16_t antInstrs; // 8bb: added this | 
|  | 58 } songTyp; | 
|  | 59 | 
|  | 60 typedef struct sampleTyp_t | 
|  | 61 { | 
|  | 62 	char name[22+1]; | 
|  | 63 	int32_t len, repS, repL; | 
|  | 64 	uint8_t vol; | 
|  | 65 	int8_t fine; | 
|  | 66 	uint8_t typ, pan; | 
|  | 67 	int8_t relTon; | 
|  | 68 	int8_t *pek; | 
|  | 69 } sampleTyp; | 
|  | 70 | 
|  | 71 typedef struct instrTyp_t | 
|  | 72 { | 
|  | 73 	char name[22+1]; | 
|  | 74 	uint8_t ta[96]; | 
|  | 75 	int16_t envVP[12][2], envPP[12][2]; | 
|  | 76 	uint8_t envVPAnt, envPPAnt; | 
|  | 77 	uint8_t envVSust, envVRepS, envVRepE; | 
|  | 78 	uint8_t envPSust, envPRepS, envPRepE; | 
|  | 79 	uint8_t envVTyp, envPTyp; | 
|  | 80 	uint8_t vibTyp, vibSweep, vibDepth, vibRate; | 
|  | 81 	uint16_t fadeOut; | 
|  | 82 	uint8_t mute; | 
|  | 83 	int16_t antSamp; | 
|  | 84 	sampleTyp samp[16]; | 
|  | 85 } instrTyp; | 
|  | 86 | 
|  | 87 typedef struct stmTyp_t | 
|  | 88 { | 
|  | 89 	volatile uint8_t status; | 
|  | 90 	int8_t relTonNr, fineTune; | 
|  | 91 	uint8_t sampleNr, instrNr, effTyp, eff, smpOffset, tremorSave, tremorPos; | 
|  | 92 	uint8_t globVolSlideSpeed, panningSlideSpeed, mute, waveCtrl, portaDir; | 
|  | 93 	uint8_t glissFunk, vibPos, tremPos, vibSpeed, vibDepth, tremSpeed, tremDepth; | 
|  | 94 	uint8_t pattPos, loopCnt, volSlideSpeed, fVolSlideUpSpeed, fVolSlideDownSpeed; | 
|  | 95 	uint8_t fPortaUpSpeed, fPortaDownSpeed, ePortaUpSpeed, ePortaDownSpeed; | 
|  | 96 	uint8_t portaUpSpeed, portaDownSpeed, retrigSpeed, retrigCnt, retrigVol; | 
|  | 97 	uint8_t volKolVol, tonNr, envPPos, eVibPos, envVPos, realVol, oldVol, outVol; | 
|  | 98 	uint8_t oldPan, outPan, finalPan; | 
|  | 99 	bool envSustainActive; | 
|  | 100 	int16_t envVIPValue, envPIPValue; | 
|  | 101 	uint16_t outPeriod, realPeriod, finalPeriod, finalVol, tonTyp, wantPeriod, portaSpeed; | 
|  | 102 	uint16_t envVCnt, envVAmp, envPCnt, envPAmp, eVibAmp, eVibSweep; | 
|  | 103 	uint16_t fadeOutAmp, fadeOutSpeed; | 
|  | 104 	int32_t smpStartPos; | 
|  | 105 	instrTyp *instrSeg; | 
|  | 106 } stmTyp; | 
|  | 107 | 
|  | 108 #ifdef _MSC_VER | 
|  | 109 #pragma pack(push) | 
|  | 110 #pragma pack(1) | 
|  | 111 #endif | 
|  | 112 typedef struct tonTyp_t // this one must be packed on some systems | 
|  | 113 { | 
|  | 114 	uint8_t ton, instr, vol, effTyp, eff; | 
|  | 115 } | 
|  | 116 #ifdef __GNUC__ | 
|  | 117 __attribute__ ((packed)) | 
|  | 118 #endif | 
|  | 119 tonTyp; | 
|  | 120 #ifdef _MSC_VER | 
|  | 121 #pragma pack(pop) | 
|  | 122 #endif | 
|  | 123 | 
|  | 124 // globalized | 
|  | 125 extern volatile bool interpolationFlag, volumeRampingFlag, moduleLoaded, musicPaused, WAVDump_Flag; | 
|  | 126 extern bool linearFrqTab; | 
|  | 127 extern volatile const uint16_t *note2Period; | 
|  | 128 extern uint16_t pattLens[256]; | 
|  | 129 extern int16_t PMPTmpActiveChannel, boostLevel; | 
|  | 130 extern int32_t masterVol, PMPLeft; | 
|  | 131 extern int32_t realReplayRate, quickVolSizeVal, speedVal; | 
|  | 132 extern uint32_t frequenceDivFactor, frequenceMulFactor; | 
|  | 133 extern uint32_t CDA_Amp; | 
|  | 134 extern tonTyp *patt[256]; | 
|  | 135 extern instrTyp *instr[1+128]; | 
|  | 136 extern songTyp song; | 
|  | 137 extern stmTyp stm[32]; | 
|  | 138 | 
|  | 139 #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) | 
|  | 140 | 
|  | 141 bool initMusic(int32_t audioFrequency, int32_t audioBufferSize, bool interpolation, bool volumeRamping); | 
|  | 142 bool loadMusicFromData(const uint8_t *data, uint32_t dataLength); // .XM/.MOD/.FT | 
|  | 143 bool loadMusic(const char *filename); // .XM/.MOD/.FT | 
|  | 144 void freeMusic(void); | 
|  | 145 bool startMusic(void); | 
|  | 146 void stopMusic(); | 
|  | 147 void pauseMusic(void); | 
|  | 148 void resumeMusic(void); | 
|  | 149 void setMasterVol(int32_t v); // 0..256 | 
|  | 150 void setAmp(int32_t level); // 1..32 | 
|  | 151 void setPos(int32_t pos, int32_t row); // input of -1 = don't change | 
|  | 152 void stopVoices(void); | 
|  | 153 void updateReplayRate(void); | 
|  | 154 void startPlaying(void); | 
|  | 155 void stopPlaying(void); | 
|  | 156 | 
|  | 157 bool WAVDump_Record(const char *filenameOut); | 
|  | 158 | 
|  | 159 // 8bb: added these three, handy | 
|  | 160 void WAVDump_Abort(void); | 
|  | 161 int32_t getMasterVol(void); | 
|  | 162 int32_t getAmp(void); | 
|  | 163 uint8_t getNumActiveVoices(void); | 
|  | 164 void toggleMusic(void); | 
|  | 165 void setInterpolation(bool on); | 
|  | 166 void setVolumeRamping(bool on); |