Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 1 | pmbaty | 1 | /* | 
| 2 |  * This source code is public domain. | ||
| 3 |  * | ||
| 4 |  * Authors: Kenton Varda <temporal@gauge3d.org> (C interface wrapper) | ||
| 5 |  */ | ||
| 6 | |||
| 7 | #ifndef MODPLUG_H__INCLUDED | ||
| 8 | #define MODPLUG_H__INCLUDED | ||
| 9 | |||
| 10 | #ifdef __cplusplus | ||
| 11 | extern "C" { | ||
| 12 | #endif | ||
| 13 | |||
| 14 | #if defined(_WIN32) || defined(__CYGWIN__) | ||
| 15 | # if defined(MODPLUG_BUILD) && defined(DLL_EXPORT)      /* building libmodplug as a dll for windows */ | ||
| 16 | #   define MODPLUG_EXPORT __declspec(dllexport) | ||
| 17 | # elif defined(MODPLUG_BUILD) || defined(MODPLUG_STATIC)        /* building or using static libmodplug for windows */ | ||
| 18 | #   define MODPLUG_EXPORT | ||
| 19 | # else | ||
| 20 | #   define MODPLUG_EXPORT __declspec(dllimport)                 /* using libmodplug dll for windows */ | ||
| 21 | # endif | ||
| 22 | #elif defined(MODPLUG_BUILD) && defined(SYM_VISIBILITY) | ||
| 23 | #   define MODPLUG_EXPORT __attribute__((visibility("default"))) | ||
| 24 | #else | ||
| 25 | #define MODPLUG_EXPORT | ||
| 26 | #endif | ||
| 27 | |||
| 28 | struct _ModPlugFile; | ||
| 29 | typedef struct _ModPlugFile ModPlugFile; | ||
| 30 | |||
| 31 | struct _ModPlugNote { | ||
| 32 | unsigned char Note; | ||
| 33 | unsigned char Instrument; | ||
| 34 | unsigned char VolumeEffect; | ||
| 35 | unsigned char Effect; | ||
| 36 | unsigned char Volume; | ||
| 37 | unsigned char Parameter; | ||
| 38 | }; | ||
| 39 | typedef struct _ModPlugNote ModPlugNote; | ||
| 40 | |||
| 41 | typedef void (*ModPlugMixerProc)(int*, unsigned long, unsigned long); | ||
| 42 | |||
| 43 | /* Load a mod file.  [data] should point to a block of memory containing the complete | ||
| 44 |  * file, and [size] should be the size of that block. | ||
| 45 |  * Return the loaded mod file on success, or NULL on failure. */ | ||
| 46 | MODPLUG_EXPORT ModPlugFile* ModPlug_Load(const void* data, int size); | ||
| 47 | /* Unload a mod file. */ | ||
| 48 | MODPLUG_EXPORT void ModPlug_Unload(ModPlugFile* file); | ||
| 49 | |||
| 50 | /* Read sample data into the buffer.  Returns the number of bytes read.  If the end | ||
| 51 |  * of the mod has been reached, zero is returned. */ | ||
| 52 | MODPLUG_EXPORT int ModPlug_Read(ModPlugFile* file, void* buffer, int size); | ||
| 53 | |||
| 54 | /* Get the name of the mod.  The returned buffer is stored within the ModPlugFile | ||
| 55 |  * structure and will remain valid until you unload the file. */ | ||
| 56 | MODPLUG_EXPORT const char* ModPlug_GetName(ModPlugFile* file); | ||
| 57 | |||
| 58 | /* Get the length of the mod, in milliseconds.  Note that this result is not always | ||
| 59 |  * accurate, especially in the case of mods with loops. */ | ||
| 60 | MODPLUG_EXPORT int ModPlug_GetLength(ModPlugFile* file); | ||
| 61 | |||
| 62 | /* Seek to a particular position in the song.  Note that seeking and MODs don't mix very | ||
| 63 |  * well.  Some mods will be missing instruments for a short time after a seek, as ModPlug | ||
| 64 |  * does not scan the sequence backwards to find out which instruments were supposed to be | ||
| 65 |  * playing at that time.  (Doing so would be difficult and not very reliable.)  Also, | ||
| 66 |  * note that seeking is not very exact in some mods -- especially those for which | ||
| 67 |  * ModPlug_GetLength() does not report the full length. */ | ||
| 68 | MODPLUG_EXPORT void ModPlug_Seek(ModPlugFile* file, int millisecond); | ||
| 69 | |||
| 70 | enum _ModPlug_Flags | ||
| 71 | { | ||
| 72 | MODPLUG_ENABLE_OVERSAMPLING = 1 << 0, /* Enable oversampling (*highly* recommended) */ | ||
| 73 | MODPLUG_ENABLE_NOISE_REDUCTION = 1 << 1, /* Enable noise reduction */ | ||
| 74 | MODPLUG_ENABLE_REVERB = 1 << 2, /* Enable reverb */ | ||
| 75 | MODPLUG_ENABLE_MEGABASS = 1 << 3, /* Enable megabass */ | ||
| 76 | MODPLUG_ENABLE_SURROUND = 1 << 4 /* Enable surround sound. */ | ||
| 77 | }; | ||
| 78 | |||
| 79 | enum _ModPlug_ResamplingMode | ||
| 80 | { | ||
| 81 | MODPLUG_RESAMPLE_NEAREST = 0, /* No interpolation (very fast, extremely bad sound quality) */ | ||
| 82 | MODPLUG_RESAMPLE_LINEAR = 1, /* Linear interpolation (fast, good quality) */ | ||
| 83 | MODPLUG_RESAMPLE_SPLINE = 2, /* Cubic spline interpolation (high quality) */ | ||
| 84 | MODPLUG_RESAMPLE_FIR = 3 /* 8-tap fir filter (extremely high quality) */ | ||
| 85 | }; | ||
| 86 | |||
| 87 | typedef struct _ModPlug_Settings | ||
| 88 | { | ||
| 89 | int mFlags; /* One or more of the MODPLUG_ENABLE_* flags above, bitwise-OR'ed */ | ||
| 90 | |||
| 91 |         /* Note that ModPlug always decodes sound at 44100kHz, 32 bit, stereo and then | ||
| 92 |          * down-mixes to the settings you choose. */ | ||
| 93 | int mChannels; /* Number of channels - 1 for mono or 2 for stereo */ | ||
| 94 | int mBits; /* Bits per sample - 8, 16, or 32 */ | ||
| 95 | int mFrequency; /* Sampling rate - 11025, 22050, or 44100 */ | ||
| 96 | int mResamplingMode; /* One of MODPLUG_RESAMPLE_*, above */ | ||
| 97 | |||
| 98 | int mStereoSeparation; /* Stereo separation, 1 - 256 */ | ||
| 99 | int mMaxMixChannels; /* Maximum number of mixing channels (polyphony), 32 - 256 */ | ||
| 100 | |||
| 101 | int mReverbDepth; /* Reverb level 0(quiet)-100(loud) */ | ||
| 102 | int mReverbDelay; /* Reverb delay in ms, usually 40-200ms */ | ||
| 103 | int mBassAmount; /* XBass level 0(quiet)-100(loud) */ | ||
| 104 | int mBassRange; /* XBass cutoff in Hz 10-100 */ | ||
| 105 | int mSurroundDepth; /* Surround level 0(quiet)-100(heavy) */ | ||
| 106 | int mSurroundDelay; /* Surround delay in ms, usually 5-40ms */ | ||
| 107 | int mLoopCount; /* Number of times to loop. Zero prevents looping. | ||
| 108 |                               * -1 loops forever. */ | ||
| 109 | } ModPlug_Settings; | ||
| 110 | |||
| 111 | /* Get and set the mod decoder settings.  All options, except for channels, bits-per-sample, | ||
| 112 |  * sampling rate, and loop count, will take effect immediately.  Those options which don't | ||
| 113 |  * take effect immediately will take effect the next time you load a mod. */ | ||
| 114 | MODPLUG_EXPORT void ModPlug_GetSettings(ModPlug_Settings* settings); | ||
| 115 | MODPLUG_EXPORT void ModPlug_SetSettings(const ModPlug_Settings* settings); | ||
| 116 | |||
| 117 | /* New ModPlug API Functions */ | ||
| 118 | /* NOTE: Master Volume (1-512) */ | ||
| 119 | MODPLUG_EXPORT unsigned int ModPlug_GetMasterVolume(ModPlugFile* file) ; | ||
| 120 | MODPLUG_EXPORT void ModPlug_SetMasterVolume(ModPlugFile* file,unsigned int cvol) ; | ||
| 121 | |||
| 122 | MODPLUG_EXPORT int ModPlug_GetCurrentSpeed(ModPlugFile* file); | ||
| 123 | MODPLUG_EXPORT int ModPlug_GetCurrentTempo(ModPlugFile* file); | ||
| 124 | MODPLUG_EXPORT int ModPlug_GetCurrentOrder(ModPlugFile* file); | ||
| 125 | MODPLUG_EXPORT int ModPlug_GetCurrentPattern(ModPlugFile* file); | ||
| 126 | MODPLUG_EXPORT int ModPlug_GetCurrentRow(ModPlugFile* file); | ||
| 127 | MODPLUG_EXPORT int ModPlug_GetPlayingChannels(ModPlugFile* file); | ||
| 128 | |||
| 129 | MODPLUG_EXPORT void ModPlug_SeekOrder(ModPlugFile* file,int order); | ||
| 130 | MODPLUG_EXPORT int ModPlug_GetModuleType(ModPlugFile* file); | ||
| 131 | MODPLUG_EXPORT char* ModPlug_GetMessage(ModPlugFile* file); | ||
| 132 | |||
| 133 | #define MODPLUG_NO_FILESAVE /* experimental yet.  must match stdafx.h. */ | ||
| 134 | #ifndef MODPLUG_NO_FILESAVE | ||
| 135 | /* | ||
| 136 |  * EXPERIMENTAL Export Functions | ||
| 137 |  */ | ||
| 138 | /*Export to a Scream Tracker 3 S3M module. EXPERIMENTAL (only works on Little-Endian platforms)*/ | ||
| 139 | MODPLUG_EXPORT char ModPlug_ExportS3M(ModPlugFile* file, const char* filepath); | ||
| 140 | |||
| 141 | /*Export to a Extended Module (XM). EXPERIMENTAL (only works on Little-Endian platforms)*/ | ||
| 142 | MODPLUG_EXPORT char ModPlug_ExportXM(ModPlugFile* file, const char* filepath); | ||
| 143 | |||
| 144 | /*Export to a Amiga MOD file. EXPERIMENTAL.*/ | ||
| 145 | MODPLUG_EXPORT char ModPlug_ExportMOD(ModPlugFile* file, const char* filepath); | ||
| 146 | |||
| 147 | /*Export to a Impulse Tracker IT file. Should work OK in Little-Endian & Big-Endian platforms :-) */ | ||
| 148 | MODPLUG_EXPORT char ModPlug_ExportIT(ModPlugFile* file, const char* filepath); | ||
| 149 | #endif /* MODPLUG_NO_FILESAVE */ | ||
| 150 | |||
| 151 | MODPLUG_EXPORT unsigned int ModPlug_NumInstruments(ModPlugFile* file); | ||
| 152 | MODPLUG_EXPORT unsigned int ModPlug_NumSamples(ModPlugFile* file); | ||
| 153 | MODPLUG_EXPORT unsigned int ModPlug_NumPatterns(ModPlugFile* file); | ||
| 154 | MODPLUG_EXPORT unsigned int ModPlug_NumChannels(ModPlugFile* file); | ||
| 155 | MODPLUG_EXPORT unsigned int ModPlug_SampleName(ModPlugFile* file, unsigned int qual, char* buff); | ||
| 156 | MODPLUG_EXPORT unsigned int ModPlug_InstrumentName(ModPlugFile* file, unsigned int qual, char* buff); | ||
| 157 | |||
| 158 | /* | ||
| 159 |  * Retrieve pattern note-data | ||
| 160 |  */ | ||
| 161 | MODPLUG_EXPORT ModPlugNote* ModPlug_GetPattern(ModPlugFile* file, int pattern, unsigned int* numrows); | ||
| 162 | |||
| 163 | /* | ||
| 164 |  * ================= | ||
| 165 |  * Mixer callback | ||
| 166 |  * ================= | ||
| 167 |  * | ||
| 168 |  * Use this callback if you want to 'modify' the mixed data of LibModPlug. | ||
| 169 |  * | ||
| 170 |  * void proc(int* buffer,unsigned long channels,unsigned long nsamples) ; | ||
| 171 |  * | ||
| 172 |  * 'buffer': A buffer of mixed samples | ||
| 173 |  * 'channels': N. of channels in the buffer | ||
| 174 |  * 'nsamples': N. of samples in the buffeer (without taking care of n.channels) | ||
| 175 |  * | ||
| 176 |  * (Samples are signed 32-bit integers) | ||
| 177 |  */ | ||
| 178 | MODPLUG_EXPORT void ModPlug_InitMixerCallback(ModPlugFile* file,ModPlugMixerProc proc) ; | ||
| 179 | MODPLUG_EXPORT void ModPlug_UnloadMixerCallback(ModPlugFile* file) ; | ||
| 180 | |||
| 181 | #ifdef __cplusplus | ||
| 182 | } /* extern "C" */ | ||
| 183 | #endif | ||
| 184 | |||
| 185 | #endif |