Hallo Listers,
Ersteinmal vielen herzlichen Dank für die vielen Tips und Hinweise.
Hier jetzt nochmal, als Zusammenfassung, das setzen eines SyncPoints via Message, für alle, die's gebrauchen können.
1. Das Init der BASS.DLL kann so bleiben, wie man es kennt:
if (not BASS_Init(1, 44100, 0, Application.handle, nil)) then
Hat den Vorteil das auf jedenfall alle Messages, die die BASS.DLL ggf. verschickt, auch bei der Application ankommen.
2. brauchen wir die Message die generiert wird, wenn das Ende eines Titels erreicht ist:
Delphi-Quellcode:
const
WM_BASS_EOF = WM_User + 1;
3. Das setzen des Sync-Handles:
Delphi-Quellcode:
// hs ist der Handle (HSYNC) für die Sync-Prozedur, um ihn ,ggf.
// wieder entfernen zu können.
// sh ein Channel
hs := BASS_ChannelSetSync(sh, BASS_SYNC_END
or BASS_Sync_Message, 0, SyncProc(WM_BASS_EOF), 0);
Den TypeCast schlagen übrigens auch die Entwickler im Forum von Un4Seen vor. Also anstatt der Prozedur-Adresse wird hier die Message selbst übergeben die gesendet werden soll, wenn das Ende erreicht ist.
4. und zu guter letzt, braucht es noch den Message-Handler. Ich habe das mit einem TApplicationEvents-Objekt gelöst, einfach auf die Hauptform platzieren, doppelklick auf OnMessage und dann sieht's so aus:
Delphi-Quellcode:
procedure THauptFormular.AppEventsMessage(var Msg: tagMSG;
var Handled: Boolean);
begin
If Msg.Message = WM_BASS_EOF then
begin
// mach was, denn das Ende des Titels ist jetzt erreicht.
end;
end;
Das ganze funktioniert hier wirklich ganz brav!
Viele herzliche Grüße
Marco