Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Probleme mit Bass_Vis (https://www.delphipraxis.net/72711-probleme-mit-bass_vis.html)

BassFan 11. Jul 2006 21:31

Re: Probleme mit Bass_Vis
 
Zitat:


nee, ist mit allen Updates installiert ;)
VB6 ??? Oh..... :thumb:

Dann bitte welche Plugins hast du gewählt ?
Winamp5 funktioniert nicht.

grüße

MagicAndre1981 11. Jul 2006 21:58

Re: Probleme mit Bass_Vis
 
Zitat:

Zitat von BassFan
VB6 ??? Oh..... :thumb:

nee, die Runtime + iregendein Update :gruebel:

Zitat:

Zitat von BassFan
Dann bitte welche Plugins hast du gewählt ?

keins, da das Programm beim Start schon abrödelt ;)

Zitat:

Zitat von BassFan
Winamp5 funktioniert nicht.

das wird wohl der Grund sein, dass es nicht geht, denn ich hab nur Winamp 5 installiert.

BassFan 11. Jul 2006 22:09

Re: Probleme mit Bass_Vis
 
Zitat:

das wird wohl der Grund sein, dass es nicht geht, denn ich hab nur Winamp 5 installiert.
Hundert prozentig..
Das laden der Plugins von Winamp5 funktioniert nicht.

Daran werde ich arbeiten sobald die anderen Funktionen eingebaut sind
die für 2.9 Plugins benötigt werden.

Davon abgesehen!
Benenne den Plugin Ordner in Winamp um nach Plugin_ erstelle
einen neuen Order mit den Namen Plugins.

Lade ein paar 2.9 Plugins und installiere sie.
Dann kannst du den Ordner Plugins auswählen
und das laden der Plugins funktioniert.

Hab jetzt über 1 Stunde AVS am laufen ohne Probleme

Grüße

BassFan 11. Jul 2006 22:16

Re: Probleme mit Bass_Vis
 
So hab die neue Funktion eingebaut!

Delphi-Quellcode:
procedure BASS_WINAMPVIS_Playstate(State: Integer); stdcall;

    begin
    if DummyWinampHandle > 0 then
    case (State) of
    0: State := WINAMP_BUTTON4; //Stop
    1: State := WINAMP_BUTTON2; //Play
    3: State := WINAMP_BUTTON3; //Pause
    end;
    // Sende Ergebnis zu WinampVisWndProc
    // DummyWinampHandle; WindowHandle des Dummy Winamp Fenster
    SendMessage(DummyWinampHandle, WM_COMMAND, State, 0);

end;
wird übergeben VB.
Code:
Private Sub cmdPlay_Click()
       
    hwndWinamp = FindWindow("Winamp v1.x", vbNullString)

    If hwndWinamp <> 0 Then
        BASS_WINAMPVIS_PlayState 1
        lblStatus.Caption = "Playing"
    End If
   
End Sub

Private Sub cmdStop_Click()
   
    hwndWinamp = FindWindow("Winamp v1.x", vbNullString)

    If hwndWinamp <> 0 Then
        BASS_WINAMPVIS_PlayState 0
        lblStatus.Caption = "Stop"
    End If

End Sub
Und das rennt..
Kann jetzt auch aus den Winamp Plugins heraus die Visualisierung ausschalten.

Grüße

MagicAndre1981 11. Jul 2006 22:18

Re: Probleme mit Bass_Vis
 
was ist der Unterschied zw. den Plugins der 2.9 und der 5 (ich hab keine 2.9er mehr)?

BassFan 11. Jul 2006 22:23

Re: Probleme mit Bass_Vis
 
Zitat:

Zitat von MagicAndre1981
was ist der Unterschied zw. den Plugins der 2.9 und der 5 (ich hab keine 2.9er mehr)?

Die kannst doch bei Winamp laden unter plugins.

Denke da gibt es ein problem mit der Erkennung von 'winampVisGetHeader'
Scheinen nicht alle hundertpro importiert zu sein.

Grüße

BassFan 13. Jul 2006 01:07

Re: Probleme mit Bass_Vis
 
Habe mal ne Frage?

