Zitat von
marabu:
Hallo Emil,
wenn ich mir die Doku zur BASS.DLL anschaue, dann kommt mir der Verdacht, dass du mit deinem byteweisen Zugriff falsche Werte verarbeitest. Wenn du die Samples nicht explizit umschaltest, dann werden 16-bit Integer-Werte (SmallInt) geliefert. Prüfe das doch erstmal.
Freundliche Grüße
Hallo Achim
Ja habe ich schon.
Du darfst nicht von Bass ausgehen
Sondern was du nicht wissen kannst du mußt von Winamp ausgehen
dort werden die Wavedaten als byte übergeben genauso wie in meinen Plugin Wrapper für Winamp Plugins.
Delphi-Quellcode:
TWinAMPVisModule = record
Description : PChar;
hWNDParent : HWND;
hDLLInstance : HINST;
sRate : Integer;
nCh : Integer;
LatencyMs : Integer;
DelayMs : Integer;
SpectrumNch : Integer;
WaveformNch : Integer;
SpectrumData : array[0..1,0..575] of byte;
WaveformData : array[0..1,0..575] of byte;
Config : procedure(This_Mod: PWinAMPVisModule); cdecl;
Init : function(This_Mod: PWinAMPVisModule): Integer; cdecl;
Render : function(This_Mod: PWinAMPVisModule): Integer; cdecl;
Quit : procedure(This_Mod: PWinAMPVisModule); cdecl;
UserData : Pointer;
end;
Deshalb habe ich auch die beiden Datentypen >
Delphi-Quellcode:
TSpectrumData = Array[0..575] Of byte;
PSpectrumData = ^TSpectrumData;
TWaveData = Array[0..575] Of byte;
PWaveData = ^TWaveData;
als byte declariert.
Ich habe das problem das die berechnung des exakten Bogenmaß irgendwie nicht
mit den übergebenen werten von WaveData verglichen werden.
Der effekt für das richtige Pendeln soll über
meterlphi := meterlphi+(lphi - meterlphi)*(dt*10.0);
emuliert werden..
wobei dt
dt := currenttime - lastcurrenttime;
eine art zeitverschiebung bewirken soll abhängig von
Delphi-Quellcode:
function GetTimes: single;
begin
if (StartMilliseconds = 0) then
StartMilliseconds := GetTickCount();
CurrentMilliseconds := GetTickCount();
Result := (CurrentMilliseconds - StartMilliseconds) / 1000.0;
end;
Delphi-Quellcode:
specdata := @This_Mod^.spectrumData[0][0];
wavedata := @This_Mod^.WaveformData[0][0];
lastcurrenttime := currenttime;
currenttime := GetTimes();
danach wird das rendern ausgeführt.
So wie es zur zeit ist funktioniert es zwar aber wie schon gesagt
hat das nichts mit einen VU Meter zu tun.
Das Teil schleicht nur so vor sich hin und reagiert nicht wirklich auf
die übergebenen Sample Daten.
Das originale Plugin 'StarflightAnalyze' (Quelltext habe ich vor Jahren vom Author bekommen(Marc Schneider))
funktioniert einwandfrei und wurde eigentlich auch richtig nach Delphi portiert.
Verstehe nicht das es hier nicht richtig läuft.
gruss Emil