📄 mmplgdsp.pas
字号:
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 + -