Zitat:
Dass sie das auch wirklich darf, das ist in deinem Verantwortungsbereich.)
Ah ok jetzt weiß ich was ihr meint.
Ich bin nur von meinem Code ausgegangen die Bass.dll hat mich dabei weniger interessiert
Gut das macht die Profis (Informatiker) aus.
Letztendlich habe ich mich nur um meinen Code gekümmert so das dieser Fehlerfrei läuft.
Wie oder ob die Bass.dll das abfängt liegt nicht in meinem ermessen.
Zumindest werden keine
Exception geworfen.
Zitat:
Übrigens: Der Buffer-Overflow schlägt gnadenlos auf das Scanlines-Array zu. Der Code funktioniert nur, wenn man SetLength(Buffer, 256); verwendet.
Habe ich bedacht..
Und ja wird verwendet.
SetLength(Buffer, BUFFER_SIZE);
Zitat:
Würde es nicht mehr Sinn machen, nur die ersten paar Sekunden zu visualisieren und danach on-demand jeweils die nächsten paar Sekunden ab aktueller Abspielposition?
Das mache ich ebenfalls schon nur nicht in diesen Code vom Spectrogram.
Ich möchte nicht zur Laufzeit in Realzeit Rendern sondern erst das komplette Bitmap erstellen deshalb dieses Example.
Also ich möchte erst sehen wie das Spectrogram aussieht und dann mit "LineTo" anzeigen wo man sich gerade an welcher Position im Stream befindet.
Mit einem Loop könnte man dann später einen bestimmten Bereich immer wieder spielen. (Dafür muss ich aber vorher schon sehen wo ich mich befinde)
Realzeit Render, was ich nicht möchte
Delphi-Quellcode:
begin
OffsetX := 2; // normal 256x512
for i := 0 to pred(Height) do
begin
MagLn := round(Sqrt(FFTData[i + 1]) * 3 * Width);
k := Height - i - 1;
x := BuffBMP.ScanLine[k];
if bRTLScroll then
begin
//copy original scanline
Move(x[OffsetX], x[0], (Width - OffsetX));
//draw new pixels
for m := 0 to pred(OffsetX) do
x[Width - OffsetX + m] := MagLn;
end
else
//Left to right
begin
//copy original scanline
Move(x[0], x[OffsetX], (Width - OffsetX));
//draw new pixels
for m := 0 to pred(OffsetX) do
x[m] := MagLn;
end;
end;
end;
Zitat:
Eventuell kannst du noch etwas Performance herausholen, wenn du die Scanlines cached:
Werde ich mir mal genau anschauen.. Danke für den Code
Ich könnte das Bitmap noch verkleinern\zusammenschrumpfen und zusätzlich noch interpolieren
Aber ich möchte jedes Pixel sehen (etwas fürs Auge) und nicht alles zusammenstauchen nur damit es auf dem Bitmap beliebiger länge passt.
Mir ist auch klar das ich nur die ersten 512 Blöcke verwende und diese nicht den gesamten Frequenzbereich zurückgeben.
Deshalb kann ich für 44100 Hz, den Bereich von 22,5 kHz bis 0 (Nyquist-Transformation) nicht anzeigen.
Aber das sind bekannte Probleme.
Wichtiger ist erst mal die Performance (Geschwindigkeit)
Andere frage kann es sein das ScanLine nicht richtig funktioniert
weil das Spectrogram vertikal zeichnet und ScanLine horizontal arbeitet?
gruss