AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi synchronisation via message und bass?
Thema durchsuchen
Ansicht
Themen-Optionen

synchronisation via message und bass?

Ein Thema von Marco Steinebach · begonnen am 16. Jun 2007 · letzter Beitrag vom 17. Jun 2007
Antwort Antwort
Seite 1 von 2  1 2      
Marco Steinebach

Registriert seit: 4. Aug 2006
502 Beiträge
 
Delphi 5 Enterprise
 
#1

synchronisation via message und bass?

  Alt 16. Jun 2007, 23:03
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:
// 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);
und genau hier knallt's, logischerweise, weil BASS_WM_EOF und SYNCPROC nicht zueinander passen. Aber wie löse ich das?

Viele Grüße
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
arnold mueller

Registriert seit: 27. Jul 2005
129 Beiträge
 
#2

Re: synchronisation via message und bass?

  Alt 16. Jun 2007, 23:09
Bitte mal mehr Code zeigen, insbesondere die WndProc und SendMessage Passagen.

VG
arno
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
502 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: synchronisation via message und bass?

  Alt 16. Jun 2007, 23:13
Huhu Arnold,
Zitat von arnold mueller:
Bitte mal mehr Code zeigen, insbesondere die WndProc und SendMessage Passagen.
nix sendMessage, das macht die BASS.DLL.
Aber die WNDPROC kanns'de sehen:
Delphi-Quellcode:
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;
Aber hier liegt halt net der Fehler!
Viele herzliche Grüße
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von Dunkel
Dunkel

Registriert seit: 26. Mär 2007
Ort: Klingenstadt
541 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: synchronisation via message und bass?

  Alt 16. Jun 2007, 23:14
Zitat von Marco Steinebach:
und genau hier knallt's, logischerweise, weil BASS_WM_EOF und SYNCPROC nicht zueinander passen. Aber wie löse ich das?
Eine CallBack-Prozedur schreiben in der Du via SendMessage oder PostMessage die Nachricht abschickst.
Es ist zu wahr um schön zu sein...
  Mit Zitat antworten Zitat
arnold mueller

Registriert seit: 27. Jul 2005
129 Beiträge
 
#5

Re: synchronisation via message und bass?

  Alt 16. Jun 2007, 23:49
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:
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;
VG
Arno
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
502 Beiträge
 
Delphi 5 Enterprise
 
#6

Re: synchronisation via message und bass?

  Alt 17. Jun 2007, 01:15
Huhu Arnold und Liste,
Zitat von arnold mueller:
Wusste gar nicht, dass die bass.dll jetzt auch Messages verschickt.
Doch tut sie!
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:
* * hs := BASS_ChannelSetSync(sh, BASS_SYNC_END or BASS_SYNC_MESSAGE, 0, SYNCPROC(WM_BASS_EOF), 0); Man muß nur darauf achten, beim init der bass.dll nicht application.handle, sondern den hanle der Form zu übergeben.
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
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von Dunkel
Dunkel

Registriert seit: 26. Mär 2007
Ort: Klingenstadt
541 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: synchronisation via message und bass?

  Alt 17. Jun 2007, 01:20
Zitat von Marco Steinebach:
    hs := BASS_ChannelSetSync(sh, BASS_SYNC_END or BASS_SYNC_MESSAGE, 0, SYNCPROC(WM_BASS_EOF), 0); Man muß nur darauf achten, beim init der bass.dll nicht application.handle, sondern den hanle der Form zu übergeben.
Das funktioniert?!?
Werde ich demnächst mal probieren; das wäre ab und an eine ziemliche Erleichterung/Vereinfachung.
Es ist zu wahr um schön zu sein...
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

Re: synchronisation via message und bass?

  Alt 17. Jun 2007, 10:44
Zitat von Marco Steinebach:
Huhu Arnold und Liste,
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
Tja das geht über Postmessage unabhängig von der Form.

Delphi-Quellcode:
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;
So in etwa !
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
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
502 Beiträge
 
Delphi 5 Enterprise
 
#9

Re: synchronisation via message und bass?

  Alt 17. Jun 2007, 14:48
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:
  if (not BASS_Init(1, 44100, 0, Application.handle, nil)) then Hat den Vorteil das auf jedenfall alle Messages, die die BASS.DLL ggf. verschickt, auch bei der Application ankommen.

2. brauchen wir die Message die generiert wird, wenn das Ende eines Titels erreicht ist:
Delphi-Quellcode:
const
  WM_BASS_EOF = WM_User + 1;
3. Das setzen des Sync-Handles:
Delphi-Quellcode:
// 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);
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.
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:
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;
Das ganze funktioniert hier wirklich ganz brav!
Viele herzliche Grüße
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

Re: synchronisation via message und bass?

  Alt 17. Jun 2007, 15:27
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:19 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