AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi [BASS DLL] Callbackfunktion darf kein Methodenzeiger sein?

[BASS DLL] Callbackfunktion darf kein Methodenzeiger sein?

Ein Thema von Mithrandir · begonnen am 20. Okt 2009 · letzter Beitrag vom 20. Okt 2009
Antwort Antwort
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#1

[BASS DLL] Callbackfunktion darf kein Methodenzeiger sein?

  Alt 20. Okt 2009, 16:44
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:
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;
Callback-Funktion für Metadaten
Delphi-Quellcode:
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;
Kommt es nun zum Wechsel der MetaDaten, erscheint folgende, für mich überaus hilfreiche Meldung:

Zitat:
---------------------------
Benachrichtigung über Debugger-Problem
---------------------------
In Projekt C:\Users\Daniel\Documents\Borland Studio-Projekte\SmallTune\bin\smalltune.exe trat ein Problem mit folgender Meldung auf: 'access violation at 0x0040e466: read of address 0xd0000012'. Prozess angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK
---------------------------
Danach hängt das Programm in dieser Zeile fest:

meta := BASS_ChannelGetTags(fCurrentStream, BASS_TAG_META); Springe ich mit F8 weiter, lande ich wieder an dieser Stelle.

Hat jemand Erfahrung damit, oder sieht, was ich hier falsch mache?
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei

  Alt 20. Okt 2009, 16:50
Ein Methodenzeiger hat den versteckten "Self"-Parameter, eine reguläre Prozedur ja nicht. Da wird das Problem wohl liegen... versuche ggf. eine Klassenmethode...
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei

  Alt 20. Okt 2009, 16:58
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#4

Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei

  Alt 20. Okt 2009, 17:01
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...

@Appolonius:

Meintest du mit "diese" die SetSync-Funktion?

var BASS_ChannelSetSync:function(handle: DWORD; type_: DWORD; param: QWORD; proc: SYNCPROC; user: Pointer): HSYNC; stdcall;
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.497 Beiträge
 
Delphi 12 Athens
 
#5

Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei

  Alt 20. Okt 2009, 17:06
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

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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei

  Alt 20. Okt 2009, 17:07
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!
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#7

Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei

  Alt 20. Okt 2009, 17:10
Zitat von Daniel G:
Meintest du mit "diese" die SetSync-Funktion?
var BASS_ChannelSetSync:function(handle: DWORD; type_: DWORD; param: QWORD; proc: SYNCPROC; user: Pointer): HSYNC; stdcall;
Zitat von Apollonius:
Nein, ich meinte BASS_ChannelSetSync.


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...

Danke euch.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: [BASS DLL] Callbackfunktion darf kein Methodenzeiger sei

  Alt 20. Okt 2009, 17:20
Wer lesen kann, ist klar im Vorteil. 8) Dass du das auch dynamisch linken musst...
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz