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 |
186 | |