Subversion Repositories Games.Prince of Persia

Rev

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