Guten Abend!
Aufgrund
dieses Threads, ist mir die Idee gekommen, daraus einfach eine Komponente zu machen, weil das die Sache erleichtert.
Hab ja auch in dem Thread schon geschrieben, dass ich das in eine Komponente umwandeln möchte.
In dieser Komponente ist alles Lebensnotwendige, was man braucht, um Winamp zu kontrollieren.
Ich stell dann hier mal eine Funktionsliste auf (24 Funktionen/Prozeduren, 6 Propertys atm)
Alle Funktionen, die einen Integer als Rückgabewert haben, haben versagt (oder Winamp läuft nicht), wenn sie -1 zurück geben.
In jede Prozedur bzw. Funktion ist eine Abfrage eingebaut, ob Winamp auch läuft, wenn nicht geben sie False, '', oder -1 zurück.
Das Winamp-Fenster
Handle wird mit dem Klassennamen 'Winamp v1.x' ermittelt, sollte das Winamp-Fenster eine andere Klasse haben,
wird es nicht erkannt. Allerdings...Wer ruft sein Winamp schon mit anderem Klassennamen auf
Funktionslist:
function Execute(params: String): Integer;
Führt Winamp mit Parametern aus. Der Pfad zur exe wird aus der Registry aus dem HKLU gelesen.
Wird der Wert nicht gefunden, gibt die Funktion ERROR_NOT_FOUND zurück.
Gibts es einen Fehler bei ShellExecute gibt sie ERROR_FAILED zurück. Wenn alles klappt, dann gibt sie 1 zurück.
function GetBitRate: Integer;
Gibt die Bitrate des aktuellen Tracks / Streams zurück.
function GetEQData: TEQData;
Speichert Informationen über den Equalizer in einem Record vom Typ TEQData, der ebenfalls in der Komponente deklariert ist.
Mehr Infos zu TEQData ganz unten am Ende der Funktionsliste.
function GetFileNameByPlaylistPos(pos: Integer): String;
Erwartet einen Integer, der die Position in der Playliste angibt (von 0 beginnend).
Gibt den dazugehörigen Dateinamen bzw die
URL zurück.
function GetPlaybackState: Integer;
Gibt den Playbackstatus zurück:
0 - Angehalten
1 - Spielt
2 - Pause
function GetRootFolder: String;
Ermittelt das Winamp Root Verzeichnis aus der Registry (HKLU).
function GetSampleRate: Integer;
Ermittelt die Samplerate des aktuellen Tracks / Streams.
Z.B 44
function GetPlaylistCount: Integer;
Gibt die Playlisteinträge zurück.
function GetWindowText: String;
Gibt den Fenstertext des Winamp-Fenster wieder, der auch im Taskmanager zu sehen ist.
function IsRunning: Boolean;
Prüft, ob Winamp läuft (Standardklasse 'Winamp v1.x' ist Voraussetzung).
Wird auch intern in jeder Funktion / Prozedur eingesetzt.
function IsStreaming: Boolean;
Prüft, ob ein Stream gespielt wird (wenn nicht, dann wohl eine Datei

)
procedure ClearPlayList;
Leert die aktuelle Playliste.
GetFileNameByPlaylistPos gibt jetzt nur noch leere Strings zurück, da die Playliste leer ist.
procedure Close;
Beendet Winamp auf normalem Wege.
procedure Pause_Resume;
Pausiert, oder spielt weiter, je nachdem.
Weiterspielen funktioniert nicht bei einem gestoppten, nur bei einem pausierten Lied.
procedure RestartWinamp;
Startet Winamp neu, über den Sinn lässt sich streiten
procedure SavePlaylist;
Speichert die aktuelle Playliste in %Winampdir%\Winamp.m3u
%Winampdir% kann durch GetRootFolder ermittelt werden.
procedure SetBalance(pos: Byte);
Je nachdem, wie viel aus der rechten bzw. linken Box kommen soll.
Laut Winamp
SDK 0 - 255 als Wert übergeben.
Musste in einem Test aber bei einer Trackbar "Min" auf -128 und "Max" auf 127 setzen, damit alles geklappt hat.
procedure SetVolume(vol: Byte);
Lautstärke verändern (0 - 255).
procedure StartPlayback;
Wiedergabe starten.
Öffnet den OpenDialog in winamp, wenn die Playliste leer ist.
procedure StopPlayback;
Stoppt die Wiedergabe.
procedure SwapRepeatState;
Wechselt den Repeatstatus, unabhängig vom momentanen Status.
procedure SwapShuffleState;
Wie SwapRepeatState, nur halt mit Shuffle
procedure SwitchTrack(direction: Integer);
Entweder einen Track weiter in der Playlist, oder einen zurück.
direction muss sein:
waPrev: Einen Track zurück
waNext: Einen Track vor
procedure Terminate;
Beendet den Winampprozess.
Propertys:
property Handle //nur lesen
Handle ausgeben.
property PlaylistPos //nur lesen (bald schreiben?)
Playlistindex ausgeben, von 0 beginnend.
property RepeatState //lesen und schreiben
Repeatstatus ausgeben / setzen.
property Shufflestate //lesen und schreiben
Shufflestatus ausgeben / setzen.
property TrackLength //nur lesen
Tracklänge in Sekunden ausgeben. Funktioniert nicht bei Streams.
property TrackPos //lesen und schreiben (nur, wenn kein Stream läuft)
To be continued
So jetzt kommen wir zu
TEQData
Der Record sieht so aus:
Delphi-Quellcode:
{
** Record that obtains the Winamp EQ Data
}
type
TEQData = packed record
Enabled, Autoload,
EQ_60 , EQ_170,
EQ_310 , EQ_600,
EQ_1k , EQ_3k,
EQ_6k , EQ_12k,
EQ_14k , EQ_16k,
Preamp : Integer;
end;
(Ja, ich habe einen komischen Kommentarstil, aber mir hat der aus dem Winamp
SDK so gut gefallen

)
Die Equalizerdaten können in so einem Record gespeichert werden, über Aufruf von GetEQData.
Wenn man sich den Winamp-EQ ansieht, erklären sich alle Werte von selbst.
So. Das wars auch schon
Es wäre SEHR nett, wenn das Ding einer testen würde.
Und noch besser, wenns jemand gebrauchen kann
Ach ja ... Könnt mir wohl mal einer die RegisterComponent-Funktion per PN schicken?
Hab nur die Personal Version

Weil sonst muss ich Classes einbinden, und das macht die Kompo nich grad
nonVCL fähig.
Geht das dann überhaupt?
Bitte keine Diskussionen darüber
Rote Farbe = Neue Version
//Edit: Rechtschreibfehler (immer noch welche da?) / Beispielapp angehängt
//Edit2:
v1.1 - 9 Funktionen durch 5 Propertys ersetzt / Neue Beispielapp
//Edit3: In die Beispielapp hatte sich der Fehlerteufel eingeschlichen
//Edit4:
Neue Version. Die Property PlaylistPos kann jetzt auch gesetzt werden.
Vielen Dank für ihre Aufmerksamkeit...Tschüss
Chuck Norris has counted to infinity ... twice!