Ich benutze die BassVis ja in meinen projekt.
Wenn die DLL startet wird ein Winamp Dummy Fenster erstellt.
Plugins welche eine Dock funktion benutzen setzen sich dann sofort an das nicht sichtbare Fenster
was aber nicht das Fenster meiner Anwendung ist.

Deshalb hole ich über Findwindow das Handle des Dummy Window und
positioniere das Dummy Window mit SetWindowPos in verbindung mit SetParent in mein Hauptfenster ein.

Jetzt kommt das Problem!
Wenn ich die alte Routine aufrufe vom BassVis habe ich festgestellt das beim start
das Plugin nicht schnell genug an mein Hauptfenster andocken kann weil ich das Dummy Window
erst identifizieren kann sobald das Plugin gestartet ist!

Gut soweit.
Habe nun eine Routine hinzugefügt welche es ermöglicht unabhängig vom Plugin
das Dummy Window zu erstellen.

Delphi-Quellcode:
function WinampDummyWin(VisInfo: PWinampVisInfo): HWND;
var
   WinAtom : TAtom;
   wClass : TWNDCLASSEX;
   Msg : TMsg;

const
   AppClass = 'Winamp v1.x';     // Übergebe den ClassenNamen
   AppTitle = 'Winamp 5.2';      // Übergebe den Window Titel (Caption)

begin
   if DummyWinampHandle <> 0 then // Erstelle das Fake Winamp Fenster
   begin
      windows.UnRegisterClass(AppClass, hInst);
      hInst := 0;
      DummyWinampHandle := 0;
      VisInfo^.WinHandle := 0;
   end;

   hInst := GetModuleHandle(nil); // Hole die Apllikations Instanz

   with wClass do                // Erstelle die Classe
   begin
      cbSize       := sizeof(wClass);
      Style        := CS_PARENTDC or CS_VREDRAW;
      lpfnWndProc  := @WinampVisWndProc;
      cbClsExtra   := 0;
      cbWndExtra   := 0;
      hInstance    := hInst;
      hIcon        := 0;
      hCursor      := LoadCursor(0, IDC_ARROW);
      hbrBackground := COLOR_BTNFACE + 1;
      lpszMenuName := nil;
      lpszClassName := AppClass;
      hIconSm      := 0;
   end;

  // Erst wenn die Classe registriert ist kann das Window erstellt werden
   WinAtom := windows.RegisterClassEx(wClass);

   if WinAtom <> 0 then
      result := CreateWindowEx(0, AppClass, AppTitle,
                                  WS_POPUP,       // Kein Frame, Unsichtbar
                                  0, 0, 275, 116, // x, y, width, height
                                  {parent} 0, 0, hInst, nil)
   else
      result := 0;

  DummyWinampHandle := result;
  VisInfo^.WinHandle := DummyWinampHandle;
  // Erst der AppClass das ParentWindow zuweisen
  // Dann über ParentWindow das HWND des Plugin ermitteln
  PluginHandle := GetWindow(DummyWinampHandle,GW_HWNDPREV);
  WinProcLoad := False;

  // Überprüfe ob aus der Anwendung IsPlaying eingeschaltet wurde.
  // Erst dann wird die Visualisierung freigeschaltet.
  if IsPlaying > 0 then
         VisInfo^.Init2 := True
    else
         VisInfo^.Init2 := False;

    sleep(150);
    peekmessage(Msg, 0, 0, 0, 0);

end;
Dort wird das Window generiert.

Um die Function abzuschließen muss ich auf die Rückgabe der Message warten.
Delphi-Quellcode:
GetMessage(Msg, 0, 0, 0)
Hier hängt sich das Plugin aber auf!
Habe es nu so gelößt.

Delphi-Quellcode:
    sleep(150);
    peekmessage(Msg, 0, 0, 0, 0);
Nun warte ich 150 msec und hole mir dann die Infos über PeekMessage

Nun die Frage .. hihihihihhiihihih

