![]() |
[BASS DLL] Callbackfunktion darf kein Methodenzeiger sein?
Hi ihr,
ich habe gerade folgendes Problem, an dem ich nicht weiter komme: Ich möchte mit der BASS.DLL innerhalb einer Klasse einen Internetstream wiedergeben. Über die ChannelSetSync-Funktion der BASS.DLL möchte ich bei neuen Meta-Daten die Anzeige aktualisieren lassen. Dafür brauche ich einen Callback-Funktion. Die Deklaration dieser Funktion habe ich aus dem Delphi-Beispiel entnommen, das bei der BASS-Lib mitgeliefert wird. Die Funktion InternetStreamMeta hat als Aufrufkonvention "stdcall;" bekommen, so wie es das Beispiel auch macht. Hier mein Code: Internet-Stream abspielen
Delphi-Quellcode:
Callback-Funktion für Metadaten
procedure TMediaClass.RunInternetStream(StreamURL: String);
begin if StreamURL <> '' then begin if fCurrentStream <> 0 then BASS_StreamFree(fCurrentStream); fCurrentStream := BASS_StreamCreateURL(PChar(StreamURL), 0, BASS_STREAM_BLOCK or BASS_STREAM_AUTOFREE, nil, nil); BASS_ChannelSetSync(fCurrentStream, BASS_SYNC_META, 0, @TMediaClass.InternetStreamMeta, nil); Play; end; end;
Delphi-Quellcode:
Kommt es nun zum Wechsel der MetaDaten, erscheint folgende, für mich überaus hilfreiche Meldung:
procedure TMediaClass.DoMeta;
var p: Integer; meta: PChar; begin meta := BASS_ChannelGetTags(fCurrentStream, BASS_TAG_META); if (meta <> nil) then begin p := Pos('StreamTitle=', meta); if (p = 0) then Exit; p := p + 13; fCurrentMediaItem.Title := String(Pchar(Copy(meta, p, Pos(';', meta) - p - 1))); end; end; procedure TMediaClass.InternetStreamMeta(handle: HSYNC; channel, data, user: DWORD); stdcall; begin DoMeta; end; Zitat:
Delphi-Quellcode:
Springe ich mit F8 weiter, lande ich wieder an dieser Stelle.
meta := BASS_ChannelGetTags(fCurrentStream, BASS_TAG_META);
Hat jemand Erfahrung damit, oder sieht, was ich hier falsch mache? |
Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei
Ein Methodenzeiger hat den versteckten "Self"-Parameter, eine reguläre Prozedur ja nicht. Da wird das Problem wohl liegen... versuche ggf. eine Klassenmethode...
|
Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei
Dieser User-Parameter sieht verdächtig danach aus, als könne er im Aufruf von BASS_ChannelSetSync angegeben werden. Zeig doch bitte mal die Deklaration dieser Funktion.
|
Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei
Hmm... Aber wie setze ich dann die Variable fCurrentMediaItem.Title ? Weil, darauf zugreifen kann ich dann ja nicht mehr, und dann könnte ich auch ne "normale" Prozedur nutzen... :gruebel:
@Appolonius: Meintest du mit "diese" die SetSync-Funktion?
Delphi-Quellcode:
var BASS_ChannelSetSync:function(handle: DWORD; type_: DWORD; param: QWORD; proc: SYNCPROC; user: Pointer): HSYNC; stdcall;
|
Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei
wie schon gesagt, der CallBack ist eine Prozedur und keine Methode!
du könntest den User-Parameter dafür benutzen, um die Klassenreferenz zu übergeben ... für sowas ist dieser schließlich da :zwinker: etwa so:
Delphi-Quellcode:
BASS_ChannelSetSync(fCurrentStream, BASS_SYNC_META, 0, InternetStreamMeta, Pointer(Self));
procedure InternetStreamMeta(handle: HSYNC; channel, data, user: DWORD); stdcall; begin TMediaClass(user).DoMeta; end; [edit] @Apollonius: nöö, meine :tongue: |
Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei
Nein, ich meinte BASS_ChannelSetSync. Mittlerweile hat sich mein Verdacht aber bestätigt. Du kannst im letzten Parameter von BASS_ChannelSetSync nämlich Pointer(Self) angeben. Das landet dann im User-Parameter deiner Callback-Routine, sodass du dort zurück nach TMediaClass casten kannst und dein Self erhältst.
Himitsu, das war meiner! :mrgreen: |
Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei
Zitat:
Zitat:
Das ich da nicht von selbst drauf gekommen bin. Und ich Depp hab mich noch gefragt, wann man diesen User-Parameter wohl brauchen könnte. Argh... :wall: Danke euch. ;) |
Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei
Wer lesen kann, ist klar im Vorteil. 8) Dass du das auch dynamisch linken musst...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz