
Zitat von
igel457:
Bekannte "Bugs":
- Memoryleaks in Acinerella (werden beim Beenden angezeigt)
Ich hab mich gerade mal ein bissl im Code umgeschaut.
Der MemLeak entsteht in der
Unit "TAuDecoderThread".
Um genau zu sein:
In der Execute-Prozedur der TAuDecoderThread-Klasse.
Dort gibst du den neu allozierten Speicher nur bei einer
Exception frei.
Hier die korrigierte Execute-Methode:
Delphi-Quellcode:
procedure TAuDecoderThread.Execute;
var
pckt: TAuPacket;
FMem: PByte;
smpls, bfsize: Integer;
begin
FMem := nil;
FLastFrame := false;
try
while not Terminated do
begin
//Check whether the target buffer is filled
if (FBuffer.Filled < FBufSize) then
begin
//Tell the decoder to go on decoding
case FDecoder.Decode of
audsHasFrame:
begin
//Get the packet from the decoder
FDecoder.GetPacket(pckt);
//Recode the buffer to float values
smpls := pckt.BufferSize div Integer(AuBytesPerSample(FDecoder.Info));
bfsize := Integer(AuBytesPerSample(FDecoder.Info.Parameters)) * smpls;
ReallocMem(FMem, bfsize);
AuPCMIntToFloat(FDecoder.Info, pckt.Buffer, FMem, smpls);
//Write the packet content into the buffer
FCritSect.Enter;
try
FBuffer.Write(FMem, bfsize, pckt.Timecode);
finally
FCritSect.Leave;
end;
end;
//Terminate the thread if the decoder is at the end
audsEnd:
FLastFrame := true;
end;
if FLastFrame then
Sleep(1);
end else
Sleep(1);
end;
finally // In einen finally-Block umgewandelt ;)
if FMem <> nil then
FreeMem(FMem);
end;
end;