Einzelnen Beitrag anzeigen

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