AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bass.dll in TThread

Ein Thema von Meriones · begonnen am 29. Nov 2007 · letzter Beitrag vom 1. Dez 2007
Antwort Antwort
Meriones

Registriert seit: 25. Feb 2007
33 Beiträge
 
#1

Bass.dll in TThread

  Alt 29. Nov 2007, 23:24
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 ???

    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...
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#2

Re: Bass.dll in TThread

  Alt 30. Nov 2007, 05:49
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 ...
Peter Schaible
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Bass.dll in TThread

  Alt 30. Nov 2007, 06:07
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.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

Re: Bass.dll in TThread

  Alt 30. Nov 2007, 08:50
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
  Mit Zitat antworten Zitat
Meriones

Registriert seit: 25. Feb 2007
33 Beiträge
 
#5

Re: Bass.dll in TThread

  Alt 1. Dez 2007, 14:48
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:21 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