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 |