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

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Tel.: +0351-8012255                   =}
  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: 20.01.1998 - 18:00:00 $                                      =}
  24. {========================================================================}
  25. unit MMPhase;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29. {$IFDEF WIN32}
  30.     Windows,
  31. {$ELSE}
  32.     WinTypes,
  33.     WinProcs,
  34. {$ENDIF}
  35.     SysUtils,
  36.     Classes,
  37.     Controls,
  38.     MMSystem,
  39.     MMRegs,
  40.     MMObj,
  41.     MMDSPObj,
  42.     MMUtils,
  43.     MMWaveIO,
  44.     MMPCMSup,
  45.     MMFX;
  46. type
  47.    EMMPhaserError = class(Exception);
  48.    {-- TMMPhaser ---------------------------------------------------------}
  49.    TMMPhaser = class(TMMDSPComponent)
  50.    private
  51.       FEnabled       : Boolean;
  52.       FOpen          : Boolean;
  53.       FPPhaser       : PPhaser;
  54.       FMaxDelay      : integer;
  55.       FDelay         : integer;
  56.       FChannel       : TMMChannel;
  57.       FCleanup       : Longint;
  58.       procedure SetEnabled(aValue: Boolean);
  59.       procedure SetDelays(index: integer; aValue: integer);
  60.       procedure SetChannel(aValue: TMMChannel);
  61.    protected
  62.       procedure SetPWaveFormat(aValue: PWaveFormatEx); override;
  63.       procedure Update; virtual;
  64.       procedure Opened; override;
  65.       procedure Closed; override;
  66.       procedure Started; override;
  67.       procedure BufferReady(lpwh: PWaveHdr); override;
  68.       procedure BufferLoad(lpwh: PWaveHdr; var MoreBuffers: Boolean); override;
  69.    public
  70.       constructor Create(aOwner: TComponent); override;
  71.       destructor Destroy; override;
  72.       procedure Open;
  73.       procedure Close;
  74.       procedure Process(Buffer: PChar; Length: integer);
  75.       function  CleanUp(Buffer: PChar; Length: integer): Longint;
  76.    published
  77.       property Input;
  78.       property Output;
  79.       property Enabled: Boolean read FEnabled write SetEnabled default True;
  80.       property MaxDelay: integer index 0 read FMaxDelay write SetDelays default 250;
  81.       property Delay: integer index 1 read FDelay write SetDelays default 1;
  82.       property Channel: TMMChannel read FChannel write SetChannel default chBoth;
  83.    end;
  84. implementation
  85. {== TMMPhaser ============================================================}
  86. constructor TMMPhaser.Create(aOwner: TComponent);
  87. begin
  88.    inherited Create(aOwner);
  89.    FEnabled    := True;
  90.    FOpen       := False;
  91.    FPPhaser    := nil;
  92.    FMaxDelay   := 250;
  93.    FDelay      := 1;
  94. end;
  95. {-- TMMPhaser ------------------------------------------------------------}
  96. destructor TMMPhaser.Destroy;
  97. begin
  98.    Close;
  99.    inherited Destroy;
  100. end;
  101. {-- TMMPhaser ------------------------------------------------------------}
  102. procedure TMMPhaser.SetEnabled(aValue: Boolean);
  103. begin
  104.    if (aValue <> FEnabled) then
  105.    begin
  106.       FEnabled := aValue;
  107.       if FEnabled then Update;
  108.    end;
  109. end;
  110. {-- TMMPhaser ------------------------------------------------------------}
  111. procedure TMMPhaser.SetDelays(index: integer; aValue: integer);
  112. begin
  113.    case index of
  114.       0: if (aValue = FMaxDelay) then exit else
  115.          begin
  116.             FMaxDelay := aValue;
  117.          end;
  118.       1: if (aValue = FDelay) then exit else
  119.          begin
  120.             FDelay := MinMax(aValue,1,FMaxDelay);
  121.             Update;
  122.          end;
  123.    end;
  124. end;
  125. {-- TMMPhaser ------------------------------------------------------------}
  126. procedure TMMPhaser.SetChannel(aValue: TMMChannel);
  127. begin
  128.    if (aValue <> FChannel) then
  129.    begin
  130.       FChannel := aValue;
  131.       Update;
  132.    end;
  133. end;
  134. {-- TMMPhaser ------------------------------------------------------------}
  135. procedure TMMPhaser.SetPWaveFormat(aValue: PWaveFormatEx);
  136. begin
  137.    if (aValue <> nil) then
  138.    begin
  139.       if not (csDesigning in ComponentState) then
  140.          if not pcmIsValidFormat(aValue) then
  141.             raise EMMPhaserError.Create(LoadResStr(IDS_INVALIDFORMAT));
  142.    end;
  143.    inherited SetPWaveFormat(aValue);
  144. end;
  145. {-- TMMPhaser ------------------------------------------------------------}
  146. procedure TMMPhaser.Open;
  147. begin
  148.    if not FOpen then
  149.    begin
  150.       if pcmIsValidFormat(PWaveFormat) then
  151.       begin
  152.          FPPhaser := InitPhaser(PWaveFormat, FMaxDelay, True);
  153.          if (FPPhaser = nil) then OutOfMemoryError
  154.          else
  155.          begin
  156.             FOpen := True;
  157.             Update;
  158.          end;
  159.       end;
  160.    end;
  161. end;
  162. {-- TMMPhaser ------------------------------------------------------------}
  163. procedure TMMPhaser.Close;
  164. begin
  165.    if FOpen then
  166.    begin
  167.       FOpen := False;
  168.       DonePhaser(FPPhaser);
  169.    end;
  170. end;
  171. {-- TMMPhaser ------------------------------------------------------------}
  172. procedure TMMPhaser.Process(Buffer: PChar; Length: integer);
  173. begin
  174.    { process the buffer trough the delay line }
  175.    if (FPPhaser <> nil) then DoPhaser(FPPhaser, Buffer, Length);
  176. end;
  177. {-- TMMPhaser ------------------------------------------------------------}
  178. function TMMPhaser.CleanUp(Buffer: PChar; Length: integer): Longint;
  179. begin
  180.    { process the remaining delayed bytes in the delay lines }
  181.    if (FPPhaser <> nil) and (FCleanup > 0) then
  182.    begin
  183.       FCleanup := Max(FCleanup - Length,0);
  184.       FillChar(Buffer^, Length, 0);
  185.       DoPhaser(FPPhaser, Buffer, Length);
  186.    end;
  187.    { return the remaining bytes to process }
  188.    Result := FCleanup;
  189. end;
  190. {-- TMMPhaser ------------------------------------------------------------}
  191. procedure TMMPhaser.Update;
  192. begin
  193.    { setup the phaser params }
  194.    if FOpen then
  195.    begin
  196.       FCleanup := 0;
  197.       if (FDelay > FCleanUp) then FCleanUp := FDelay;
  198.       if (FCleanup > 0) then
  199.       begin
  200.          { convert cleanup time to bytes }
  201.          FCleanup := wioTimeToSamples(PWaveFormat,FCleanup);
  202.       end;
  203.       { now update the delay lines }
  204.       SetPhaser(FPPhaser, FDelay, ord(FChannel));
  205.    end;
  206. end;
  207. {-- TMMPhaser ------------------------------------------------------------}
  208. procedure TMMPhaser.Opened;
  209. begin
  210.    Open;
  211.    inherited Opened;
  212. end;
  213. {-- TMMPhaser ------------------------------------------------------------}
  214. procedure TMMPhaser.Closed;
  215. begin
  216.    Close;
  217.    inherited Closed;
  218. end;
  219. {-- TMMPhaser ------------------------------------------------------------}
  220. procedure TMMPhaser.Started;
  221. begin
  222.    Update;
  223.    inherited Started;
  224. end;
  225. {-- TMMPhaser ------------------------------------------------------------}
  226. procedure TMMPhaser.BufferReady(lpwh: PWaveHdr);
  227. begin
  228.    if Enabled and FOpen then
  229.    begin
  230.       Process(lpwh^.lpData, lpwh^.dwBytesRecorded);
  231.    end;
  232.    inherited BufferReady(lpwh);
  233. end;
  234. {-- TMMPhaser ------------------------------------------------------------}
  235. procedure TMMPhaser.BufferLoad(lpwh: PWaveHdr; var MoreBuffers: Boolean);
  236. var
  237.    aLength: Longint;
  238. begin
  239.    inherited BufferLoad(lpwh, MoreBuffers);
  240.    if Enabled and FOpen then
  241.    begin
  242.       if not MoreBuffers then
  243.       begin
  244.          aLength := lpwh^.dwBufferLength;
  245.          if Cleanup(lpwh^.lpData, aLength) > 0 then MoreBuffers := True;
  246.          lpwh^.dwBytesRecorded := aLength;
  247.       end
  248.       else Process(lpwh^.lpData, lpwh^.dwBytesRecorded);
  249.    end;
  250. end;
  251. end.