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

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: 11.08.98 - 14:40:29 $                                        =}
  24. {========================================================================}
  25. unit MMDSEdtr;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29.     Windows,
  30.     SysUtils,
  31.     Classes,
  32.     Dialogs,
  33.     MMDSETyp,
  34.     MMUtils,
  35.     MMDSMix,
  36.     MMObj;
  37. type
  38.   {-- TMMDSEditor --------------------------------------------------------------}
  39.   TMMDSEditor   = class(TMMNonVisualComponent)
  40.   private
  41.     FObj        : TComponent;
  42.     FBDummy     : Boolean;
  43.     function    GetAvailable: Boolean;
  44.   public
  45.     function    Execute: Boolean;
  46.   published
  47.     property    EditObject: TComponent read FObj write FObj;
  48.     property    Available: Boolean read GetAvailable write FBDummy;
  49.   end;
  50.   EMMDSEditor   = class(Exception);
  51. var
  52.     DSEDCreateScene         : function(var Scene: THandle): Boolean; stdcall = nil;
  53.     DSEDSetMixerParams      : function(Scene: THandle; const Params: TMMDSEDMixerParams): Boolean; stdcall;
  54.     DSEDSetListenerParams   : function(Scene: THandle; const Params: TMMDSEDListenerParams): Boolean; stdcall;
  55.     DSEDGetMixerParams      : function(Scene: THandle; var Params: TMMDSEDMixerParams): Boolean; stdcall;
  56.     DSEDGetListenerParams   : function(Scene: THandle; var Params: TMMDSEDListenerParams): Boolean; stdcall;
  57.     DSEDSetBufferParams     : function(Scene: THandle; Index: Integer; const Params: TMMDSEDBufferParams): Boolean; stdcall;
  58.     DSEDSetSourceParams     : function(Scene: THandle; Index: Integer; const Params: TMMDSEDSourceParams): Boolean; stdcall;
  59.     DSEDGetBufferParams     : function(Scene: THandle; Index: Integer; var Params: TMMDSEDBufferParams): Boolean; stdcall;
  60.     DSEDGetSourceParams     : function(Scene: THandle; Index: Integer; var Params: TMMDSEDSourceParams): Boolean; stdcall;
  61.     DSEDSetSourceWave       : function(Scene: THandle; Index: Integer; const WaveData: TMMDSEDWaveRecord): Boolean; stdcall;
  62.     DSEDSetObjectName       : function(Scene: THandle; Index: Integer; Name: PChar): Boolean; stdcall = nil;
  63.     DSEDSetFocusIndex       : function(Scene: THandle; Index: Integer): Boolean; stdcall = nil;
  64.     DSEDAddSource           : function(Scene: THandle; var Index: Integer): Boolean; stdcall = nil;
  65.     DSEDDestroyScene        : function(Scene: THandle): Boolean; stdcall = nil;
  66.     DSEDEditScene           : function(Scene: THandle; var Modified: Boolean): Boolean; stdcall = nil;
  67.     DSEDGetLastError        : function: Integer; stdcall = nil;
  68.     // User is responsible to keep a copy of returned string
  69.     DSEDGetLastErrorMessage : function: PChar; stdcall = nil;
  70. function DSEDIsAvailable: Boolean;
  71. function EditMixer(Mixer: TMMDSWaveMixer): Boolean;
  72. function EditChannel(Channel: TMMDSMixChannel): Boolean;
  73. implementation
  74. uses
  75. {$IFDEF BUILD_ACTIVEX}
  76.     ActiveX, ComObj, MMTypesX2_TLB, AxCtrlsUtil,
  77. {$ENDIF}
  78.     TypInfo;
  79. const
  80.     DLLName     = 'MMDSEDTR.DLL';
  81. var
  82.     Handle      : THandle = 0;
  83.     Loaded      : Boolean = False;
  84.     ErrorMode   : DWORD;
  85. function DSEDIsAvailable: Boolean;
  86. begin
  87.     Result := Loaded;
  88. end;
  89. procedure DSEDCheck(Result: Boolean);
  90. begin
  91.     if not Result then
  92.         raise EMMDSEditor.Create(DSEDGetLastErrorMessage);
  93. end;
  94. {$IFDEF BUILD_ACTIVEX}
  95.   function BuildChannelList(Mixer: TMMDSWaveMixer): TList;
  96.   var
  97.     ControlX, C: TMMActiveXControl;
  98.     Dispatcher: TMMDispatcher;
  99.     MMControl: IMMControl;
  100.     ControlCP: IConnectionPoint;
  101.     Enum: IEnumConnections;
  102.     ConnectData: TConnectData;
  103.     Fetched: Integer;
  104.     Control: TMMDSMixChannel;
  105.     Index: Integer;
  106.   begin
  107.     Result := TList.Create;
  108.     try
  109.       ControlX := MMActiveXControls.ControlsByDelphiControl[Mixer];
  110.       Dispatcher := MMActiveXControls.DispatcherOfControl(ControlX);
  111.       for Index := Dispatcher.List.Count-1 downto 0 do
  112.       begin
  113.         C := TMMActiveXControl(Dispatcher.List[Index]);
  114.         if (InheritsFromEx(C.Control, TMMDSMixChannel)) and
  115.            (TMMDSMixChannel(C.Control).Mixer = Mixer) then
  116.         begin
  117.           Result.Add(Control);
  118.         end;
  119.       end;
  120.     except
  121.       Result.Clear
  122.     end;
  123.   end;
  124.   {// Newer MMTypesX stuff
  125.   function BuildChannelList(Mixer: TMMDSWaveMixer): TList;
  126.   var
  127.     MMControl: IMMControl;
  128.     Dispatcher: IMMDispatcher;
  129.     ControlCP: IConnectionPoint;
  130.     Enum: IEnumConnections;
  131.     ConnectData: TConnectData;
  132.     Fetched: Integer;
  133.     Control: TMMDSMixChannel;
  134.   begin
  135.     Result := TList.Create;
  136.     try
  137.       MMControl := DelphiControlToAxControl(Mixer);
  138.       if Assigned(MMControl) then
  139.       begin
  140.         MMControl.GetDispatcher(Dispatcher);
  141.         OleCheck((Dispatcher as IConnectionPointContainer).
  142.           FindConnectionPoint(IMMControl, ControlCP));
  143.         OleCheck(ControlCP.EnumConnections(Enum));
  144.         while Enum.Next(1, ConnectData, @Fetched) = S_OK do
  145.         begin
  146.           Control := Pointer((ConnectData.pUnk as IMMControl).DelphiControl);
  147.           ConnectData.pUnk := nil;
  148.           if (InheritsFromEx(Control, TMMDSMixChannel)) and
  149.              (Control.Mixer = Mixer) then
  150.             Result.Add(Control);
  151.         end;
  152.       end;
  153.     except
  154.       Result.Clear
  155.     end;
  156.   end;
  157. }
  158. {$ELSE}
  159.   function BuildChannelList(Mixer: TMMDSWaveMixer): TList;
  160.   var
  161.     i: Integer;
  162.     C: TMMDSMixChannel;
  163.   begin
  164.     Result := TList.Create;
  165.     try
  166.       for i := 0 to Mixer.Owner.ComponentCount - 1 do
  167.         if Mixer.Owner.Components[i] is TMMDSMixChannel then
  168.         begin
  169.           C := Mixer.Owner.Components[i] as TMMDSMixChannel;
  170.           if C.Mixer = Mixer then
  171.             Result.Add(C);
  172.         end;
  173.     except
  174.       Result.Clear
  175.     end;
  176.   end;
  177. {$ENDIF}
  178. function ShowEditor(Obj: TMMDSWaveMixer; Focus: TComponent): Boolean;
  179.     function BuildScene(Mixer: TMMDSWaveMixer): THandle;
  180.     var
  181.         MixP    : TMMDSEDMixerParams;
  182.         ListP   : TMMDSEDListenerParams;
  183.         WavR    : TMMDSEDWaveRecord;
  184.         BufP    : TMMDSEDBufferParams;
  185.         SrcP    : TMMDSEDSourceParams;
  186.         i       : Integer;
  187.         C       : TMMDSMixChannel;
  188.         Index   : Integer;
  189.         List    : TList;
  190.     begin
  191.         MMDSEDRecordFromMixer(Mixer,MixP);
  192.         MMDSEDRecordFromListener(Mixer,ListP);
  193.         try
  194.             DSEDCheck(DSEDCreateScene(Result));
  195.             DSEDCheck(DSEDSetMixerParams(Result,MixP));
  196.             DSEDCheck(DSEDSetListenerParams(Result,ListP));
  197.             DSEDCheck(DSEDSetObjectName(Result,0,PChar(Mixer.Name)));
  198.             List := BuildChannelList(Mixer);
  199.             try
  200.               for i := 0 to List.Count-1 do
  201.               begin
  202.                 C := TMMDSMixChannel(List[i]);
  203.                 MMDSEDRecordFromBuffer(C,BufP);
  204.                 MMDSEDRecordFromSource(C,SrcP);
  205.                 DSEDCheck(DSEDAddSource(Result,Index));
  206.                 DSEDCheck(DSEDSetBufferParams(Result,Index,BufP));
  207.                 DSEDCheck(DSEDSetSourceParams(Result,Index,SrcP));
  208.                 WavR := MMDSEDCreateWaveRecord(C.Wave);
  209.                 try
  210.                     DSEDCheck(DSEDSetSourceWave(Result,Index,WavR));
  211.                 finally
  212.                     MMDSEDFreeWaveRecord(WavR);
  213.                 end;
  214.                 DSEDCheck(DSEDSetObjectName(Result,Index,PChar(C.Name)));
  215.                 if C = Focus then
  216.                     DSEDCheck(DSEDSetFocusIndex(Result,Index));
  217.               end;
  218.             finally
  219.               List.Free
  220.             end;
  221.         except
  222.             DSEDDestroyScene(Result);
  223.             raise;
  224.         end;
  225.     end;
  226.     function EditScene(Scene: THandle): Boolean;
  227.     begin
  228.         DSEDCheck(DSEDEditScene(Scene, Result));
  229.     end;
  230.     procedure DestroyScene(Scene: THandle);
  231.     begin
  232.         DSEDCheck(DSEDDestroyScene(Scene));
  233.     end;
  234.     procedure CollectParams(Scene: THandle; Mixer: TMMDSWaveMixer);
  235.     var
  236.       ListP   : TMMDSEDListenerParams;
  237.       SrcP    : TMMDSEDSourceParams;
  238.       i       : Integer;
  239.       C       : TMMDSMixChannel;
  240.       Index   : Integer;
  241.       List    : TList;
  242.     begin
  243.       DSEDCheck(DSEDGetListenerParams(Scene,ListP));
  244.       MMDSEDListenerFromRecord(Mixer,ListP);
  245.       Index := 1;
  246.       List := BuildChannelList(Mixer);
  247.       try
  248.         for i := 0 to List.Count-1 do
  249.         begin
  250.           C := TMMDSMixChannel(List[i]);
  251.           DSEDCheck(DSEDGetSourceParams(Scene,Index,SrcP));
  252.           Inc(Index);
  253.           MMDSEDSourceFromRecord(C, SrcP);
  254.         end;
  255.       finally
  256.         List.Free
  257.       end;
  258.     end;
  259. var
  260.    Scene: THandle;
  261. begin
  262.     Scene := BuildScene(Obj);
  263.     try
  264.         Result := EditScene(Scene);
  265.         if Result then
  266.             CollectParams(Scene,Obj);
  267.     finally
  268.         DestroyScene(Scene);
  269.     end;
  270. end;
  271. function EditMixer(Mixer: TMMDSWaveMixer): Boolean;
  272. begin
  273.    Result := ShowEditor(Mixer,Mixer);
  274. end;
  275. function EditChannel(Channel: TMMDSMixChannel): Boolean;
  276. begin
  277.    if Channel.Mixer <> nil then
  278.       Result := ShowEditor(Channel.Mixer,Channel)
  279.    else
  280.       raise EMMDSEditor.Create('Channel should be connected to mixer');
  281. end;
  282. {== TMMDSEditor ==============================================================}
  283. function TMMDSEditor.GetAvailable: Boolean;
  284. begin
  285.     Result := DSEDIsAvailable;
  286. end;
  287. {-- TMMDSEditor --------------------------------------------------------------}
  288. function TMMDSEditor.Execute: Boolean;
  289. begin
  290.     Result := False;
  291.     if FObj = nil then
  292.         Exit;
  293.     if not Available then
  294.         { TODO: string to resource }
  295.         raise EMMDSEditor.Create('MMDSEdtr.DLL not loaded');
  296.     if InheritsFromEx(FObj, TMMDSWaveMixer) then
  297.        Result := EditMixer(TMMDSWaveMixer(FObj))
  298.     else
  299.        Result := EditChannel(TMMDSMixChannel(FObj));
  300. end;
  301. function GetAddress(Proc: PChar): TFarProc;
  302. begin
  303.     Result := GetProcAddress(Handle,Proc);
  304.     if Result = nil then
  305.         Loaded := False;
  306. end;
  307. initialization
  308.     ErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
  309.     try
  310.         Handle := LoadLibrary(DLLName);
  311.         if Handle <> 0 then
  312.         begin
  313.             @DSEDCreateScene            := GetAddress('DSEDCreateScene');
  314.             @DSEDSetMixerParams         := GetAddress('DSEDSetMixerParams');
  315.             @DSEDSetListenerParams      := GetAddress('DSEDSetListenerParams');
  316.             @DSEDGetMixerParams         := GetAddress('DSEDGetMixerParams');
  317.             @DSEDGetListenerParams      := GetAddress('DSEDGetListenerParams');
  318.             @DSEDSetBufferParams        := GetAddress('DSEDSetBufferParams');
  319.             @DSEDSetSourceParams        := GetAddress('DSEDSetSourceParams');
  320.             @DSEDGetBufferParams        := GetAddress('DSEDGetBufferParams');
  321.             @DSEDGetSourceParams        := GetAddress('DSEDGetSourceParams');
  322.             @DSEDSetSourceWave          := GetAddress('DSEDSetSourceWave');
  323.             @DSEDSetObjectName          := GetAddress('DSEDSetObjectName');
  324.             @DSEDSetFocusIndex          := GetAddress('DSEDSetFocusIndex');
  325.             @DSEDAddSource              := GetAddress('DSEDAddSource');
  326.             @DSEDDestroyScene           := GetAddress('DSEDDestroyScene');
  327.             @DSEDEditScene              := GetAddress('DSEDEditScene');
  328.             @DSEDGetLastError           := GetAddress('DSEDGetLastError');
  329.             @DSEDGetLastErrorMessage    := GetAddress('DSEDGetLastErrorMessage');
  330.             Loaded := True;
  331.         end;
  332.     finally
  333.         SetErrorMode(ErrorMode);
  334.     end;
  335. finalization
  336.     if Handle <> 0 then FreeLibrary(Handle);
  337. end.