function TfEncode.GetPeak(Channel: DWORD): Float;
var
i, d: Integer;
Peak:Float;
buf: Array[0..50000] of Float;
begin
Peak:= 0;
while (BASS_ChannelIsActive(Channel) <> 0) do begin
d:= BASS_ChannelGetData(Channel, @buf, SizeOf(buf));
d:= d div 4;
for i:= 0 to d-1 do
if (peak < Abs(buf)) then peak:= Abs(buf);
end;
Result:= Peak;
end;
procedure NormalizeDSP(Handle: HDSP; Channel: DWORD; Data: Pointer; Length: DWORD; Peak: DWORD); Stdcall;
var
d: ^Float;
i: Integer;
begin
d := Data;
for i := 0 to (Length div 4) -1 do begin
d^ := d^ / peak;
Inc(d);
end;
end;
...
//This code is for 32-Bit Floating Point:
{ Main - ScanPeak for normalize: }
EnChan:= BASS_StreamCreateFile(False, PChar('temp.mp3'), 0, 0, (BASS_SAMPLE_FLOAT or BASS_STREAM_DECODE));
Peak:= GetPeak(EnChan);
BASS_ChannelSetPosition(EnChan, 0, BASS_POS_BYTE);
Normdsp:= BASS_ChannelSetDSP(EnChan, @NormalizeDSP, Pointer(Peak), 0);
EncHandle:= BASS_Encode_Start(EnChan, PChar(CmdStr), (BASS_ENCODE_FP_32BIT or BASS_ENCODE_AUTOFREE), nil, nil);
BASS_ChannelPlay(EnChan, False);
while BASS_ChannelIsActive(EnChan) <> 0 do begin
Bytes:= BASS_ChannelGetData(EnChan, @Buf, SizeOf(Buf));
Progress.Position:= ((100 * BASS_ChannelGetPosition(EnChan, BASS_POS_BYTE)) div BASS_ChannelGetLength(EnChan, BASS_POS_BYTE));
Application.ProcessMessages;
end;
BASS_ChannelRemoveDSP(EnChan, Normdsp);
BASS_StreamFree(EnChan);
is not work, why ??
Thank
Salvo