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

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 MMWInfo;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29. {$IFDEF WIN32}
  30.     Windows,
  31. {$ELSE}
  32.     WinTypes,
  33.     WinProcs,
  34. {$ENDIF}
  35.     SysUtils,
  36.     Messages,
  37.     Classes,
  38.     Graphics,
  39.     Controls,
  40.     Forms,
  41.     Dialogs,
  42.     StdCtrls,
  43.     ExtCtrls,
  44.     Buttons,
  45.     MMObj,
  46.     MMUtils,
  47.     MMString,
  48.     MMPanel,
  49.     MMWave,
  50.     MMRiff,
  51.     MMDIB,
  52.     MMCstDlg;
  53. type
  54.   {-- TMMRiffInfoEditorDlg ----------------------------------------------------}
  55.   TMMRiffInfoEditorDlg = class(TForm)
  56.     Bevel1: TBevel;
  57.     Label1: TLabel;
  58.     Label3: TLabel;
  59.     Label4: TLabel;
  60.     Label5: TLabel;
  61.     ChunkInfoLabel: TLabel;
  62.     INFOComboBox: TComboBox;
  63.     GroupBox1: TGroupBox;
  64.     InfoTextMemo: TMemo;
  65.     RevertBtn: TButton;
  66.     OKBtn: TButton;
  67.     PictureBtn: TButton;
  68.     Bevel3: TBevel;
  69.     DescriptionEdit: TEdit;
  70.     Label7: TLabel;
  71.     Bevel2: TBevel;
  72.     Label2: TLabel;
  73.     DIBImage: TImage;
  74.     PictureOpenDialog: TMMPictureOpenDialog;
  75.     ClrBtn: TButton;
  76.     procedure FormShow(Sender: TObject);
  77.     procedure FormCreate(Sender: TObject);
  78.     procedure INFOComboBoxChange(Sender: TObject);
  79.     procedure InfoTextMemoExit(Sender: TObject);
  80.     procedure RevertBtnClick(Sender: TObject);
  81.     procedure DescriptionEditExit(Sender: TObject);
  82.     procedure DescriptionEditKeyPress(Sender: TObject; var Key: Char);
  83.     procedure DescriptionEditEnter(Sender: TObject);
  84.     procedure PictureBtnClick(Sender: TObject);
  85.     procedure ClrBtnClick(Sender: TObject);
  86.   private
  87.     lpInfo: PInfoChunk;
  88.     lpDisp: PDispList;
  89.     procedure SetupINFOComboBox(ItemIndex: integer);
  90.     procedure SetupDISP;
  91.     function  InfoChanged: Boolean;
  92.   public
  93.     procedure SetParams(Info: PInfoChunk; Disp: PDispList);
  94.   end;
  95.   {-- TMMRiffInfoEditor -------------------------------------------------------}
  96.   TMMRiffInfoEditor = class(TMMNonVisualComponent)
  97.   protected
  98.     FSource: TObject;
  99.     FTitle: String;
  100.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  101.     procedure GetParams(var Info: PInfoChunk; var Disp: PDispList); virtual; abstract;
  102.   public
  103.     constructor Create(AOwner: TComponent); override;
  104.     function Execute: Boolean; virtual;
  105.   published
  106.     property Title: String read FTitle write FTitle;
  107.   end;
  108.   {-- TMMWaveInfoEditor -------------------------------------------------------}
  109.   TMMWaveInfoEditor = class(TMMRiffInfoEditor)
  110.   private
  111.     function  GetSource: TMMCustomWaveFile;
  112.     procedure SetSource(aSource: TMMCustomWaveFile);
  113.   protected
  114.     procedure GetParams(var Info: PInfoChunk; var Disp: PDispList); override;
  115.   public
  116.     constructor Create(AOwner: TComponent); override;
  117.   published
  118.     property Source: TMMCustomWaveFile read GetSource write SetSource;
  119.   end;
  120. var
  121.   MMRiffInfoEditorDlg: TMMRiffInfoEditorDlg;
  122. implementation
  123. {$R *.DFM}
  124. {== TMMRiffInfoEditorDlg ======================================================}
  125. procedure TMMRiffInfoEditorDlg.SetParams(Info: PInfoChunk; Disp: PDispList);
  126. begin
  127.    if (Info <> lpInfo) then
  128.    begin
  129.       lpInfo := Info;
  130.       SetupINFOComboBox(0);
  131.    end;
  132.    if (Disp <> lpDisp) then
  133.    begin
  134.       lpDisp := Disp;
  135.       SetupDISP;
  136.    end;
  137. end;
  138. {-- TMMRiffInfoEditorDlg ------------------------------------------------------}
  139. procedure TMMRiffInfoEditorDlg.FormCreate(Sender: TObject);
  140. begin
  141.    INFOComboBox.Font.Handle := GetStockObject(ANSI_FIXED_FONT);
  142. end;
  143. {-- TMMRiffInfoEditorDlg ------------------------------------------------------}
  144. procedure TMMRiffInfoEditorDlg.FormShow(Sender: TObject);
  145. begin
  146.    if (lpInfo <> Nil) then
  147.    begin
  148.       SetupINFOComboBox(0);
  149.    end;
  150. end;
  151. {-- TMMRiffInfoEditorDlg ------------------------------------------------------}
  152. procedure TMMRiffInfoEditorDlg.SetupDISP;
  153. var
  154.    pd: PDISP;
  155.    lpDIB: PDIB;
  156.    lpText: PChar;
  157.    BM: HBitmap;
  158.    Pal: HPalette;
  159.    W,H: integer;
  160. begin
  161.    lpDIB := nil;
  162.    lpText := nil;
  163.    if (lpDisp <> nil) then
  164.    begin
  165.       pd := lpDisp^.pHead;
  166.       while pd <> nil do
  167.       begin
  168.          if (pd^.cfid = CF_TEXT) and (lpText = nil) then
  169.          begin
  170.             { list contains Picture }
  171.             if (pd^.lpData <> nil) then lpText := pd^.lpData
  172.             else lpText := pd^.lpChunk;
  173.          end;
  174.          if (pd^.cfid = CF_DIB) and (lpDIB = nil) then
  175.          begin
  176.             { list contains Description }
  177.             if (pd^.lpData <> nil) then
  178.                lpDIB := PDIB(pd^.lpData)
  179.             else if (pd^.wFlags <> CHUNK_MODIFIED) then
  180.                lpDIB := PDIB(pd^.lpChunk);
  181.          end;
  182.          pd := pd^.pNext;
  183.       end;
  184.    end;
  185.    if (lpText <> nil) then
  186.        DescriptionEdit.Text := StrPas(lpText)
  187.    else
  188.        DescriptionEdit.Text := '';
  189.    if (lpDIB <> nil) then
  190.    begin
  191.       ClrBtn.Enabled := True;
  192.       DIB_DIBToBitmap(lpDIB,BM,Pal);
  193.       if (DIB_Width(lpDIB) > DIBImage.Width) or
  194.          (DIB_Height(lpDIB) > DIBImage.Height) then
  195.          DIBImage.Stretch := True
  196.       else
  197.          DIBImage.Stretch := False;
  198.       DIBImage.Picture.Bitmap.Handle := BM;
  199.    end
  200.    else
  201.    begin
  202.       ClrBtn.Enabled := False;
  203.       DIBImage.Stretch := False;
  204.       BM := LoadBitmap(HInstance, 'BMP_WAVE');
  205.       GetBitmapSize(BM,W,H);
  206.       DIBImage.Picture.Bitmap.Width := W;
  207.       DIBImage.Picture.Bitmap.Height := H;
  208.       DIBImage.Picture.Bitmap.Canvas.Brush.Color := Color;
  209.       DIBImage.Picture.Bitmap.Canvas.FillRect(Rect(0,0,W,H));
  210.       DrawTransparentBitmap(DIBImage.Picture.Bitmap.Canvas.Handle,BM,0,0,
  211.                             GetTransparentColor(BM));
  212.       DeleteObject(BM);
  213.    end;
  214. end;
  215. {-- TMMRiffInfoEditorDlg ------------------------------------------------------}
  216. procedure TMMRiffInfoEditorDlg.SetupINFOComboBox(ItemIndex: integer);
  217. Const
  218.    aFormat: PChar = '%-4s%-1s %-25s';
  219. Var
  220.    pi     : PInfoData;
  221.    argList: array[0..5] of PChar;
  222.    aBuf   : array[0..255] of Char;
  223. begin
  224.    if (lpInfo <> Nil) then
  225.    begin
  226.       INFOComboBox.Clear;
  227.       pi := lpInfo^.pHead;
  228.       {$IFDEF WIN32}
  229.       {$IFDEF TRIAL}
  230.       {$DEFINE _HACK1}
  231.       {$I MMHACK.INC}
  232.       {$ENDIF}
  233.       {$ENDIF}
  234.       while (pi <> Nil) do
  235.       begin
  236.          argList[0] := aINFO[pi^.index].pFOURCC;
  237.          if ((pi^.dwINFOOffset<>0) and (PChar(lpInfo^.lpChunk+pI^.dwINFOOffset)^<>#0) and
  238.             ((pi^.lpText=Nil)or(pi^.lpText^<>#0))) or
  239.             ((pi^.lpText<>Nil)and(pi^.lpText^<>#0)) then
  240.             argList[1] := '*'
  241.          else
  242.             argList[1] := ' ';
  243.          argList[2] := aINFO[pi^.index].pShort;
  244.          {$IFDEF WIN32}
  245.  wvsprintf(aBuf, aFormat, @argList);
  246.          {$ELSE}
  247.  wvsprintf(aBuf, aFormat, argList);
  248.          {$ENDIF}
  249.          INFOComboBox.Items.Add(StrPas(aBuf));
  250.  pi := pi^.pnext;
  251.       end;
  252.       INFOComboBox.ItemIndex := ItemIndex;
  253.       INFOComboBoxChange(Self);
  254.    end;
  255. end;
  256. {-- TMMRiffInfoEditorDlg ------------------------------------------------------}
  257. procedure TMMRiffInfoEditorDlg.INFOComboBoxChange(Sender: TObject);
  258. var
  259.    pi: PInfoData;
  260. begin
  261.    if (lpInfo <> Nil) then
  262.    begin
  263.       pi := lpInfo^.pHead;
  264.       while (pi <> Nil) do
  265.       begin
  266.          if (pi^.index = INFOComboBox.ItemIndex) then break;
  267.          pi := pi^.pNext;
  268.       end;
  269.       if (pi <> Nil) then
  270.       begin
  271.          if (pi^.lpText <> Nil) then
  272.             { Modified text }
  273.     InfoTextMemo.Text := StrPas(pi^.lpText)
  274.  else if (pi^.dwINFOOffset > 0) then
  275.       { default text }
  276.       InfoTextMemo.Text := StrPas(lpInfo^.lpChunk+pi^.dwINFOOffset)
  277.          else
  278.       { no text }
  279.       InfoTextMemo.Text := '';
  280.          ChunkInfoLabel.Caption := StrPas(aINFO[INFOComboBox.ItemIndex].pLong);
  281.       end
  282.       else ChunkInfoLabel.Caption := 'Can''t FIND ItemIndex';
  283.    end;
  284. end;
  285. {-- TMMRiffInfoEditorDlg ------------------------------------------------------}
  286. procedure TMMRiffInfoEditorDlg.InfoTextMemoExit(Sender: TObject);
  287. Var
  288.    pi: PInfoData;
  289.    pStr: PChar;
  290. begin
  291.    if (lpInfo <> Nil) then
  292.    begin
  293.       { get text out and give to current id }
  294.       pi := lpInfo^.pHead;
  295.       while (pi <> Nil) do
  296.       begin
  297.          if (pi^.index = INFOComboBox.ItemIndex) then break;
  298.          pi := pi^.pnext;
  299.       end;
  300.       if (pi <> Nil) then
  301.       begin
  302.          pStr := GlobalAllocPtr(GHND, Length(InfoTextMemo.Text)+1);
  303.          if (pStr <> Nil) then
  304.          begin
  305.             {$IFDEF WIN32}
  306.             StrCopy(pStr, PChar(InfoTextMemo.Text));
  307.             {$ELSE}
  308.             StrPCopy(pStr, InfoTextMemo.Text);
  309.             {$ENDIF}
  310.             riffModifyINFO(lpInfo, pi, CHUNK_MODIFIED, 0, pStr);
  311.             SetupINFOComboBox(INFOComboBox.ItemIndex);
  312.          end;
  313.       end
  314.       else ChunkInfoLabel.Caption := 'Can''t FIND ItemIndex';
  315.    end;
  316. end;
  317. {-- TMMRiffInfoEditorDlg ------------------------------------------------------}
  318. procedure TMMRiffInfoEditorDlg.DescriptionEditKeyPress(Sender: TObject;
  319.                                                        var Key: Char);
  320. begin
  321.    if (Key = #13) then DescriptionEditExit(Sender);
  322. end;
  323. {-- TMMRiffInfoEditorDlg ------------------------------------------------------}
  324. procedure TMMRiffInfoEditorDlg.DescriptionEditEnter(Sender: TObject);
  325. begin
  326.    OKBtn.Default := False;
  327. end;
  328. {-- TMMRiffInfoEditorDlg ------------------------------------------------------}
  329. procedure TMMRiffInfoEditorDlg.DescriptionEditExit(Sender: TObject);
  330. var
  331.    pd: PDISP;
  332.    lpText: PChar;
  333. begin
  334.    if (lpDisp <> nil) then
  335.    begin
  336.       pd := lpDisp^.pHead;
  337.       while pd <> nil do
  338.       begin
  339.          if (pd^.cfid = CF_TEXT) then break;
  340.          pd := pd^.pNext;
  341.       end;
  342.       lpText := GlobalAllocMem(Length(DescriptionEdit.Text)+1);
  343.       {$IFDEF WIN32}
  344.       StrCopy(lpText, Pchar(DescriptionEdit.Text));
  345.       {$ELSE}
  346.       StrPCopy(lpText, DescriptionEdit.Text);
  347.       {$ENDIF}
  348.       if (pd <> nil) then
  349.       begin
  350.          RiffModifyDISP(lpDisp, pd, CHUNK_MODIFIED, lpText);
  351.       end
  352.       else if (lpText^ <> #0) then
  353.       begin
  354.          pd := RiffCreateDISP(CHUNK_MODIFIED, CF_TEXT, nil, lpText);
  355.          RiffInsertDISP(lpDisp,pd);
  356.       end;
  357.    end;
  358.    if not DescriptionEdit.Focused then OKBtn.Default := True;
  359. end;
  360. {-- TMMRiffInfoEditorDlg ------------------------------------------------------}
  361. procedure TMMRiffInfoEditorDlg.PictureBtnClick(Sender: TObject);
  362. var
  363.    aPicture: TPicture;
  364.    aBitmap : TBitmap;
  365.    pd      : PDISP;
  366.    lpDIB   : PDIB;
  367. begin
  368.    if PictureOpenDialog.Execute then
  369.    begin
  370.       {$IFDEF WIN32}
  371.       {$IFDEF TRIAL}
  372.       {$DEFINE _HACK1}
  373.       {$I MMHACK.INC}
  374.       {$ENDIF}
  375.       {$ENDIF}
  376.       aPicture := TPicture.Create;
  377.       try
  378.          aPicture.LoadFromFile(PictureOpenDialog.FileName);
  379.          if (lpDisp <> nil) then
  380.          with aPicture do
  381.          begin
  382.             aBitmap := TBitmap.Create;
  383.             try
  384.                if (Graphic is TBitmap) then
  385.                   aBitmap.assign(Bitmap)
  386.                else
  387.                begin
  388.                   aBitmap.Width := aPicture.Width;
  389.                   aBitmap.Height := aPicture.Height;
  390.                   aBitmap.Canvas.Brush.Color := Color;
  391.                   aBitmap.Canvas.FillRect(Rect(0,0,aBitmap.Width,aBitmap.Height));
  392.                   aBitmap.Canvas.Draw(0,0,Graphic);
  393.                end;
  394.                lpDIB := DIB_BitmapToDIB(aBitmap.Handle, aBitmap.Palette, BitsPerPixel, 1);
  395.             finally
  396.                aBitmap.Free;
  397.             end;
  398.             pd := lpDisp^.pHead;
  399.             while pd <> nil do
  400.             begin
  401.                if (pd^.cfid = CF_DIB) then break;
  402.                pd := pd^.pNext;
  403.             end;
  404.             if (pd <> nil) then
  405.             begin
  406.                RiffModifyDISP(lpDisp, pd, CHUNK_MODIFIED, PChar(lpDIB));
  407.             end
  408.             else
  409.             begin
  410.                pd := RiffCreateDISP(CHUNK_MODIFIED, CF_DIB, nil, PChar(lpDIB));
  411.                RiffInsertDISP(lpDisp, pd);
  412.             end;
  413.             SetupDISP;
  414.          end;
  415.       finally
  416.          aPicture.Free;
  417.       end;
  418.    end;
  419. end;
  420. {-- TMMRiffInfoEditorDlg ------------------------------------------------------}
  421. procedure TMMRiffInfoEditorDlg.ClrBtnClick(Sender: TObject);
  422. var
  423.    pd: PDISP;
  424. begin
  425.    if (lpDisp <> nil) then
  426.    begin
  427.       pd := lpDisp^.pHead;
  428.       while (pd <> nil) do
  429.       begin
  430.          if (pd^.cfid = CF_DIB) then break;
  431.          pd := pd^.pNext;
  432.       end;
  433.       if (pd <> nil) then
  434.       begin
  435.          RiffModifyDISP(lpDisp, pd, CHUNK_MODIFIED, nil);
  436.          SetupDISP;
  437.       end;
  438.    end;
  439. end;
  440. {-- TMMRiffInfoEditorDlg ------------------------------------------------------}
  441. procedure TMMRiffInfoEditorDlg.RevertBtnClick(Sender: TObject);
  442. Var
  443.    pi: PInfoData;
  444.    pd: PDISP;
  445. begin
  446.    if (lpDisp <> Nil) then
  447.    begin
  448.       { reset all 'DISP' items to defaults read from file }
  449.       pd := lpDisp^.pHead;
  450.       while (pd <> Nil) do
  451.       begin
  452.          riffModifyDISP(lpDisp, pd, CHUNK_REVERT, Nil);
  453.          pd := pd^.pnext;
  454.       end;
  455.       SetupDISP;
  456.    end;
  457.    if (lpInfo <> Nil) then
  458.    begin
  459.       { reset all 'INFO' items to defaults read from file }
  460.       pi := lpInfo^.pHead;
  461.       while (pi <> Nil) do
  462.       begin
  463.          riffModifyINFO(lpInfo, pi, CHUNK_REVERT, 0, Nil);
  464.          pi := pi^.pnext;
  465.       end;
  466.       SetupINFOComboBox(INFOComboBox.ItemIndex);
  467.    end;
  468. end;
  469. {-- TMMRiffInfoEditorDlg ------------------------------------------------------}
  470. function TMMRiffInfoEditorDlg.InfoChanged: Boolean;
  471. Var
  472.    pi: PInfoData;
  473.    pd: PDISP;
  474. begin
  475.    Result := False;
  476.    if (lpDisp <> Nil) then
  477.    begin
  478.       { go trough all the 'DISP' items and look if modified }
  479.       pd := lpDisp^.pHead;
  480.       while (pd <> Nil) do
  481.       begin
  482.          if (pd^.wFlags = CHUNK_MODIFIED) then
  483.          begin
  484.             { yes modified data, exit }
  485.             Result := True;
  486.             exit;
  487.          end;
  488.          pd := pd^.pnext;
  489.       end;
  490.    end;
  491.    if (lpInfo <> Nil) then
  492.    begin
  493.       { go trough all the 'INFO' items and look if modified }
  494.       pi := lpInfo^.pHead;
  495.       while (pi <> Nil) do
  496.       begin
  497.          if (pi^.wFlags = CHUNK_MODIFIED) then
  498.          begin
  499.             { yes modified text, exit }
  500.             Result := True;
  501.             exit;
  502.          end;
  503.          pi := pi^.pnext;
  504.       end;
  505.    end;
  506. end;
  507. {== TMMRiffInfoEditor =========================================================}
  508. constructor TMMRiffInfoEditor.Create(AOwner: TComponent);
  509. begin
  510.    inherited create(AOwner);
  511.    FTitle := 'Riff-Info Editor';
  512.    FSource := nil;
  513.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  514.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  515. end;
  516. {-- TMMRiffInfoEditor ---------------------------------------------------------}
  517. procedure TMMRiffInfoEditor.Notification(AComponent: TComponent; Operation: TOperation);
  518. begin
  519.    inherited Notification(AComponent, Operation);
  520.    if (Operation = opRemove) and (AComponent = FSource) then
  521.       FSource := Nil;
  522. end;
  523. {-- TMMRiffInfoEditor ---------------------------------------------------------}
  524. function TMMRiffInfoEditor.Execute: Boolean;
  525. var
  526.    Info: PInfoChunk;
  527.    Disp: PDispList;
  528. begin
  529.    { Returns true if OK Button pressed and WaveInfo is changed }
  530.    Result := False;
  531.    if assigned(FSource) then
  532.    begin
  533.       with TMMRiffInfoEditorDlg.Create(Application) do
  534.       try
  535.          Caption := FTitle;
  536.          GetParams(Info,Disp);
  537.          SetParams(Info,Disp);
  538.          Result := (ShowModal = mrOK) and InfoChanged;
  539.       finally
  540.          Free;
  541.       end;
  542.    end;
  543. end;
  544. {== TMMWaveInfoEditor =========================================================}
  545. constructor TMMWaveInfoEditor.Create(AOwner: TComponent);
  546. begin
  547.    inherited Create(AOwner);
  548.    Title := 'Wave-Info Editor';
  549.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  550.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  551. end;
  552. {-- TMMWaveInfoEditor ---------------------------------------------------------}
  553. procedure TMMWaveInfoEditor.GetParams(var Info: PInfoChunk; var Disp: PDispList);
  554. var
  555.    Wave: TMMWave;
  556. begin
  557.    Info := nil;
  558.    Disp := nil;
  559.    if assigned(FSource) and (FSource is TMMCustomWaveFile) then
  560.    begin
  561.       Wave := (FSource as TMMCustomWaveFile).Wave;
  562.       if (Wave <> Nil) and not Wave.Empty then
  563.       begin
  564.          Info := Wave.PWaveIOInfo^.lpInfo;
  565.          Disp := Wave.PWaveIOInfo^.lpDisp;
  566.       end;
  567.    end;
  568. end;
  569. {-- TMMWaveInfoEditor ---------------------------------------------------------}
  570. function TMMWaveInfoEditor.GetSource: TMMCustomWaveFile;
  571. begin
  572.    Result := TMMCustomWaveFile(FSource);
  573. end;
  574. {-- TMMWaveInfoEditor ---------------------------------------------------------}
  575. procedure TMMWaveInfoEditor.SetSource(aSource: TMMCustomWaveFile);
  576. begin
  577.    if Longint(aSource) = Longint(Self) then exit;
  578.    if (aSource is TMMCustomWaveFile) or (aSource = Nil) then
  579.    begin
  580.       if (FSource <> aSource) then
  581.       begin
  582.          FSource := aSource;
  583.       end;
  584.    end;
  585.    {$IFDEF WIN32}
  586.    {$IFDEF TRIAL}
  587.    {$DEFINE _HACK3}
  588.    {$I MMHACK.INC}
  589.    {$ENDIF}
  590.    {$ENDIF}
  591. end;
  592. end.