TUTORIAL ZUM ERSTELLEN EIGENER JoyToAny PLUGINS
Ich versuch euch in diesem kleinen tutorial näher zu bringen, wie ihr eigene Plugins für unser programm JoyToAny erstellen könnt. Als Anhang werd ich euch den Source zur winamp.dll geben und ich werd mich in dem Tutorial als beispiele auch auf selbigen Code als Beispiel beziehen. Falls am Ende des Tutorials irgendwelche Fragen auftreten, schreibt
JayEff oder
Hybrid666 an, wir werden, sofern möglich, alle Fragen diesbezüglich beantworten.
Also fangen wir an.
Zuerst erstellt ihr in Delphi über
File -> New -> Other den DLL Wizard, damit ihr das Grundgerüst für eine DLL Datei erhaltet.
Nun müssen ersteinmal ein paar Info Funktionen erstellt werden, die JoyToAny zwingend benötigt, um alle Funktionen für die Tasten, Achsen und das POV richtig anzeigt.
In der Winamp.dll sieht das folgendermaßen aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function getbuttonfunc():PChar; begin result := PChar('Play|Pause|Stop|Start|Close|ToggleShuffle|ToggleRepeat|NextTrack|PreviousTrack|Volume'); end;
function getaxisfunc():PChar; begin result := PChar('Seek|AxesVolume|SliderVolume'); end;
function getpovfunc():PChar; begin result := PChar(''); end; |
Wie ihr seht, geben diese Funktionen durch Pipes getrennte Commands zurück. Diese Commands müssen dann in der DLL erstellt werden. Wichtig ist, das die Funktionen alle klein geschrieben werden (da ein Funktionsaufruf Case Sensitiv ist).
Nun erstellen wir unsere erste Funktion, und zwar für einen Button, diese hat als Header das Format:
Delphi-Quelltext
1:
| procedure play(state : integer; param:PChar);export; |
dieses Format sollte auch beibehalten werden. Auch hier ist wichtig, das der Funktionsname kleingeschrieben ist.
Nun schreibt, was die Prozedur ausführen soll. Die Play Prozedur sieht bei der Winamp.dll folgendermaßen aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure play(state : integer; param:PChar);export; begin if state = 0 then begin if (getwinamphwnd > 0) then SendMessage(getwinamphwnd,WM_COMMAND,40045,0); end; end; |
Hier sind nun 2 Parameter der Prozedur angegeben.
state enthällt den Buttonstatus, dabei steht:
0 für wurde gedrückt
1 für wurde gehalten
2 für wurde released
Gehalten und released könnt ihr Handhaben wie ihr das braucht. Der status 1 wird z.B. von der Prozedur NextTrack verwendet, seht dazu mehr im Code.
Nun schreiben wir eine Achsenfunktion.
Die sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure seek(pos,max:integer; Changed : Boolean; param:PChar);export; begin if pos > 0 then begin if (getwinamphwnd > 0) then SendMessage(getwinamphwnd,WM_COMMAND,40148,0); end; if pos < 0 then begin if (getwinamphwnd > 0) then SendMessage(getwinamphwnd,WM_COMMAND,40144,0); end; end; |
Hier haben wir die Parameter pos, max, changed und param.
Pos gibt die aktuelle position wieder, welche von -max bis +max gehen kann (0 ist also die Nullstellung der Achse).
Changed ist true oder false, je nachdem, ob es seit dem letzten aufruf geändert wurde, oder nicht (Dies ist wichtig bei z.B. Slidern, welche auch als Achse erkannt werden, seht dazu im Code SliderVolume).
Nun Noch die POV Prozeduren, welche so aussehen (leider existiert keine Beispielfunktion momentan dafür):
Delphi-Quelltext
1:
| procedure mypovproc(Up, Down, Left, Right: Boolean; Param: PChar); |
Die Parameter stehen dabei für die richtungen, die gedrückt sind.
Nun werden die ganzen funktionen noch in export gepackt:
Delphi-Quelltext
1: 2: 3: 4:
| exports play,pause,stop,start,close,toggleshuffle,togglerepeat,nexttrack, previoustrack,slidervolume,volume,seek,axesvolume,getbuttonfunc,getaxisfunc,getpovfunc, info; |
Nun gibt es noch eine optionale funktion. Im JoyToAny Programm habt ihr sicher den Button zum anzeigen der Function Info gesehen. Das wird folgendermaßen in der dll definiert:
Delphi-Quelltext
1:
| procedure info(funct:PChar); |
In der Winamp DLL hab ich das mal so gehandhabt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure info(funct:PChar); begin if (funct = 'play') then ShowMessage('Sends play Command to Winamp' +#13+#10+ 'Parameters:' +#13+#10+ '(none)'); if (funct = 'pause') then ShowMessage('Pauses current track in Winamp' +#13+#10+ 'Parameters:' +#13+#10+ '(none)'); if (funct = 'stop') then ShowMessage('Stops current track in Winamp' +#13+#10+ 'Parameters:' +#13+#10+ '(none)'); if (funct = 'start') then ShowMessage('Runs Winamp' +#13+#10+ 'Parameters:' +#13+#10+ '(none)'); if (funct = 'close') then ShowMessage('Closes Winamp' +#13+#10+ 'Parameters:' +#13+#10+ '(none)'); if (funct = 'toggleshuffle') then ShowMessage('Toggles shuffle state in Winamp' +#13+#10+ 'Parameters:' +#13+#10+ '(none)'); if (funct = 'toggerepeat') then ShowMessage('Toggles repeat state in Winamp' +#13+#10+ 'Parameters:' +#13+#10+ '(none)'); if (funct = 'nexttrack') then ShowMessage('Plays next track of Winamp playlist' +#13+#10+ 'Parameters:' +#13+#10+ '-repeat (on/off) (default = off) (if button is hold, repeat track skipping)'); if (funct = 'previoustrack') then ShowMessage('Plays previous track of Winamp playlist' +#13+#10+ 'Parameters:' +#13+#10+ '-repeat (on/off) (default = off) (if button is hold, repeat track skipping)'); if (funct = 'slidervolume') then ShowMessage('Change Volume via Slider (use with sliders only! Normal Axes will mess this up!' +#13+#10+ 'Parameters:' +#13+#10+ '(none)'); if (funct = 'volume') then ShowMessage('Change Volume via Button' +#13+#10+ 'Parameters:' +#13+#10+ '-up NUM (increases Volume)' +#13+#10+ '-down NUM (decreases Volume)' +#13+#10+ '-repeat (on/off) (If button is hold, repeat volume inc/drecrease) (default = off)'); if (funct = 'seek') then ShowMessage('Seek track by fast forwarding/backwarding' +#13+#10+ 'Parameters:' +#13+#10+ '(none)'); if (funct = 'axesvolume') then ShowMessage('Increase/Decrease volume by Axes' +#13+#10+ 'Parameters:' +#13+#10+ '-value NUM (default = 5)'); end; |
Ein MessageDLG wäre natürlich schöner, aber das sollte so auch reichen

Ihr könnt das handhaben wie ihr denkt. Vergesst aber nicht für die dialoge die richtigen uses reinzumachen, da der Compiler sonst meckern wird *prophezei*
Dann kompiliert ihr die DLL, kopiert sie in das Plugin verzeichniss, und schon ist das plugin ready to use
Es grüßen euch JayEff und Hybrid666, in der hoffnung das viele wundervolle plugins entstehen werden, wenn es gut ist, werden wir, sofern erlaubt, es in den nächsten release von JoyToAny (welcher noch viele Verbesserungen mitbringen wird) reinpacken (natürlich mit Hinweiß auf den urheber! Muhaha)
Zögert nicht, Fragen, Anregungen, Beschimpfungen und sonstiges Hirngewäsch an uns zu schicken.