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 |