Geht das anders ? Komfortabler ? Denke es ist kein guter Ansatz über die Sleep Methode
Anders habe ich den Kuchen aber nicht gebacken bekommen.
Ich darf aber auf keinen Fall in dieser Funktion hängen bleiben bzw.. die abfrage der Message muss beendet werden.
Die Funktion selbst wird nur einmal beim start der BassVis ausgeführt.

Für die Plugins gibt es nochmal eine ähnlich Funktion.

grüße

EDIT: Soviel Text für ein so kleines Problem ...

turboPASCAL 13. Jul 2006 08:52

Re: Probleme mit Bass_Vis
 
Nein, das erstellen des Fensters ist schon gut so.
Was fehlt ist die Weiterverarbeitung der Messages von GetMessage(Msg, 0, 0, 0).


Delphi-Quellcode:
while GetMessage(msg, 0, 0, 0) do
begin
  TranslateMessage(msg); // Tastatureingaben veratbeiten
  DispatchMessage(msg); // Messages veratbeiten
end;
Du musst halt noch in der WndProc festlegen wann das Fenster geschlossen wird bzw. werden soll.

BassFan 13. Jul 2006 16:06

Re: Probleme mit Bass_Vis
 
Zitat:

Zitat von turboPASCAL
Nein, das erstellen des Fensters ist schon gut so.
Was fehlt ist die Weiterverarbeitung der Messages von GetMessage(Msg, 0, 0, 0).


Delphi-Quellcode:
while GetMessage(msg, 0, 0, 0) do
begin
  TranslateMessage(msg); // Tastatureingaben veratbeiten
  DispatchMessage(msg); // Messages veratbeiten
end;
Du musst halt noch in der WndProc festlegen wann das Fenster geschlossen wird bzw. werden soll.

Das Funktioniert leider nicht.

Ich versuchs nochmal zu erklären.
Stell dir das Fenster meiner Anwendung als Koffer vor dort wird nun das hier erzeugt reingesteckt
und darf nicht wieder entnommen(terminiert werden).

Wenn ich nun hier eine GetMessage ansetze arbeitet diese wie ein schloss was erst geöffnet werden kann
wenn ich den schlüssel habe '(WM_QUIT) sende.'
Unabhängig davon muss ich mich aber weiter bewegen können. Und das geht mit GetMessage nicht.

Also kurz gesagt.
Das Fenster darf nicht terminiert werden aber die Plugins müssen trotzdem Messagen empfangen
und versenden können

Grüße

BassFan 13. Jul 2006 16:57

Re: Probleme mit Bass_Vis
 
Ich glaube das problem ist schwieriger als gedacht

Das funktioniert deshalb nicht weil beide routinen auf die gleiche winproc ansprechen.
Deshalb kann die getMessage nicht verarbeitet werden.

Was ich erreichen möchte.

1. Das einmal erstellte Dummy Window für Winamp-Plugins darf nicht terminiert werden
Es soll beim starten von BassVis das HWND vom Dummy an die Anwendung schicken aber ohne das ein
Plugin vorher ausgeführt wurde.
Benötigt wird diese Funktion für Plugins welche Andock möglichkeiten zur verfügung stellen.

2.
Die Plugins ausführen aber so das diese das DummyWindow nicht terminieren.
Würde bedeuten das ich dafür eine separate Winproc benötige.
Bin mir nur noch nicht klar welche messagen diese verarbeiten soll.
Wenn das ohne extra Winproc läuft um so besser.

3.
Übergabe der Laufzeit TimeDisplay
Muss von der Anwendung übergeben und von jeden Plugin erkannt werden

4.
Übergabe des aktuellen Titels
Muss von der Anwendung übergeben und von jeden Plugin erkannt werden

5:
Next, Prev ... dürfte keien problem sein.
Muss von der Anwendung übergeben und von jeden Plugin erkannt und gesteuert werden können.

Bisher läuft es stabiel solange wie kein Winamp5 Plugin verwendet wird
und die Plugins selbst keine Fehler haben.
Alle Grafik (Skins) funktionieren.
Alle Konfigurationen können ohne das Plugin zu starten aufgerufen werden.

BassFan 14. Jul 2006 12:06

Re: Probleme mit Bass_Vis
 
Handle der DLL finden?

