Subversion Repositories spacemission

Rev

Blame | Last modification | View Log | RSS feed

  1. (*
  2.  * This unit is  free software; you can redistribute it  and modify it
  3.  * under the terms of the GNU Library General Public License as published
  4.  * by the Free Software Foundation; either version 2  of the license or
  5.  * (at your option) any later version.
  6.  *
  7.  * Author of CPP header file : Olivier Lapicque <olivierl@jps.net>
  8.  * Author of Delphi conversion : Dean Ellis <Dean_Ellis@sillex.freeserve.co.uk>
  9.  *
  10.  * NOTE : The Origonal C++ Class declarations anc constants have been left in place
  11.  *
  12. *)
  13. unit MpSndSys;
  14.  
  15. interface
  16.  
  17. uses Windows,Classes;
  18.  
  19. const
  20. //#ifndef MPP_SND_SYS_H
  21. //#define MPP_SND_SYS_H
  22.  
  23. //#ifndef MPPDLLEXPORT
  24. //#define MPPDLLEXPORT
  25. //#endif
  26.  
  27. //#define MPPAPI                        __stdcall
  28. //#define MPPCDECL              __cdecl
  29. //#define MPPAPI_VERSION        0x0140
  30.  
  31. //#define MPPAPI_VERSION        0x0140
  32.  
  33.    MPPAPI_VERSION       = $0141;
  34.  
  35. // Version-specific functions
  36. //#define MPPVERSION_HAS_NAVIGATION     0x0139
  37. //#define MPPVERSION_HAS_SONGTIME 0x0141
  38.  
  39.    MPPVERSION_HAS_NAVIGATION =  $0139;
  40.    MPPVERSION_HAS_SONGTIME        =     $0141;
  41.  
  42. // Error codes
  43. //typedef long MPPERR;
  44. //
  45. //enum {
  46. //      MPPERR_NOERROR=0,
  47. //      MPPERR_FAILED,
  48. //      MPPERR_INVALIDPARAM,
  49. //};
  50.  
  51. //enum {
  52. // MPPSONG_INVALID=0,
  53. //      MPPSONG_MOD,
  54. //      MPPSONG_S3M,
  55. //      MPPSONG_XM,
  56. //      MPPSONG_IT,
  57. //      MPPSONG_MDL,
  58. //      MPPSONG_UNKNOWN=100
  59. //};
  60.    MPPERR_NOERROR       = 0;
  61.         MPPERR_FAILED        = 1;
  62.         MPPERR_INVALIDPARAM  = 2;
  63.  
  64.         MPPSONG_INVALID   = 0;
  65.         MPPSONG_MOD       = 1;
  66.         MPPSONG_S3M       = 2;
  67.         MPPSONG_XM        = 3;
  68.         MPPSONG_IT        = 4;
  69.         MPPSONG_MDL       = 5;
  70.         MPPSONG_UNKNOWN   = 100;
  71.  
  72. // Mixer Options MPPMIX_XXXX
  73. //#define MPPMIX_NORESAMPLING           0x01    // Faster, but crappy quality
  74. //#define MPPMIX_BASSEXPANSION  0x02    // Bass Expansion
  75. //#define MPPMIX_SURROUND                       0x04    // Surround Encoding
  76. //#define MPPMIX_REVERB                 0x08    // Reverb
  77. //#define MPPMIX_LOOP                           0x10    // Loop the song (backward jumps will be enabled)
  78. //// v1.40+ flags
  79. //#define MPPMIX_HIGHQUALITY            0x20    // HQ mixing (better resampling, dithering enabled)
  80. //#define MPPMIX_GAINCONTROL            0x40    // Automatic Gain Control
  81. //#define MPPMIX_NOISEREDUCTION 0x80    // Noise reduction (-6dB 22kHz lowpass filter)
  82.  
  83.    MPPMIX_NORESAMPLING    = $01;        // Faster, but crappy quality
  84.    MPPMIX_BASSEXPANSION   = $02;        // Bass Expansion
  85.    MPPMIX_SURROUND                = $04;        // Surround Encoding
  86.    MPPMIX_REVERB                          = $08;        // Reverb
  87.    MPPMIX_LOOP                            = $10;        // Loop the song (backward jumps will be enabled)
  88.    // v1.40+ flags
  89.    MPPMIX_HIGHQUALITY     = $20;        // HQ mixing (better resampling, dithering enabled)
  90.    MPPMIX_GAINCONTROL     = $40;        // Automatic Gain Control
  91.    MPPMIX_NOISEREDUCTION  = $80;        // Noise reduction (-6dB 22kHz lowpass filter)
  92.  
  93. type
  94.   //==========================
  95.   //class MPPDLLEXPORT IModMixer
  96.   //==========================
  97. (*  {
  98. public:
  99.         // Reference count: the initial reference count is 1, so you shouldn't have to call AddRef()
  100.         virtual unsigned long MPPAPI AddRef() = 0;
  101.         virtual unsigned long MPPAPI Release() = 0;
  102.  
  103.         // API Version: you should refuse to continue if the returned value is smaller than MPPAPI_VERSION
  104.         virtual unsigned long MPPAPI GetVersion() = 0;
  105.  
  106.         // Basic I/O Functions
  107.         virtual MPPERR MPPAPI LoadSong(const void *pmemfile, long len) = 0;
  108.                                                 // Songs are always loaded from memory. The pointer pmemfile can be destroyed
  109.                                                 // after the call to LoadSong. You can use memory-mapped files or a pointer returned
  110.                                                 // by LockResource(), or whatever file in memory.
  111.         virtual MPPERR MPPAPI FreeSong() = 0;                   // Free the memory used by the song
  112.  
  113.         // Audio Rendering Functions: example: (44100, 2, 16) for 44.1kHz, stereo, 16-bit
  114.         virtual MPPERR MPPAPI SetWaveFormat(long samplespersec, long channels, long bitspersample) = 0;
  115.         // return # of SAMPLES that have been written to the buffer, 0 if end has been reached
  116.         // Note: protect calls to Render() and SetMixerOptions() by a critical section, if they
  117.         //       are used in different threads.
  118.         virtual long MPPAPI Render(void *pbuffer, unsigned long bufsize) = 0;
  119.  
  120.         // Player Configuration: set of MPPMIX_XXXX
  121.         virtual MPPERR MPPAPI SetMixerOptions(unsigned long dwOptions) = 0;
  122.         virtual unsigned long MPPAPI GetMixerOptions() = 0;
  123.  
  124.         // Song Information
  125.         virtual long MPPAPI GetSongType() = 0;                          // Return MPPSONG_XXXX
  126.         virtual void MPPAPI GetSongName(char *pszbuf) = 0;      // pszbuf must be at least 32-bytes
  127.  
  128.         //////////////////////////////////////////////////////////////////////////////////////
  129.         // v1.39+: Navigation functions
  130.         // The order is the position in the pattern sequence list: this allows you to
  131.         // jump to a specific part of a song. It can be useful in a game with a song that
  132.         // uses pattern position jump effects (or pattern loops).
  133.         // These function will not be available if GetVersion() returns a value smaller than 0x139 (MPPVERSION_HAS_NAVIGATION)
  134.         virtual unsigned long MPPAPI GetNumOrders() = 0;
  135.         virtual unsigned long MPPAPI GetCurrentOrder() = 0;
  136.         virtual MPPERR MPPAPI SetCurrentOrder(unsigned long neworder) = 0;
  137.  
  138. };
  139. *)
  140.    MppError = longint;
  141.  
  142.    PModMixer = ^IModMixer;
  143.    IModMixer = class
  144.       public
  145.          function AddRef:longint; virtual; stdcall; abstract;
  146.          function Release:longint; virtual; stdcall; abstract;
  147.          function GetVersion:longint; virtual; stdcall; abstract;
  148.          function LoadSong(const MemFile:pointer;Length:longint):MppError;virtual; stdcall; abstract;
  149.          function FreeSong:MppError;virtual; stdcall; abstract;
  150.          function SetWaveFormat(SamplesPerSec,channels,bitsPerSample:longint):MppError;virtual; stdcall; abstract;
  151.          function Render(Buffer:pointer;BufferSize:longint):MppError;virtual; stdcall; abstract;
  152.          function SetMixerOptions(dwOptions:longint):MppError;virtual; stdcall; abstract;
  153.          function GetMixerOptions:longint;virtual; stdcall; abstract;
  154.          function GetSongType:longint;virtual; stdcall; abstract;
  155.          procedure GetSongName(Buffer:PChar);virtual; stdcall; abstract;
  156.          function GetNumOrders:longint;virtual; stdcall; abstract;
  157.          function SetCurrentOrder(newOrder:longint):MppError;virtual; stdcall; abstract;
  158.          function GetSongLength:longint; virtual; stdcall; abstract;
  159.    end;
  160.  
  161. var
  162.    MppSdkLibLoaded:Boolean;
  163.    ModMixer:IModMixer;
  164.  
  165. implementation
  166.  
  167. const MppSdkLibrary = 'mppsdk.dll';
  168.  
  169. var MppSdkLibHandle:THandle;
  170.  
  171. //#define MPP_GETMODAPIFUNCNAME                         "MPP_GetModAPI"
  172. //typedef MPPERR (MPPCDECL * MPP_GETMODAPIFUNC)(IModMixer **);
  173.     GetModAPI : function(MODMixer:PModMixer):MppError;cdecl;
  174.  
  175. (*
  176.  *
  177.  * To get a pointer to the IModMixer interface, you can use the following functions:
  178.  *
  179.  *   HMODULE hMPPSDK = (HMODULE)LoadLibrary("mppsdk.dll");
  180.  *   MPP_GETMODAPIFUNC pFunc = (MPP_GETMODAPIFUNC)GetProcAddress(hMPPSDK, MPP_GETMODAPIFUNCNAME);
  181.  *   IModMixer *pMPPAPI;
  182.  *   pFunc(&pMPPAPI);
  183.  *   ...
  184.  * You can then access the MPP SDK API through the IModMixer interface
  185.  *
  186.  * When you are done:
  187.  *
  188.  *   pMPPAPI->Release();
  189.  *   FreeLibrary(hMPPSDK);
  190.  *
  191.  *)
  192.  
  193. //#endif // MPP_SND_SYS_H
  194.  
  195.  
  196. {----------------------------------------------------------------------------}
  197. {InitLibrary - will try to load the Mppsdk.dll and get the ModMixer object}
  198. {----------------------------------------------------------------------------}
  199. function InitLibrary:Boolean;
  200. begin
  201.    Result := False;
  202.  
  203.    MppSdkLibHandle := LoadLibrary(MppSdkLibrary);
  204.  
  205.    if MppSdkLibHandle = 0 then
  206.    begin
  207.       Exit;
  208.    end;
  209.  
  210.    try
  211.       GetModAPI := GetProcAddress(MppSdkLibHandle,'MPP_GetModAPI');
  212.       GetModAPI(@ModMixer);
  213.       Result := True;
  214.    except
  215.       Result := False;
  216.    end;
  217. end;
  218. {----------------------------------------------------------------------------}
  219. {UnLoadLibrary - Will unload the Mppsdk.dll if it was loaded}
  220. {----------------------------------------------------------------------------}
  221. procedure UnLoadLibrary;
  222. begin
  223.   if MppSdkLibLoaded then
  224.   begin
  225.      FreeLibrary(MppSdkLibHandle);
  226.   end;
  227. end;
  228.  
  229. {----------------------------------------------------------------------------}
  230. {Automatic initialization and finalization - comment out if you want to
  231.  do this manually}
  232. {----------------------------------------------------------------------------}
  233. initialization
  234.   MppSdkLibLoaded:=InitLibrary;
  235. finalization
  236.   UnloadLibrary;
  237. end.
  238.