Subversion Repositories Games.Prince of Persia

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.