Finde das Handle von den Plugin's nicht.
Was bekannt ist, ist das ParentWindow

Hwnd
ClassenName = ('Winamp v1.x')
Titel (Caption)

Wie kann ich nun das Handle der DLL ermitteln?
ich meine nicht das Handle des Moduls sondern des Fensters.

GetWindow,FindWindow,FindWindowEx alles will nicht funktionieren.

Grüße

turboPASCAL 14. Jul 2006 18:17

Re: Probleme mit Bass_Vis
 
Hm, das Problem ist das jeder ein Winamp Vis Fenster erstellen kann wie er will, das heisst es ist nichts festgelegt. Damit sind die Fenstersuchfunktionen wie FindWindow etc. ggf. ervfolglos.

BassFan 14. Jul 2006 19:52

Re: Probleme mit Bass_Vis
 
Zitat:

Zitat von turboPASCAL
Hm, das Problem ist das jeder ein Winamp Vis Fenster erstellen kann wie er will, das heisst es ist nichts festgelegt. Damit sind die Fenstersuchfunktionen wie FindWindow etc. ggf. ervfolglos.

Nein
Das PluginHandle hat nichts mit erstellen von Fenstern zu tun.
Es soll lediglich dem user ermöglichen diverse Funktionen mit dem Handle asuzuführen.

Nicht alle Plugins unterstützen Docking.

Wenn ich das Handle kenne kann mein Player wenn er verschoben wird sich automatisch an das Plugin Window
andocken und es mitziehen.

So wie bei Winamp wenn die Playliste oder EQ andockt!

Eine andere Frage ? :wink:

Delphi-Quellcode:
function BASS_WINAMPVIS_SetChanInfo(handle: HVIS; Title: PChar; FileName: PChar; pos, len: DWORD): boolean; stdcall;
Hier werden Diverse Infos übermittelt.
Den Titel , Filename muss ich wenn er ankommt über SendMessage an die Winproc senden.

Delphi-Quellcode:
PostMessage(handle,WM_WA_IPC,VisInfo^.Title,IPC_GETPLAYLISTTITLE)
Hier stimmt was nicht es wird ein Integer als übergabe verlangt.

Wie kann ich den Text 'VisInfo^.Title' senden als Integer das er trotzdem richtig ausgewertet wird.

Grüße

BassFan 14. Jul 2006 23:05

Re: Probleme mit Bass_Vis
 
Zitat:

Hier stimmt was nicht es wird ein Integer als übergabe verlangt.
Hat sich erledigt!

gruß

BassFan 15. Jul 2006 09:52

Re: Probleme mit Bass_Vis
 
Liste der Anhänge anzeigen (Anzahl: 1)
Soweit läuft jetzt alles!

Siehe ScreenShot.

Einzige Problem ist das Dummy Window von Winamp.
Ich habe es mal auf Visible gestellt damit man da problem besser erkennen kann.

Wenn nun ein plugin ausgeführt wird hängt es sich an das Fenster an.
Das ist es aber was ich verhindern will .. es soll wie bei Winamp sich an mein fenster andocken.

Hier nochmal ein Schnipsel vom Source.

Delphi-Quellcode:
  // Erst wenn die Classe registriert ist kann das Window erstellt werden
  WinAtom := Windows.RegisterClassEx(wClass);

  if WinAtom <> 0 then
    Result := CreateWindowEx(0, AppClass, AppTitle,
      WS_VISIBLE,      // Kein Frame, Unsichtbar
      0, 0, 275, 116, // x, y, width, height
      {parent} 0, 0, hInst, nil)
  else
    Result := 0;

     // AppParentHandle Hwnd von der ausführenden Anwendung
//   if AppParentHandle <> 0 then
//   begin
//   VisPlgHandle := Result;
//   SetParent(VisPlgHandle, AppParentHandle);
//   SetWindowPos(VisPlgHandle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_NOSIZE);
//   end
//   else

