MMPlgVis.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:14k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Fax.: +49 (0)351-8037944              =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 09.04.98 - 03:48:33 $                                        =}
  24. {========================================================================}
  25. unit MMPlgVis;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29.     Windows,
  30.     Messages,
  31.     SysUtils,
  32.     Forms,
  33.     MMUtils,
  34.     MMSystem,
  35.     MMRegs;
  36. { === Version of current module ($101 = 1.01) ================================ }
  37. const
  38.      VIS_HDRVER = $101;  { checks this }
  39. { === Structures ============================================================= }
  40. type
  41.     TPlugInCBAction    = (paActivate,paQuit);
  42.     TPlugInCallBack    = procedure(User: Longint; Action: TPlugInCBAction); stdcall;
  43.     PSpectrumDataShort = ^TSpectrumDataShort;
  44.     TSpectrumDataShort = array[0..1,0..575] of Byte;    { 0=Left;1=Right }
  45.     PWaveFormDataShort = ^TWaveFormDataShort;
  46.     TWaveformDataShort = array[0..1,0..575] of ShortInt;{ 0=Left;1=Right }
  47.     PPlugInVISModule   = ^TPlugInVISModule;
  48.     TPlugInVISModule   = record
  49.       Description      : PChar;   { description of module }
  50.       hWNDParent       : HWND;    { parent window (filled in by Application) }
  51.       hDLLInstance     : HINST;   { instance handle to this DLL (filled in by Application) }
  52.       sRate            : integer; { sample rate (filled in by Application) }
  53.       nCh              : integer; { number of channels (filled in by Application) }
  54.       LatencyMs        : integer; { latency from call of RenderFrame to actual drawing }
  55.                                   { (PlugIn looks at this value when getting data) }
  56.       DelayMs          : integer; { delay between calls in milliSeconds }
  57.       SpectrumNch      : integer; { number of channels for FFT data }
  58.       WaveformNch      : integer; { number of channels for PCM data }
  59.       {The data is filled in according to the respective Nch entry}
  60.       SpectrumData     : TSpectrumDataShort;
  61.       WaveformData     : TWaveFormDataShort;
  62.                          { configuration method }
  63.       Config           : procedure(This_Mod: PPlugInVISModule); cdecl;
  64.                          { Create window, etc.; 0=success }
  65.       Init             : function(This_Mod : PPlugInVISModule): integer; cdecl;
  66.                          {1=Plug-in should end; 0=success }
  67.       Render           : function(This_Mod : PPlugInVISModule): integer; cdecl;
  68.                          { call when done}
  69.       Quit             : procedure(This_Mod: PPlugInVISModule); cdecl;
  70.                          { pointer to user data (optional) }
  71.       UserData         : Pointer;
  72.     end;
  73.     PPlugInVISHeader = ^TPlugInVISHeader;
  74.     TPlugInVISHeader = record
  75.       Version        : integer; { VIS_HDRVER }
  76.       Description    : PChar;   { description of library }
  77.       GetModule      : function(Idx: integer): PPlugInVISModule; cdecl;
  78.                        { Gets a module pointer based on idx }
  79.     end;
  80.     PPlugInVIS       = ^TPlugInVIS;
  81.     PVISModule       = ^TVISModule;
  82.     TVISModule       = packed record
  83.         Description  : string;
  84.         Active       : Boolean;
  85.         PlugIn       : PPlugInVIS;
  86.         ModuleData   : PPlugInVISModule;
  87.     end;
  88.     TPlugInVIS       = packed record
  89.         DLLName      : string;
  90.         DLLInstance  : THandle;
  91.         Description  : string;
  92.         Modules      : array[0..99] of TVISModule;
  93.         NumModules   : integer;
  94.         Open         : Boolean;
  95.         Header       : PPlugInVISHeader;
  96.         Callback     : TPlugInCallBack;
  97.         User         : Longint;
  98.     end;
  99. function  ReadPlugInVIS(FileName: string): PPlugInVIS;
  100. procedure FreePlugInVIS(var PlugIn: PPlugInVIS);
  101. function  OpenPlugInVIS(PlugIn: PPlugInVIS; ParentWindow: HWND): Boolean;
  102. procedure ClosePlugInVIS(PlugIn: PPlugInVIS);
  103. procedure ConfigPlugInVISModule(Module: TVISModule);
  104. function  InitPlugInVISModule(var Module: TVISModule; pwfx: PWaveFormatEx): Boolean;
  105. function  RenderPlugInVISModule(var Module: TVISModule): Boolean;
  106. procedure QuitPlugInVISModule(var Module: TVISModule);
  107. procedure SetCallback(PlugIn: PPlugInVIS; Callback: TPlugInCallBack; User: Longint);
  108. implementation
  109. type
  110.     TGetHeader           = function : PPlugInVISHeader; cdecl;
  111.     TGetModule           = function (Which: integer): PPlugInVISModule; cdecl;
  112.     TConfig              = procedure(This_Mod: PPlugInVISModule); cdecl;
  113.     TInit                = function (This_Mod: PPlugInVISModule): Integer; cdecl;
  114.     TRender              = function (This_Mod: PPlugInVISModule): Integer; cdecl;
  115.     TQuit                = procedure(This_Mod: PPlugInVISModule); cdecl;
  116. {==============================================================================}
  117. function ReadPlugInVIS(FileName: string): PPlugInVIS;
  118. var
  119.    hPlugIn   : THandle;
  120.    EntryPoint: TFarProc;
  121.    GetHeader : TGetHeader;
  122.    GetModule : TGetModule;
  123.    Hdr       : PPlugInVISHeader;
  124.    Module    : PPlugInVISModule;
  125. begin
  126.    Result := nil;
  127.    hPlugIn := LoadLibrary(PChar(FileName));
  128.    if (hPlugIn <> 0) then
  129.    begin
  130.       try
  131.          EntryPoint := GetProcAddress(hPlugIn, 'winampVisGetHeader');
  132.          if (EntryPoint = nil) then
  133.              EntryPoint := GetProcAddress(hPlugIn, 'MMPlugInVisGetHeader');
  134.          if (EntryPoint <> nil) then
  135.          begin
  136.             @GetHeader := EntryPoint;
  137.             Hdr        := GetHeader; { Get PlugIn-header }
  138.             if (Hdr <> nil) and (Hdr.Version >= VIS_HDRVER) then
  139.             begin
  140.                New(Result);
  141.                with Result^ do
  142.                begin
  143.                   DLLName     := UpperCase(FileName);
  144.                   DLLInstance := 0;
  145.                   Callback    := nil;
  146.                   Description := StrPas(Hdr.Description);
  147.                   Header      := nil;
  148.                   Open        := False;
  149.                   GetModule   := Hdr^.GetModule;
  150.                   NumModules  := 0;
  151.                   repeat
  152.                      Module := GetModule(NumModules);
  153.                      if (Module <> nil) then
  154.                      begin
  155.                         Modules[NumModules].Description := StrPas(Module.Description);
  156.                         Modules[NumModules].ModuleData  := nil;
  157.                         Modules[NumModules].Active      := False;
  158.                         Modules[NumModules].Plugin      := Result;
  159.                         inc(NumModules);
  160.                      end;
  161.                   until (Module = nil) or (NumModules = 100);
  162.                end;
  163.             end;
  164.          end;
  165.       finally
  166.          FreeLibrary(hPlugIn);
  167.       end;
  168.    end;
  169. end;
  170. {==============================================================================}
  171. function OpenPlugInVIS(PlugIn: PPlugInVIS; ParentWindow: HWND): Boolean;
  172. var
  173.    EntryPoint: TFarProc;
  174.    GetHeader : TGetHeader;
  175.    GetModule : TGetModule;
  176.    Hdr       : PPlugInVISHeader;
  177.    Module    : PPlugInVISModule;
  178. begin
  179.    if (PlugIn <> nil) and not PlugIn.Open then
  180.    begin
  181.       PlugIn.DLLInstance := LoadLibrary(PChar(PlugIn.DLLname));
  182.       if (PlugIn.DLLInstance <> 0) then
  183.       begin
  184.          try
  185.             EntryPoint := GetProcAddress(PlugIn.DLLInstance, 'winampVisGetHeader');
  186.             if (EntryPoint = nil) then
  187.                 EntryPoint := GetProcAddress(PlugIn.DLLInstance, 'MMPlugInVisGetHeader');
  188.             if (EntryPoint <> nil) then
  189.             begin
  190.                @GetHeader := EntryPoint;
  191.                Hdr        := GetHeader; { Get PlugIn-header }
  192.                if (Hdr <> nil) and (Hdr.Version >= VIS_HDRVER) then
  193.                begin
  194.                   with PlugIn^ do
  195.                   begin
  196.                      Header      := Hdr;
  197.                      GetModule   := Header^.GetModule;
  198.                      NumModules  := 0;
  199.                      repeat
  200.                         Module := GetModule(NumModules);
  201.                         if (Module <> nil) then
  202.                         begin
  203.                            Module.HWNDParent   := ParentWindow;
  204.                            Module.hDLLInstance := PlugIn.DLLInstance;
  205.                            Modules[NumModules].ModuleData := Module;
  206.                            Modules[NumModules].Active     := False;
  207.                            Modules[NumModules].PlugIn     := PlugIn;
  208.                            inc(NumModules);
  209.                         end;
  210.                      until (Module = nil) or (NumModules = 100);
  211.                   end;
  212.                   PlugIn.Open := True;
  213.                end;
  214.             end;
  215.          finally
  216.             if not PlugIn.Open then
  217.             begin
  218.                FreeLibrary(PlugIn.DLLInstance);
  219.                PlugIn.DLLInstance := 0;
  220.             end;
  221.          end;
  222.       end;
  223.    end;
  224.    Result := (PlugIn <> nil) and PlugIn.Open;
  225. end;
  226. {==============================================================================}
  227. procedure ClosePlugInVIS(PlugIn: PPlugInVIS);
  228. var
  229.    i: integer;
  230. begin
  231.    try
  232.       if (PlugIn <> nil) and PlugIn.Open then
  233.       with PlugIn^ do
  234.       begin
  235.          for i := 0 to NumModules-1 do
  236.          begin
  237.             QuitPlugInVISModule(Modules[i]);
  238.             Modules[i].ModuleData := nil;
  239.          end;
  240.          Header := nil;
  241.          PlugIn.Open := False;
  242.          if (DLLInstance <> 0) then
  243.          begin
  244.             FreeLibrary(DLLInstance);
  245.             DLLInstance := 0;
  246.          end;
  247.       end;
  248.    except
  249.       // no exception please !!!
  250.    end;
  251. end;
  252. {==============================================================================}
  253. procedure FreePlugInVIS(var PlugIn: PPlugInVIS);
  254. begin
  255.    try
  256.       if (PlugIn <> nil) then
  257.       begin
  258.          ClosePlugInVIS(PlugIn);
  259.          Dispose(PlugIn);
  260.          PlugIn := nil;
  261.       end;
  262.    except
  263.       // no exception please !!!
  264.    end;
  265. end;
  266. {==============================================================================}
  267. procedure SetCallback(PlugIn: PPlugInVIS; Callback: TPlugInCallBack; User: Longint);
  268. begin
  269.    if (PlugIn <> nil) then
  270.    begin
  271.       PlugIn.Callback := CallBack;
  272.       PlugIn.User     := User;
  273.    end;
  274. end;
  275. {==============================================================================}
  276. procedure ConfigPlugInVISModule(Module: TVISModule);
  277. begin
  278.    try
  279.       if (Module.ModuleData <> nil) and assigned(Module.ModuleData.Config) then
  280.           Module.ModuleData.Config(Module.ModuleData);
  281.    except
  282.       // no exception please !!!
  283.    end;
  284. end;
  285. {==============================================================================}
  286. function InitPlugInVISModule(var Module: TVISModule; pwfx: PWaveFormatEx): Boolean;
  287. begin
  288.    try
  289.       if (Module.ModuleData <> nil) and not Module.Active then
  290.       with Module.ModuleData^ do
  291.       begin
  292.          if (pwfx = nil) then
  293.          begin
  294.             sRate    := 44100;
  295.             nCh      := 2;
  296.          end
  297.          else
  298.          begin
  299.             sRate    := pwfx.nSamplesPerSec;
  300.             nCh      := pwfx^.nChannels;
  301.          end;
  302.          //LatencyMS   := 25;
  303.          //DelayMS     := 25;
  304.          //SpectrumNch := 2;
  305.          //WaveFormNch := 2;
  306.          if assigned(Module.ModuleData.Init) then
  307.          begin
  308.             Module.Active := Module.ModuleData.Init(Module.ModuleData) = 0;
  309.             if Module.Active and assigned(Module.PlugIn) and assigned(Module.PlugIn.Callback) then
  310.                Module.PlugIn.Callback(Module.PlugIn.User,paActivate);
  311.          end;
  312.       end;
  313.       Result := Module.Active;
  314.    except
  315.       Result := False;
  316.       // no exception please !!!
  317.    end;
  318. end;
  319. {==============================================================================}
  320. function RenderPlugInVISModule(var Module: TVISModule): Boolean;
  321. begin
  322.    try
  323.       if (Module.ModuleData <> nil) and Module.Active and assigned(Module.ModuleData.Render) then
  324.          Result := Module.ModuleData.Render(Module.ModuleData) = 0
  325.       else
  326.           Result := True;
  327.    except
  328.       Result := False;
  329.       // no exception please !!!
  330.    end;
  331. end;
  332. {==============================================================================}
  333. procedure QuitPlugInVISModule(var Module: TVISModule);
  334. begin
  335.    try
  336.       if (Module.ModuleData <> nil) and Module.Active and assigned(Module.ModuleData.Quit) then
  337.       begin
  338.          Module.ModuleData.Quit(Module.ModuleData);
  339.          if assigned(Module.PlugIn) and assigned(Module.PlugIn.Callback) then
  340.              Module.PlugIn.Callback(Module.PlugIn.User,paQuit);
  341.       end;
  342.       Module.Active := False;
  343.    except
  344.       // no exception please !!!
  345.    end;
  346. end;
  347. end.