Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bass.dll in TThread (https://www.delphipraxis.net/104238-bass-dll-tthread.html)

Meriones 29. Nov 2007 23:24


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:
 
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);
...
Weiss irgendjemand wie man das machen könnte???

Gute nacht...

peschai 30. Nov 2007 05:49

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

Ghostwalker 30. Nov 2007 06:07

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

EWeiss 30. Nov 2007 08:50

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:
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;
gruss Emil

Meriones 1. Dez 2007 14:48

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 04:53 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