//  VisPlgHandle := Result;

  VisInfo^.WinHandle := VisPlgHandle;
  WinampVisExecute(Filename, Vismod, VismodCounter, VisPlgHandle);

  // ParentWindow der APPClass zuweisen
  VisInfo^.VisModule^.hwndParent := VisPlgHandle;
  VisInfo^.VisModule^.Init(VisInfo^.VisModule);
  PluginHandle := GetWindow(VisInfo^.VisModule^.hwndParent, GW_HWNDPREV);
Wenn die zeilen oben auskommentiert werden dann hängt sich das Programm auf..
bzw. verliert den Focus und läuft nicht weiter.

Was kann ich da sonst noch machen habs mit zwei WinProcs versucht und.. und.. und..
Weiss im moment nicht weiter.

turboPASCAL 15. Jul 2006 11:51

Re: Probleme mit Bass_Vis
 
:gruebel: Wie gesagt, du weist ja nicht wie der Programierer das Plugin gebaut hat. Ob es sich um eine Form wie in Delphi, VB etc. als Standalone, Dialog etc. dich darstellt.
Desswegen wird es auch schwehr mit FindWindow das Handle zu finden und sich dan die WndProc zu holen und oder umzubigen.


Du kontest aber versuchen das Pluginfenster auf dein Fenster zu kleben...

BassFan 15. Jul 2006 12:12

Re: Probleme mit Bass_Vis
 
Zitat:

Zitat von turboPASCAL
:gruebel: Wie gesagt, du weist ja nicht wie der Programierer das Plugin gebaut hat. Ob es sich um eine Form wie in Delphi, VB etc. als Standalone, Dialog etc. dich darstellt.
Desswegen wird es auch schwehr mit FindWindow das Handle zu finden und sich dan die WndProc zu holen und oder umzubigen.


Du kontest aber versuchen das Pluginfenster auf dein Fenster zu kleben...

Es gibt ja nur 2 möglichkeiten
entweder ich bekomme das HWND über
Delphi-Quellcode:
PluginHandle := GetWindow(VisInfo^.VisModule^.hwndParent, GW_HWNDPREV);
oder es wird ein wert 0 zurückgegeben.

In 90% aller fälle ist das handle vorhanden.
Die anderen 10 sind meistens plugins welche sich selbst andocken.
Mein problem ist das hier erstellte 'Winamp v1.x' in das Window meiner Anwendung einzufügen.
Das Handle ist immer bekannt da es ja im Thread selbst erstellt wird.

Nur es verliert den Focus sobald ich es in meine Form verschiebe.
dann läuft die routine nicht mehr durch weil sich die reihenfolge kindfenster,Parentfenster,Child-fenster
geändert hat.

wenn alle stricke reißen werd ich es wohl mit GetwindowRec machen müssen.
Nur das ist extrem CPU lastig da es mein Window immer verfolgen muss
sobald es verschoben wird.

grüße

BassFan 16. Jul 2006 11:08

Re: Probleme mit Bass_Vis
 
[quote]Desswegen wird es auch schwehr mit FindWindow das Handle zu finden und sich dan die WndProc zu holen und oder umzubigen. [delphi]

wir reden irgendwie aneinander vorbei. :(
Das Handle finde ich immer. Notfalls Enumeriere ich alle Fenster und vergleiche sie über ein vorher angelegtes array
in dem sich alle Window Handle befinden.

Wie kann ich die Kontrolle über das von mir erstellte
Fenster zurückbekommen sobald dieses als ParentWindow in
das Anwendungs Fenster verschoben wurde.

grüße

BassFan 16. Jul 2006 14:11

Re: Probleme mit Bass_Vis
 
Liste der Anhänge anzeigen (Anzahl: 1)
Da niemand antwortet.

Zitat:

Wie kann ich die Kontrolle über das von mir erstellte
Fenster zurückbekommen sobald dieses als ParentWindow in
das Anwendungs Fenster verschoben wurde.
beantworte ich es selber!

Hat sich erledigt es geht.
Schaut auf das kleine Visualisierungs Window unter der Zeitanzeige :wink:

BassFan 16. Jul 2006 16:17

Re: Probleme mit Bass_Vis
 
Liste der Anhänge anzeigen (Anzahl: 1)
So hier ist das Projekt mit Quelltext der Exe
welche die Bass_Vis als visualisierung für Winamp Plugins bis 2.9 verwendet.

Habe einen exeption-Handler mit eingebaut.
Ihr könnt aber auch Fehler hier melden wenn ihr wollt.
Oder Fragen stellen bzgl. PlayStatus, Text anzeige usw....

gruß

EDIT: Ihr müßt eine Quelle starten welche Musk wiedergibt ansonsten wird nix angezeigt.

BassFan 18. Jul 2006 14:56

Re: Probleme mit Bass_Vis
 
Wer kann helfen

Delphi-Quellcode:
Init: function(WinampVisModule: PWinampVisModule): integer; cdecl;
Mir dieser function ausgeführt als
Delphi-Quellcode:
VisInfo^.VisModule^.Init(VisInfo^.VisModule);
werden die Plugins intitalisiert und sichtbar geschaltet.

Wie kann ich diese ändern das bei der initialisierung das Plugin
zuerst unsichtbar ist.
gibt es in Delphi dafür einen Befehl?

würde es gern in dieser art machen.
Delphi-Quellcode:
Init: function(WinampVisModule: PWinampVisModule; Visible: Boolean): integer; cdecl;
Nur wie übergeben?
Damit es auf dem Plugin angewendet auch funktioniert.

Für was steht 'cdecl' was bewirkt dieser Anhang.

gruß

EDIT: Oder kann man ein Modul generell beim start unsichtbar schalten?

BassFan 19. Jul 2006 12:35

Re: Probleme mit Bass_Vis
 
Vielleicht weiß es jemand
Seltsames Startverhalten WindowHandle wird zu spät oder gar nicht (0) angezeigt.

Delphi-Quellcode:
  WinAtom := Windows.RegisterClassEx(wClass);

  if WinAtom <> 0 then
    Result := CreateWindowEx(0, AppClass, AppTitle,
      WS_POPUP,      // Kein Frame, Unsichtbar
      0, 0, 275, 116, // x, y, width, height
      {parent} 0, 0, hInst, nil)
  else
    Result := 0;


  // Hwnd von der ausführenden Anwendung
  if AppParentHandle <> 0 then
  begin
    VisPlgHandle := Result;
    BASS_WINAMPVIS_GetAmpHwnd;
    GetWindowRect(AppParentHandle, AppREC);
    MoveWindow(VisPlgHandle, 0, 0, AppREC.Right - AppREC.Left, AppREC.Bottom - AppREC.Top, True);
  end
  else
In der zeile 'BASS_WINAMPVIS_GetAmpHwnd;' wird das Handle 'VisPlgHandle' an die Anwendung übergeben.
Diese läd die Information aus dieser Function.


Delphi-Quellcode:
function BASS_WINAMPVIS_GetAmpHwnd: DWORD; stdcall;

begin
    //repeat
    Result := VisPlgHandle;
    //until VisPlgHandle <> 0
end;
Warum wird das Handle mit 0 oder zu spät übergeben ?

Noch ein Problem alle Plugins die gestartet werden haben den WaitCursor
solange bis ich wenn vorhanden das Menü aktiviert habe.
Kann es sein das irgendwo etwas hängt oder nicht abgeschlossen wurde?

gruß

mlspider 28. Dez 2006 13:14

Re: Probleme mit Bass_Vis
 
Sorry das ich den alten Kaffee nochmals aufwärme. Ich versuche das Project zu kompilieren. Leider bekomme ich die Meldung, dass die Datei madExcept.dcu fehlt. Ich habe die Bass 2.2 installiert.

turboPASCAL 28. Dez 2006 13:40

Re: Probleme mit Bass_Vis
 
ggf. steht in der uses-Klausel noch die Datei madExcept-Unit, einfach löschen.
Diese Unit ist (nur) zum Debuggen.

Delphi-Quellcode:
uses
  Windows, Classes, ..., madExcept;
Es währe nett wenn du noch sagst welches Project!

mlspider 28. Dez 2006 13:42

Re: Probleme mit Bass_Vis
 
Perfect, danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:09 Uhr.
Seite 2 von 2     12   

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