hilpers


  hilpers > comp.lang.* > comp.lang.delphi.misc

 #1  
16.09.2005, 16:53
Karl Selb
Hallo zusammen !

Ich will ein Visualisierungs PlugIn für winamp 5.1 schreiben (nur für
mich für testzwecke)
das die Waveform daten beider kanäle auf jeweils einer ProgressBar für
links und rechts anzeigt,
die auf einem kleinen Formular (bsToolWindow) liegen.

Jetzt habe ich aber hier 2 Probleme, an denen ich einfach nicht mehr
weiterkomme :(

1. Wenn ich winamp mit meiner plugin dll starte und dann beende kommt
immer folgende
meldung :

Im Projekt Winamp.exe ist eine Exception der Klasse EOSError aufgetreten.
Meldung : 'Systemfehler. Code 1400. Ungültiges Fensterhandle'. ...

Das formular wird aber korrekt initialisiert, oder habe ich was übersehen ?

2. Die Render Function (laut SDK) wird offenbar garnicht erst ausgeführt.
An den 2 Progressbars tut sich garnichts.
 #2  
17.09.2005, 00:54
Andreas
Hallo.


> 1. Wenn ich winamp mit meiner plugin dll starte und dann beende kommt
> immer folgende
> meldung : [...]


Ich bekomme sogar noch eine, wenn ich WinAmp über Delphi starte,.. da würde
ich mich nicht weiter dran stören.


> 2. Die Render Function (laut SDK) wird offenbar garnicht erst ausgeführt.
> An den 2 Progressbars tut sich garnichts.


Naja, da hast du was falsch gemacht. Das Problem bei deiner Version ist,
dass init nicht nach dem Erzeugen des Forms zurückkehrt, sondern so lange
blockiert, bis Form1 wieder geschlossen wurde.
=> WinAmp meint, dass sie Initialisierung noch nicht abgeschlossen ist und
ruft natürlich dann auch die render Funktion nicht auf.



> ----------winamp.pas------------

(habe den Datentyp der Datenarrays von char nach Shortint bzw. byte
geändert)



> ----------Unit1.pas---------------


> function init(this_mod:PwinampVisModule):Integer;
> begin
> //Form1 initialisieren und anzeigen


> Application.Initialize;
> Application.CreateForm(TForm1,Form1);
> Application.Run;
> hDC:=GetDC(Form1.Handle); //Handle abfragen
> end;


Rückgabe: 0 -> alles OK / 1 -> Feheler
// was willst du mit dem Device-Context-Handle? (den braucht man
normalerweise, wenn man nicht über ein Canvas zeichnen will, sondern die
entsprechenden WinApi Funktionen verwendet.
Hmmmm,.. Application.xxx,.. das geht nicht!!
Application.Run; läuft so lange, wie das Fenster auch existiert -> init
kehrt nicht zurück -> render wird nicht aufgerufen!!!



> function render(this_mod:PwinampVisModule):Integer;
> var
> x,y,aaa,bbb: Integer;
> aa,bb: Char;
> a,b: PByte;
> begin
> Application.ProcessMessages;
>
> a:=@this_mod^.waveformData[0,0];
> b:=@this_mod^.waveformData[1,0];

//verwendest du nicht

> for x:=0 to 287 do //Buffer durchgehen
> begin
> For y:=0 to 575 do begin //Array abfragen
> aa:=this_mod^.waveformData[0,y];
> aaa:=Byte(aa);
> bb:=this_mod^.waveformData[1,y];
> bbb:=Byte(bb);
> end;
>
> //Sichtbar darstellen
> form1.ProgressBar1.Position:=aaa;
> form1.ProgressBar1.Position:=bbb;
>
> end;
>end;


Häää? Was soll das ????
- ProgressBar1 auf aaa und auf bbb gesetzt,.. wird wohl nur bbb anzeigen
- y-Schleife: da kommt für aaa immer this_mod^.waveformData[0,575] raus,
analog für bbb
- X-Schleife: du setzt ProgressBar1 288 mal auf
this_mod^.waveformData[1,575]

=> vermutlich ist das anders geplant.
Und es wird auch nichts bringen, jeden Wert des Buffers mit dem ProgressBar
anzuzeigen!
Je nachdem, was dargestellt werden soll, ist der quadratischer Mittelwert/
Betrags-Maximum /... zu berechnen und anzuzeigen.


(Ich würde auch die ganzen Plugin-Funktionen nicht in das Formular packen,
sondern in die dpr oder ne extra Datei und dem Form eine passende Update
Funktion verpassen, die dann aus der render Funktion aufgerufen wird)

-------------------------------------------------------

Und das ganze könnte wie folgt aussehen:
(Nur die wesentlichen Stellen,.. hab dir aber auch ne Mail geschickt)


//------- Unit1 ------------------

procedure TForm1.updateWaveform(var
waveformData:WaveformDataArray;waveformNch:integer );
var
x,aaa,bbb: Integer;
aa,bb: Shortint ;
begin
paintbox1.Canvas.fillrect(rect(0,0,576,128));
paintbox2.Canvas.fillrect(rect(0,0,576,128));

paintbox1.Canvas.moveto(0,64);
paintbox2.Canvas.moveto(0,64);

paintbox1.canvas.pen.color:=clred;
paintbox2.canvas.pen.color:=clred;

aaa:=0;
bbb:=0;

For x:=0 to 575 do
begin //Array abfragen
aa:=waveformData[0,x];
bb:=waveformData[1,x];

aaa:= max(aaa,abs(aa)); // v1
bbb:= max(bbb,abs(bb)); // v1
// aaa := aaa+ aa*aa ; // v2 // ProgressBar1.max = 128^2
// bbb := bbb+ bb*bb; // v2

paintbox1.Canvas.lineto(x,(128+aa) shr 1); // shr 1 entspricht
Division durch zwei
paintbox2.Canvas.lineto(x,(128+aa) shr 1);
end;

//Sichtbar darstellen
//aaa:=round(aaa/576); // v2
//bbb:=round(bbb/576); // v2
ProgressBar1.Position:=aaa;
ProgressBar2.Position:=bbb;
end;



procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=true;

PostQuitMessage(0); //!!!! (ist ne WinApi Funktion, nichts spezielles
von WinAmp)
// ^^^Damit WinAmp erfährt, dass das Fenster geschlossen wurde
// -> es wird quit aufgerufen, ...
end;



//------------- Project1.dpr ---------------------


function init(this_mod:PwinampVisModule):Integer; cdecl;
begin
application.handle:=this_mod^.hwndParent; // !!!!
Form1:=TForm1.create(nil);
Form1.show;

result:=0;
end;


function render(this_mod:PwinampVisModule):Integer; cdecl;
begin
Form1.updateWaveform(this_mod^.waveformData,this_m od^.waveformNch);
result:=0;
end;



procedure quit(this_mod:PwinampVisModule); cdecl;
begin
application.handle:=0; // !!!!
Form1.free;
//MessageDlg('- Form1.free -',mtInformation,[mbOK],0);
end;



//------------ Winamp.pas ---------------

type

SpectrumDataArray = array[0..1,0..575]of byte;
WaveformDataArray = array[0..1,0..575]of Shortint;

PwinampVisModule =^TwinampVisModule;
TwinampVisModule =
record
// [...]
spectrumData: spectrumDataArray;
waveformData: waveformDataArray;
// [...]



Andreas.
Ähnliche Themen
Plugin für Winamp für MP3 mit 48KHz?

Hi, kennt jemand ein Plugin, mit dem man Winamp beibringen kann, auch mp3-Dateien mit 48KHz abzuspielen? Auch nach längerem Suchen und Googeln bin ich nicht fündig...

Winamp - Plugin für Inernetstream Recording

Hallo zusammen, gibt es für Winamp ein Plugin oder Tool mit dem man den Stream vom Webradio aufnehmen kann? Danke im Voraus, Michael

winamp mit streamripper plugin

hallo Leute, hatte den streamripper erfolgreich als winamp plugin inastalliert jedoch irgendwie weggeklickt. Wenn ich ihn nochmals installiere, ist er bereits vorhanden???...

Winamp Plugin

Hallo zusammen ! Ich will für winamp ein plugin schreiben, nur etwas ganz einfaches, OHNE grafik u.s.w.. nur von dem linken und rechten kanal soll die aussteuerung in 2...


Alle Zeitangaben in WEZ. Es ist jetzt 18:22 Uhr. | Privacy Policy