![]() |
synchronisation via message und bass?
Hallo Listers,
ich möchte mittels BASS_ChannelSetSync am Ende enes Titels eine Message versenden. Ich kriegs blos nicht kompiliert. Was mache ich falsch? Hiiiilfe! ;-) Hier mein Code:
Delphi-Quellcode:
und genau hier knallt's, logischerweise, weil BASS_WM_EOF und SYNCPROC nicht zueinander passen. Aber wie löse ich das?
// die Message-Deklaration
const WM_BASS_EOF = WM_User + 1; // die Message wird in der WNDPROC der Application abgefangen. // der Einbau: // (sh ist mein Channel, und hs der hsync): hs := BASS_ChannelSetSync(sh, BASS_SYNC_END or BASS_SYNC_MESSAGE, 0, WM_BASS_EOF, 0); Viele Grüße Marco |
Re: synchronisation via message und bass?
Bitte mal mehr Code zeigen, insbesondere die WndProc und SendMessage Passagen.
VG arno |
Re: synchronisation via message und bass?
Huhu Arnold,
Zitat:
Aber die WNDPROC kanns'de sehen: ;-)
Delphi-Quellcode:
Aber hier liegt halt net der Fehler!
procedure THauptFormular.WndProc(var Msg: TMessage);
begin *If Message.Msg = WM_BASS_EOF then begin Playlist.Selected := Items[Playlist.Selected.Index+1]; Player_AbspielenClick (self) end; inherited; end; Viele herzliche Grüße Marco |
Re: synchronisation via message und bass?
Zitat:
|
Re: synchronisation via message und bass?
Wusste gar nicht, dass die bass.dll jetzt auch Messages verschickt. Bin aber in Sachen Bass schon länger nicht mehr auf dem Laufenden.
Ich würde es heute so machen:
Delphi-Quellcode:
VG
procedure TForm1.Button1Click(Sender: TObject);
begin hs := BASS_ChannelSetSync(sh, BASS_SYNC_END, 0, CallbackChannelSync, Cardinal(self)); end; procedure CallbackChannelSync(handle: HSYNC; channel, data, user: DWORD); stdcall; var Form1: TForm1; begin Form1 := TForm1(user); Form1.SendMessage(Form1.Handle,WM_BASS_EOF,0); end; Arno |
Re: synchronisation via message und bass?
Huhu Arnold und Liste,
Zitat:
Vielen Dank für den Tip. Der Typecast war der Hinweis. Wenn man nämlich schlicht und einfach anstatt der Procedureadresse die Message als TypeCast übergibt, dann klappts. Also:
Delphi-Quellcode:
Man muß nur darauf achten, beim init der bass.dll nicht application.handle, sondern den hanle der Form zu übergeben.
* * hs := BASS_ChannelSetSync(sh, BASS_SYNC_END or BASS_SYNC_MESSAGE, 0, SYNCPROC(WM_BASS_EOF), 0);
Eine Frage noch, die hier nicht ganz hingehört: wenn ich doch application.handle übergebe, wo kann ich dann die Message abfangen, die ja dann an die Application, nicht ans Formular geschickt wird? Viele Grüße Marco |
Re: synchronisation via message und bass?
Zitat:
Werde ich demnächst mal probieren; das wäre ab und an eine ziemliche Erleichterung/Vereinfachung. |
Re: synchronisation via message und bass?
Zitat:
Delphi-Quellcode:
So in etwa !
unit Unit1;
interface uses .... Const um_MusicEnd = wm_User + 400; type TfrmMain = class(TForm) .... private Procedure MusicEnd(Var Msg:TMessage); Message um_MusicEnd; public end; 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 If Stream <> 0 then Begin EndSync := Bass_ChannelSetSync(Stream, Bass_SYNC_END, 0, @SyncProc, 1); end .... end; Procedure TfrmMain.MusicEnd(Var Msg:TMessage); Begin if ckRandom.Checked then begin if (playlist.ItemIndex = playlist.Count - 1) then begin playlist.ItemIndex := 0; playlist.Selected[playlist.ItemIndex] := True; // play filestream btnPlayClick(nil); exit; end else playlist.ItemIndex := playlist.ItemIndex + 1; playlist.Selected[playlist.ItemIndex] := True; // play filestream btnPlayClick(nil); end else // stop filestream btnStopClick(nil); End; Weiss aber nicht ob es das ist was du erwartest ;) Dabei ist es egal welches Handle bei INIT übergeben wird da Postmessage dies übernimmt und dann dieses Handle für die Message zuständig ist. Über User kannst du dann selbst bestimmen welche message du auswerten willst mußt dann die Case Anweisung nur erweitern. gruss Emil |
Re: synchronisation via message und bass?
Hallo Listers,
Ersteinmal vielen herzlichen Dank für die vielen Tips und Hinweise. Hier jetzt nochmal, als Zusammenfassung, das setzen eines SyncPoints via Message, für alle, die's gebrauchen können. 1. Das Init der BASS.DLL kann so bleiben, wie man es kennt:
Delphi-Quellcode:
Hat den Vorteil das auf jedenfall alle Messages, die die BASS.DLL ggf. verschickt, auch bei der Application ankommen.
if (not BASS_Init(1, 44100, 0, Application.handle, nil)) then
2. brauchen wir die Message die generiert wird, wenn das Ende eines Titels erreicht ist:
Delphi-Quellcode:
3. Das setzen des Sync-Handles:
const
WM_BASS_EOF = WM_User + 1;
Delphi-Quellcode:
Den TypeCast schlagen übrigens auch die Entwickler im Forum von Un4Seen vor. Also anstatt der Prozedur-Adresse wird hier die Message selbst übergeben die gesendet werden soll, wenn das Ende erreicht ist.
// hs ist der Handle (HSYNC) für die Sync-Prozedur, um ihn ,ggf.
// wieder entfernen zu können. // sh ein Channel hs := BASS_ChannelSetSync(sh, BASS_SYNC_END or BASS_Sync_Message, 0, SyncProc(WM_BASS_EOF), 0); 4. und zu guter letzt, braucht es noch den Message-Handler. Ich habe das mit einem TApplicationEvents-Objekt gelöst, einfach auf die Hauptform platzieren, doppelklick auf OnMessage und dann sieht's so aus:
Delphi-Quellcode:
Das ganze funktioniert hier wirklich ganz brav!
procedure THauptFormular.AppEventsMessage(var Msg: tagMSG;
var Handled: Boolean); begin If Msg.Message = WM_BASS_EOF then begin // mach was, denn das Ende des Titels ist jetzt erreicht. end; end; Viele herzliche Grüße Marco |
Re: synchronisation via message und bass?
Und wo ist nun der unterschied bei deiner und meiner Version von syncproc ?
Kann beim besten willen keinen finden. Und warum ? SyncProc(WM_BASS_EOF), da reicht der Pointer of SyncProc = @SyncProc EDIT: Und bei deiner Message WM_USER +1 wäre ich vorsichtig. Die ist nämlich vom System schon belegt könnte also einige unannehmlichkeiten mit sich bringen. Oder? 0401 1025 CBEM_INSERTITEMA 0401 1025 DDM_DRAW 0401 1025 DM_SETDEFID 0401 1025 HKM_SETHOTKEY 0401 1025 PBM_SETRANGE 0401 1025 RB_INSERTBANDA 0401 1025 SB_SETTEXTA 0401 1025 TB_ENABLEBUTTON 0401 1025 TBM_GETRANGEMIN 0401 1025 TTM_ACTIVATE 0401 1025 WM_CHOOSEFONT_GETLOGFONT 0401 1025 WM_PSD_FULLPAGERECT nur so nebenbei ;) gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 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-2025 by Thomas Breitkreuz