Einzelnen Beitrag anzeigen

Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#41

Re: Preview: Audorra - Opensource Audiobibliothek (26.04.09)

  Alt 19. Jun 2009, 22:19
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;
  Mit Zitat antworten Zitat