⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmplgdsp.pas

📁 一套及时通讯的原码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
                     Header      := Hdr;
                     GetModule   := Header^.GetModule;
                     NumModules  := 0;
                     repeat
                        Module := GetModule(NumModules);
                        if (Module <> nil) then
                        begin
                           if Ver2 then
                           begin
                              PPlugInDSPModule2(Module).HWNDParent   := ParentWindow;
                              PPlugInDSPModule2(Module).hDLLInstance := PlugIn.DLLInstance;
                              Modules[NumModules].ModuleData2 := Module;
                           end
                           else
                           begin
                              PPlugInDSPModule(Module).HWNDParent   := ParentWindow;
                              PPlugInDSPModule(Module).hDLLInstance := PlugIn.DLLInstance;
                              Modules[NumModules].ModuleData := Module;
                           end;
                           Modules[NumModules].Active     := False;
                           inc(NumModules);
                        end;
                     until (Module = nil) or (NumModules = 100);
                  end;
                  PlugIn.Open := True;
               end;
            end;

         finally
            if not PlugIn.Open then
            begin
               FreeLibrary(PlugIn.DLLInstance);
               PlugIn.DLLInstance := 0;
            end;
         end;
      end;
   end;
   Result := (PlugIn <> nil) and PlugIn.Open;
end;

{==============================================================================}
procedure ClosePlugInDSP(PlugIn: PPlugInDSP);
var
   i: integer;

begin
   try
      if (PlugIn <> nil) and PlugIn.Open then
      with PlugIn^ do
      begin
         for i := 0 to NumModules-1 do
         begin
            QuitPlugInDSPModule(Modules[i]);
            Modules[i].ModuleData := nil;
            Modules[i].ModuleData2:= nil;
         end;
         Header := nil;
         PlugIn.Open := False;

         if (DLLInstance <> 0) then
         begin
            FreeLibrary(DLLInstance);
            DLLInstance := 0;
         end;
      end;
   except
      // no exception please !!!
   end;
end;

{==============================================================================}
procedure FreePlugInDSP(var PlugIn: PPlugInDSP);
begin
   try
      if (PlugIn <> nil) then
      begin
         ClosePlugInDSP(PlugIn);
         Dispose(PlugIn);
         PlugIn := nil;
      end;
   except
      // no exception please !!!
   end;
end;

{==============================================================================}
procedure ConfigPlugInDSPModule(Module: TDSPModule);
begin
   try
      if (Module.ModuleData <> nil) then
      begin
         if assigned(Module.ModuleData.Config) then
            Module.ModuleData.Config(Module.ModuleData);
      end
      else if (Module.ModuleData2 <> nil) then
      begin
         if assigned(Module.ModuleData2.Config) then
            Module.ModuleData2.Config(Module.ModuleData2);
      end;
   except
      // no exception please !!!
   end;
end;

{==============================================================================}
function InitPlugInDSPModule(var Module: TDSPModule; pwfx: PWaveFormatEx; BytesPerBlock: Longint): Boolean;
begin
   try
      if not Module.Active and (BytesPerBlock > 0) then
      begin
         if (Module.ModuleData <> nil) then
         begin
            with Module do
            begin
               if (pwfx = nil) then
               begin
                  ModuleData.sRate     := 22050;
                  ModuleData.nCh       := 1;
               end
               else
               begin
                  ModuleData.sRate     := pwfx.nSamplesPerSec;
                  ModuleData.nCh       := pwfx^.nChannels;
               end;
               ModuleData.BlockSize := BytesPerBlock div (2*ModuleData.nCh);
               if assigned(Module.ModuleData.Init) then
                  Active := Module.ModuleData.Init(Module.ModuleData) = 0;
            end;
         end
         else if (Module.ModuleData2 <> nil) then
         begin
            with Module do
            begin
               if assigned(Module.ModuleData2.Init) then
               begin
                  Active := Module.ModuleData2.Init(Module.ModuleData2) = 0;
               end;
            end;
         end;
      end;
      Result := Module.Active;
   except
      Result := False;
      // no exception please !!!
   end;
end;

{==============================================================================}
function RestartPlugInDSPModule(var Module: TDSPModule; pwfx: PWaveFormatEx; BytesPerBlock: Longint): Boolean;
begin
   try
      Result := False;
      if Module.Active and (BytesPerBlock > 0) then
      begin
         if (Module.ModuleData <> nil) then
         begin
            with Module do
            begin
               if (pwfx = nil) then
               begin
                  ModuleData.sRate     := 22050;
                  ModuleData.nCh       := 1;
               end
               else
               begin
                  ModuleData.sRate     := pwfx.nSamplesPerSec;
                  ModuleData.nCh       := pwfx^.nChannels;
               end;
               ModuleData.BlockSize := BytesPerBlock div (2*ModuleData.nCh);
               if assigned(Module.ModuleData.Restart) then
                  Result := Module.ModuleData.Restart(Module.ModuleData) = 0
               else
                  Result := True;
            end;
         end
         else if (Module.ModuleData2 <> nil) then
         begin
            // TODO: ???
            Result := True;
         end;
      end;
   except
      Result := False;
      // no exception please !!!
   end;
end;

{==============================================================================}
function ModifySamplesPlugInDSP(var Module: TDSPModule; Buffer: PSmallint; nBytes: Longint; pwfx: PWaveFormatEx): Longint;
var
   bytesPS: integer;
begin
   Result := 0;
   try
      bytesPS := (pwfx.wBitsPerSample div 8)*pwfx.nChannels;

      if (Module.ModuleData <> nil) then
      begin
         if Module.Active and assigned(Module.ModuleData.ModifySamples) then
         begin
            Module.ModuleData.ModifySamples(Module.ModuleData, Pointer(Buffer));
            Result := nBytes;
         end;
      end
      else if (Module.ModuleData2 <> nil) then
      begin
         if Module.Active and assigned(Module.ModuleData2.ModifySamples) then
         begin
            with pwfx^ do
            Result := Module.ModuleData2.ModifySamples(Module.ModuleData2, Pointer(Buffer),nBytes div bytesPS,wBitsPerSample,nChannels,nSamplesPerSec)*bytesPS;
         end;
      end
   except
      // no exception please !!!
   end;
end;

{==============================================================================}
procedure QuitPlugInDSPModule(var Module: TDSPModule);
begin
   try
      if (Module.ModuleData <> nil) then
      begin
         if Module.Active and assigned(Module.ModuleData.Quit) then
            Module.ModuleData.Quit(Module.ModuleData);
      end
      else if (Module.ModuleData2 <> nil) then
      begin
         if Module.Active and assigned(Module.ModuleData2.Quit) then
            Module.ModuleData2.Quit(Module.ModuleData2);
      end;
      Module.Active := False;
   except
      // no exception please !!!
   end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -