![]() |
Bass.dll in TThread
Hallo allerseits,
ich habe die bass.dll benuzt um einen kleinen mp3-stream player zu bauen. Abspielen funktioniert auch so weit... Nur leider bekomme ich es nicht hin die callbacks der bassdll auf funktionen/proceduren meiner Thread classe zu biegen. Wenn ich jetzt aber den Thread beenden will wenn das lied fertig ist brauche ich doch den callback "BASS_SYNC_END", oder ???
Delphi-Quellcode:
BASS_ChannelSetSync(HSTREAM(chan^), BASS_SYNC_END, 0, @EndSync, 0);
Die Zuweisung zu meiner procedure TPlayThread.EndSync geht nur leider gar nicht. Hier nochmal ein bisschen mehr code...
Delphi-Quellcode:
Weiss irgendjemand wie man das machen könnte???TPlayThread = class(TThread) private _url:string; chan: pointer; public procedure EndSync(buffer: Pointer; len, user: DWORD); stdcall; constructor Create(_chan:pointer; url:string); protected procedure Execute; override; end; implementation constructor TPlayThread.Create(_chan:pointer; url:string); begin inherited Create(false); _url:=url; chan:=_chan; end; procedure TPlayThread.EndSync(buffer: Pointer; len, user: DWORD); stdcall; begin self.terminate; end; procedure TPlayThread.Execute; var icy: PChar; begin BASS_StreamFree(HSTREAM(chan^)); // close old stream progress := 0; HSTREAM(chan^) := BASS_StreamCreateURL(PChar(_url), 0, BASS_STREAM_STATUS, @work, 0); BASS_ChannelSetSync(HSTREAM(chan^), BASS_SYNC_END, 0, @EndSync, 0); ... Gute nacht... |
Re: Bass.dll in TThread
Hallo,
Also ich kenn mich der BASS.dll nicht aus, sorry, aber eins ist mir aufgefallen ... Ich vermisse in deiner EXECUTE funktion die Schleife
Delphi-Quellcode:
While not(Terminated) do
begin ... was der Thread immer wieder tun sollte ... end; ...BASS_SYNC_END ... |
Re: Bass.dll in TThread
Es ist ganz einfach so, das du keine Methoden eines Objektes als Callbacks verwenden kannst, da diese im Speicher anders verwaltet werden als normale Prozeduren/Funktionen.
Verwende stattdessen eine normale Prozedur/Funktion und es funktioniert. :) |
Re: Bass.dll in TThread
self.terminate solltest du tunlichst unterlassen.
Verwende dafür removesync der bass-api Außerdem wird die callback durch Bass_SYNC_END nicht beendet sondern lediglich wie bei dir die function @EndSync aufgerufen wenn der Song beendet wurde. Dort kannst du dann festlegen über 'user' ob du die callback beenden oder den nächsten Titel abspielen willst. Sample
Delphi-Quellcode:
gruss Emil
interface
.... const um_MusicEnd = wm_User + 400; TfrmMain = class(TForm) private EndSync : HSync; procedure MusicEnd(var Msg: TMessage); message um_MusicEnd; end; implementation procedure SyncProc(Handle: HSync; Channel, Data: DWORD; User: DWORD); stdcall; begin case User of 1: begin PostMessage(frmMain.Handle, um_MusicEnd, 0, 0); end; end; end; procedure TfrmMain.btnPlayClick(Sender: TObject); begin EndSync := Bass_ChannelSetSync(Stream, Bass_SYNC_END, 0, @SyncProc, 1); end; procedure TfrmMain.MusicEnd(var Msg: TMessage); begin //hier rein was passieren soll .... end; |
Re: Bass.dll in TThread
Hallo,
erstmal vielen dank für eure Antworten. Habs auch alles hinbekommen. Mein verständnis Problem war das die "callback functions" der BASSdll keine classen funktionen sein dürfen, weshalb man halt mit windows messsages arbeiten muss. Na gut... Viele Grüsse, meriones |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:23 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