MMPhaseS.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             = 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 MMPhaseS;
  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.     IniFiles,
  39.     MMSystem,
  40.     MMRegs,
  41.     MMObj,
  42.     MMDSPObj,
  43.     MMUtils,
  44.     MMMath,
  45.     MMWaveIO,
  46.     MMPCMSup,
  47.     MMFX;
  48. type
  49.    EMMPhaseShiftError = class(Exception);
  50.    {-- TMMPhaseShift ---------------------------------------------------------}
  51.    TMMPhaseShift = class(TMMDSPComponent)
  52.    private
  53.       FEnabled       : Boolean;
  54.       FOpen          : Boolean;
  55.       FPPhase        : PPhaseShift;
  56.       FDescription   : String;
  57.       FDryMix        : TMMEffectVolume;
  58.       FWetMix        : TMMEffectVolume;
  59.       FFeedBack      : TMMFeedBack;
  60.       FSweep         : Float;
  61.       FDepth         : Float;
  62.       FRate          : Float;
  63.       FOnChange      : TNotifyEvent;
  64.       FOnPcmOverflow : TNotifyEvent;
  65.       procedure SetDescription(aValue: String);
  66.       procedure SetEnabled(aValue: Boolean);
  67.       procedure SetGains(index: integer; aValue: TMMEffectVolume);
  68.       procedure SetFeedBack(aValue: TMMFeedBack);
  69.       procedure SetSweep(aValue: Float);
  70.       procedure SetDepth(aValue: Float);
  71.       procedure SetRate(aValue: Float);
  72.    protected
  73.       procedure Assign(Source: TPersistent); override;
  74.       procedure SetPWaveFormat(aValue: PWaveFormatEx); override;
  75.       procedure Change; dynamic;
  76.       procedure Update; virtual;
  77.       procedure Opened; override;
  78.       procedure Closed; override;
  79.       procedure Started; override;
  80.       procedure PcmOverflow; dynamic;
  81.       procedure BufferReady(lpwh: PWaveHdr); override;
  82.       procedure BufferLoad(lpwh: PWaveHdr; var MoreBuffers: Boolean); override;
  83.    public
  84.       constructor Create(aOwner: TComponent); override;
  85.       destructor Destroy; override;
  86.       procedure SaveToIniFile(IniFile: TFileName; Section: string);
  87.       procedure ReadFromIniFile(IniFile: TFileName; Section: string);
  88.       procedure ReadIniSections(IniFile: TFileName; Strings: TStrings);
  89.       procedure DeleteSection(IniFile: TFileName; Section: string);
  90.       procedure Open;
  91.       procedure Close;
  92.       procedure Process(Buffer: PChar; Length: integer);
  93.    published
  94.       property OnChange: TNotifyEvent read FOnChange write FOnChange;
  95.       property OnPcmOverflow: TNotifyEvent read FOnPcmOverflow write FOnPcmOverflow;
  96.       property Input;
  97.       property Output;
  98.       property Enabled: Boolean read FEnabled write SetEnabled default True;
  99.       property Description: String read FDescription write SetDescription;
  100.       property DryMix: TMMEffectVolume index 0 read FDryMix write SetGains;
  101.       property WetMix: TMMEffectVolume index 1 read FWetMix write SetGains;
  102.       property FeedBack: TMMFeedBack read FFeedback write SetFeedBack;
  103.       property Sweep: Float read FSweep write SetSweep;
  104.       property Depth: Float read FDepth write SetDepth;
  105.       property Rate: Float read FRate write SetRate;
  106.    end;
  107. implementation
  108. {== TMMPhaseShift ============================================================}
  109. constructor TMMPhaseShift.Create(aOwner: TComponent);
  110. begin
  111.    inherited Create(aOwner);
  112.    FEnabled     := True;
  113.    FOpen        := False;
  114.    FPPhase      := nil;
  115.    FDescription := 'Untitled';
  116.    FDryMix      := 50;
  117.    FWetMix      := 50;
  118.    FFeedBack    := 0;
  119.    FSweep       := 0;
  120.    FDepth       := 0;
  121.    FRate        := 0;
  122. end;
  123. {-- TMMPhaseShift ------------------------------------------------------------}
  124. destructor TMMPhaseShift.Destroy;
  125. begin
  126.    Close;
  127.    inherited Destroy;
  128. end;
  129. {-- TMMPhaseShift ------------------------------------------------------------}
  130. procedure TMMPhaseShift.PcmOverflow;
  131. begin
  132.    if assigned(FOnPcmOverflow) then FOnPcmOverflow(Self);
  133. end;
  134. {-- TMMPhaseShift ------------------------------------------------------------}
  135. procedure TMMPhaseShift.Change;
  136. begin
  137.    if assigned(FOnChange) then FOnChange(Self);
  138. end;
  139. {-- TMMPhaseShift ------------------------------------------------------------}
  140. procedure TMMPhaseShift.Assign(Source: TPersistent);
  141. begin
  142.    if (Source is TMMPhaseShift) then
  143.    begin
  144.       if (Source <> nil) then
  145.       begin
  146.          Enabled    := TMMPhaseShift(Source).Enabled;
  147.          Description:= TMMPhaseShift(Source).Description;
  148.          DryMix     := TMMPhaseShift(Source).DryMix;
  149.          WetMix     := TMMPhaseShift(Source).WetMix;
  150.          FeedBack   := TMMPhaseShift(Source).FeedBack;
  151.          Sweep      := TMMPhaseShift(Source).Sweep;
  152.          Depth      := TMMPhaseShift(Source).Depth;
  153.          Rate       := TMMPhaseShift(Source).Rate;
  154.       end;
  155.    end;
  156. end;
  157. {-- TMMPhaseShift ------------------------------------------------------------}
  158. procedure TMMPhaseShift.SaveToIniFile(IniFile: TFileName; Section: string);
  159. begin
  160.    if (IniFile <> '') then
  161.    begin
  162.       with TIniFile.Create(IniFile) do
  163.       try
  164.          if Pos('PhaseShift.',Section) = 0 then Section := 'PhaseShift.'+Section;
  165.          WriteInteger(Section, 'DryMix', DryMix);
  166.          WriteInteger(Section, 'WetMix', WetMix);
  167.          WriteInteger(Section, 'FeedBack', FeedBack);
  168.          WriteString(Section, 'Sweep', FloatToStr(Sweep));
  169.          WriteString(Section, 'Depth', FloatToStr(Depth));
  170.          WriteString(Section, 'Rate', FloatToStr(Rate));
  171.       finally
  172.          Free;
  173.       end;
  174.    end;
  175. end;
  176. {-- TMMPhaseShift ------------------------------------------------------------}
  177. procedure TMMPhaseShift.ReadFromIniFile(IniFile: TFileName; Section: string);
  178. var
  179.    i,P: integer;
  180. begin
  181.    if (IniFile <> '') then
  182.    begin
  183.       with TIniFile.Create(IniFile) do
  184.       try
  185.          if Pos('PhaseShift.',Section) = 0 then Section := 'PhaseShift.'+Section;
  186.          i := ReadInteger(Section, 'DryMix', -1);
  187.          if (i > 0) then
  188.          begin
  189.             DryMix      := ReadInteger(Section, 'DryMix', 50);
  190.             WetMix      := ReadInteger(Section, 'WetMix', 50);
  191.             FeedBack    := ReadInteger(Section, 'FeedBack', 0);
  192.             Sweep       := StrToFloat(ReadString(Section, 'Sweep', '100.0'));
  193.             Depth       := StrToFloat(ReadString(Section, 'Depth', '4.0'));
  194.             Rate        := StrToFloat(ReadString(Section, 'Rate', '1.0'));
  195.             P := Pos('.',Section);
  196.             if (P <> 0) then Section := Copy(Section,P+1,MaxInt);
  197.             Description := Section;
  198.          end;
  199.       finally
  200.          Free;
  201.       end;
  202.    end;
  203. end;
  204. {-- TMMPhaseShift ------------------------------------------------------------}
  205. procedure TMMPhaseShift.ReadIniSections(IniFile: TFileName; Strings: TStrings);
  206. var
  207.    i, P: integer;
  208.    Sections: TStringList;
  209. begin
  210.    if (IniFile <> '') and (Strings <> nil) then
  211.    begin
  212.       with TIniFile.Create(IniFile) do
  213.       try
  214.          Sections := TStringList.Create;
  215.          try
  216.             ReadSections(Sections);
  217.             Strings.BeginUpdate;
  218.             try
  219.                Strings.Clear;
  220.                for i := 0 to Sections.Count-1 do
  221.                begin
  222.                   P := Pos('.',Sections[i]);
  223.                   if (P <> 0) then Strings.Add(Copy(Sections[i],P+1,MaxInt));
  224.                end;
  225.             finally
  226.                Strings.EndUpdate;
  227.             end;
  228.          finally
  229.             Sections.Free;
  230.          end;
  231.       finally
  232.          Free;
  233.       end;
  234.    end;
  235. end;
  236. {-- TMMPhaseShift ------------------------------------------------------------}
  237. procedure TMMPhaseShift.DeleteSection(IniFile: TFileName; Section: string);
  238. begin
  239.    if (IniFile <> '') then
  240.    begin
  241.       with TIniFile.Create(IniFile) do
  242.       try
  243.          if Pos('PhaseShift.',Section) = 0 then Section := 'PhaseShift.'+Section;
  244.          EraseSection(Section);
  245.       finally
  246.          Free;
  247.       end;
  248.    end;
  249. end;
  250. {-- TMMPhaseShift ------------------------------------------------------------}
  251. procedure TMMPhaseShift.SetEnabled(aValue: Boolean);
  252. begin
  253.    if (aValue <> FEnabled) then
  254.    begin
  255.       FEnabled := aValue;
  256.       if FEnabled then Update;
  257.    end;
  258. end;
  259. {-- TMMPhaseShift ------------------------------------------------------------}
  260. procedure TMMPhaseShift.SetDescription(aValue: String);
  261. begin
  262.    if (aValue <> FDescription) then
  263.    begin
  264.       FDescription := aValue;
  265.       Change;
  266.    end;
  267. end;
  268. {-- TMMPhaseShift ------------------------------------------------------------}
  269. procedure TMMPhaseShift.SetGains(index: integer; aValue: TMMEffectVolume);
  270. begin
  271.    case index of
  272.        0: if (aValue = FDryMix) then exit
  273.           else
  274.           begin
  275.              FDryMix := aValue;
  276.              if FOpen then FPPhase^.DryMix := MulDiv(aValue,256,100);
  277.           end;
  278.        1: if (aValue = FWetMix) then exit
  279.           else
  280.           begin
  281.              FWetMix := aValue;
  282.              if FOpen then FPPhase^.Wetmix := MulDiv(aValue,256,100);
  283.           end;
  284.    end;
  285.    Change;
  286. end;
  287. {-- TMMPhaseShift ------------------------------------------------------------}
  288. procedure TMMPhaseShift.SetFeedBack(aValue: TMMFeedBack);
  289. begin
  290.    if (aValue <> FFeedBack) then
  291.    begin
  292.       FFeedBack := aValue;
  293.       if FOpen then FPPhase^.FeedBack := MulDiv(aValue,256,100);
  294.       Change;
  295.    end;
  296. end;
  297. {-- TMMPhaseShift ------------------------------------------------------------}
  298. procedure TMMPhaseShift.SetSweep(aValue: Float);
  299. begin
  300.    if (aValue <> FSweep) then
  301.    begin
  302.       FSweep := MaxR(aValue,0);
  303.       Update;
  304.       Change;
  305.    end;
  306. end;
  307. {-- TMMPhaseShift ------------------------------------------------------------}
  308. procedure TMMPhaseShift.SetDepth(aValue: Float);
  309. begin
  310.    if (aValue <> FDepth) then
  311.    begin
  312.       FDepth := MaxR(aValue,0);
  313.       Update;
  314.       Change;
  315.    end;
  316. end;
  317. {-- TMMPhaseShift ------------------------------------------------------------}
  318. procedure TMMPhaseShift.SetRate(aValue: Float);
  319. begin
  320.    if (aValue <> FRate) then
  321.    begin
  322.       FRate := MaxR(aValue,0.0);
  323.       Update;
  324.       Change;
  325.    end;
  326. end;
  327. {-- TMMPhaseShift ------------------------------------------------------------}
  328. procedure TMMPhaseShift.Update;
  329. begin
  330.    { setup the phaser with the params }
  331.    if FOpen then
  332.       SetPhaseShift(FPPhase, FDryMix, FWetMix, FFeedBack, FSweep, FDepth, FRate);
  333. end;
  334. {-- TMMPhaseShift ------------------------------------------------------------}
  335. procedure TMMPhaseShift.SetPWaveFormat(aValue: PWaveFormatEx);
  336. begin
  337.    if (aValue <> nil) then
  338.    begin
  339.       if not (csDesigning in ComponentState) then
  340.          if not pcmIsValidFormat(aValue) then
  341.             raise EMMPhaseShiftError.Create(LoadResStr(IDS_INVALIDFORMAT));
  342.    end;
  343.    inherited SetPWaveFormat(aValue);
  344. end;
  345. {-- TMMPhaseShift ------------------------------------------------------------}
  346. procedure TMMPhaseShift.Open;
  347. begin
  348.    if not FOpen then
  349.    begin
  350.       if pcmIsValidFormat(PWaveFormat) then
  351.       begin
  352.          FPPhase := InitPhaseShift(PWaveFormat);
  353.          if (FPPhase = nil) then OutOfMemoryError
  354.          else
  355.          begin
  356.             FOpen := True;
  357.             Update;
  358.          end;
  359.       end;
  360.    end;
  361. end;
  362. {-- TMMPhaseShift ------------------------------------------------------------}
  363. procedure TMMPhaseShift.Close;
  364. begin
  365.    if FOpen then
  366.    begin
  367.       FOpen := False;
  368.       DonePhaseShift(FPPhase);
  369.    end;
  370. end;
  371. {-- TMMPhaseShift ------------------------------------------------------------}
  372. procedure TMMPhaseShift.Process(Buffer: PChar; Length: integer);
  373. begin
  374.    { process the buffer }
  375.    if (FPPhase <> nil) then
  376.        if DoPhaseShift(FPPhase, Buffer, Length) then
  377.           GlobalSynchronize(PcmOverflow);
  378. end;
  379. {-- TMMPhaseShift ------------------------------------------------------------}
  380. procedure TMMPhaseShift.Opened;
  381. begin
  382.    Open;
  383.    inherited Opened;
  384. end;
  385. {-- TMMPhaseShift ------------------------------------------------------------}
  386. procedure TMMPhaseShift.Closed;
  387. begin
  388.    Close;
  389.    inherited Closed;
  390. end;
  391. {-- TMMPhaseShift ------------------------------------------------------------}
  392. procedure TMMPhaseShift.Started;
  393. begin
  394.    Update;
  395.    inherited Started;
  396. end;
  397. {-- TMMPhaseShift ------------------------------------------------------------}
  398. procedure TMMPhaseShift.BufferReady(lpwh: PWaveHdr);
  399. begin
  400.    if Enabled and FOpen then
  401.    begin
  402.       Process(lpwh^.lpData, lpwh^.dwBytesRecorded);
  403.    end;
  404.    inherited BufferReady(lpwh);
  405. end;
  406. {-- TMMPhaseShift ------------------------------------------------------------}
  407. procedure TMMPhaseShift.BufferLoad(lpwh: PWaveHdr; var MoreBuffers: Boolean);
  408. begin
  409.    inherited BufferLoad(lpwh, MoreBuffers);
  410.    if Enabled and FOpen then
  411.    begin
  412.       Process(lpwh^.lpData, lpwh^.dwBytesRecorded);
  413.    end;
  414. end;
  415. end.