Nachdem ich gerade noch die DrawTimeLine angepasst und eingebaut habe tut sich mir wieder ein kleines Problem auf, welches ich noch nicht lösen konnte.
Code in der BassPlayer.pas:
Delphi-Quellcode:
procedure TBassPlayer.DrawTimeLine(y: integer; PB: TPaintBox; cl: TColor);
var
sectime: integer;
str:
string;
x: integer;
bpp: DWORD;
begin
bpp := BASS_ChannelGetLength(channel)
div PB.ClientWidth;
// stream bytes per pixel
if (bpp < BASS_ChannelSeconds2Bytes(channel, 0.02))
then // minimum 20ms per pixel (BASS_ChannelGetLevel scans 20ms)
bpp := BASS_ChannelSeconds2Bytes(channel, 0.02);
sectime := round(BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetPosition(Channel)));
x := BASS_ChannelGetPosition(channel)
div bpp;
//format time
str := '
';
if (sectime
mod 60 < 10)
then str := '
0';
str := str + inttostr(sectime
mod 60);
str := inttostr(sectime
div 60) + '
:' + str;
//drawline
PB.Canvas.Pen.Color := cl;
PB.Canvas.MoveTo(x, 0);
PB.Canvas.LineTo(x, PB.ClientHeight);
//drawtext
PB.Canvas.Font.Color := cl;
PB.Canvas.Font.Style := [fsBold];
if x > PB.ClientWidth - 20
then
dec(x, 40);
SetBkMode(PB.Canvas.Handle, TRANSPARENT);
PB.Canvas.TextOut(x + 2, y, str);
PB.Refresh;
end;
Aufrufen tue ich sie momentan im OnTimer Event mit 20ms:
Delphi-Quellcode:
procedure TFMain.Timer1Timer(Sender: TObject);
begin
fBassPlayer.DrawTimeLine(10,PaintBox,clRed);
end;
Nun funktioniert das ganze soweit auch ganz gut, außer das die Time Line extrem flackert. Wenn ich mir hingegen das CustomLoop Beispiel ansehe läuft sie sehr sauber. Der Aufruf erfolgt dort aber auch in einem 20ms Intervall.
Jemand eine Idee woran das liegen kann ? (PaintBox.Parent.DoubleBuffered:= true; habe ich im OnCreate testweise auch gesetzt, brachte aber leider keinen wirklichen Erfolg)
mfg Blamaster