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?