![]() |
TBassDllPlayer + Visualisierung (Komponenten)
Liste der Anhänge anzeigen (Anzahl: 3)
Ein Player der auf der bass.dll basiert (Lizens der bass.dll beachten) und eine Visualisierungs Komponente.
Bei der Visualisierungs Komponente ist wichtig, dass die Felder Bassdllplayer und VisualisierungsEinstellungen zugeordnet sind. Für die VIsualierung kann man dlls als Plugin laden. Ein Beispiel für solch eine Dll:
Delphi-Quellcode:
Edit: Die Procedure für die VersionsKontrolle wurde irgendwie gelöscht. Ich hab sie jetzt hinzugefügt.
library Project1;
{keine normalen strings übergeben sonder nur PChar} uses Windows, Classes, Graphics, math, Controls, Messages, ExtCtrls, mmsystem, Dialogs, Contnrs, SysUtils; {$R *.res} type TFFTData= array[0..256] of Extended; TWaveData = array [ 0..2048] of DWORD; TFFTandWaveData = record FFTdata: TFFTdata; //zwischen 0 und 1 waveData: TwaveData; leftpeak,rightpeak: dword; {von 0 bis 32768} end; function getVersion: integer; stdcall; begin result := 1; end; procedure draw(CanvasHandle: HDC; Backgroundcolor,Bordercolor,BalkenColor: Graphics.TColor; width,height: integer; var FFTData: TFFTandWaveData); stdcall; var data: TFFTdata; i: integer; TempBitmap: TBitmap; begin IF CanvasHandle=0 then exit; data := FFTData.FFTdata; TempBitmap := TBitmap.create; TempBitmap.Width := width; TempBitmap.height := height; for i := 1 to 256 do begin Data[i] := Data[i]*ln(i)*4*((height)); if Data[i] > (height) then Data[i] := (height); end; TempBitmap.canvas.pen.color := Bordercolor; TempBitmap.canvas.brush.color := Backgroundcolor; TempBitmap.canvas.Rectangle(0,0,width,height); TempBitmap.canvas.pen.color := BalkenColor; for i := 1 to 256 do begin TempBitmap.Canvas.MoveTo(i,height); TempBitmap.canvas.lineTo(i,(height)-round(Data[i])); end; BitBlt(CanvasHandle, 0, 0, TempBitmap.width, TempBitmap.height, TempBitmap.canvas.Handle , 0, 0 , SRCCOPY); TempBitmap.free; end; exports draw; getVersion; begin end. Dann die dll noch in xyz.bvis umbenen und danach kann kann sie über das popup Menüe geladen werden. Wäre nett wenn sich Leute finden würden, die Plugins programmieren würden. mfg |
Re: TBassDllPlayer + Visualisierung (Komponente)
Coole Sache! Ich werd mich mal dran machen, und versuchen meine Visuals vom FKBassPlayer in DLLs zu verpacken, da sie hier sicher modularer und hübscher aufgehoben sind :). Seit dem letzten Upload meines Players sind auch noch 2 nette Visuals dazu gekommen.
Das wird nen Spaß =) |
Re: TBassDllPlayer + Visualisierung (Komponenten)
Sooo, ich habe mal ein wenig darin gewühlt, und es sind mir ein paar Dinge aufgefallen:
Najo, das waren die Punkte bisher, wobei mich insbesondere die Sache mit der Verison am Weitermachen hindert. Zudem bräuchte ich einen Nasenstubs dahin, wo das Visual auf dem Form eingebettet wird. Schönen Gruss, Fabian \\edit: Hm, jetzt wo ich nochmal drüber nachdenke ist die Übergabe mit einem gemeinsamen Pointer evtl. doch nicht so sehr günstig, da dann ja bei jeder Verwendung 2 mal referenziert werden müsste, oder liege ich mit der Annahme falsch? Oder mit der Folgerung, dass dies Geschwindigkeitsnachteile haben könnte? |
Re: TBassDllPlayer + Visualisierung (Komponenten)
Zitat:
Zitat:
Delphi-Quellcode:
library Project1;
{keine normalen strings übergeben sonder nur PChar} uses Windows, Classes, Graphics, math, Controls, Messages, ExtCtrls, mmsystem, Dialogs, Contnrs, SysUtils; {$R *.res} type TFFTData= array[0..256] of Extended; TWaveData = array [ 0..2048] of DWORD; TFFTandWaveData = record FFTdata: TFFTdata; waveData: TwaveData; leftpeak,rightpeak: dword; {von 0 bis 32768} end; function getVersion: integer; begin result:=1; end; procedure draw(CanvasHandle: HDC; Backgroundcolor,Bordercolor,BalkenColor: Graphics.TColor; width,height: integer; var FFTData: TFFTandWaveData); stdcall; var data: TFFTdata; i: integer; TempBitmap: TBitmap; begin IF CanvasHandle=0 then exit; data := FFTData.FFTdata; TempBitmap := TBitmap.create; TempBitmap.Width := width; TempBitmap.height := height; for i := 1 to 256 do begin Data[i] := Data[i]*ln(i)*4*((height)); if Data[i] > (height) then Data[i] := (height); end; TempBitmap.canvas.pen.color := Bordercolor; TempBitmap.canvas.brush.color := Backgroundcolor; TempBitmap.canvas.Rectangle(0,0,width,height); TempBitmap.canvas.pen.color := BalkenColor; for i := 1 to 256 do begin TempBitmap.Canvas.MoveTo(i,height); TempBitmap.canvas.lineTo(i,(height)-round(Data[i])); end; BitBlt(CanvasHandle, 0, 0, TempBitmap.width, TempBitmap.height, TempBitmap.canvas.Handle , 0, 0 , SRCCOPY); TempBitmap.free; end; exports draw, getVersion; begin end. Zitat:
Zitat:
Der Sourcecode für dei Demo ist doch dabei oder nicht? Zitat:
Dafür ist das gedacht. Zitat:
Zitat:
mfg Henning Du meinst, dass die höhe und Breite noch in den record mit rein kommt? |
Re: TBassDllPlayer + Visualisierung (Komponenten)
Zitat:
Zitat:
Zitat:
Zitat:
Sinnvoll wäre hier evtl. eine Init-Funktion in der DLL vorzuschreiben, der die Randdaten bei Änderung übergeben werden, so dass sie nicht jedes Frame, sondern nur bei Bedarf übergeben werden müssen. Gleiches gilt für die Größe, bei den Wave/FFT-Daten allerdings ist es idR erforderlich dass sie stets aktuell sind. Die würde ich bei der Draw-Routine belassen. Zitat:
Zitat:
Sahnehäubchen wäre wie angesprochen eine Möglichkeit, mit der die DLL die FFT-/Wavedaten in gewünschter Länge und Art anfordern könnte. Aber es würde schon ausreichen jeweils eine 1024 oder 2048 Werte lange Version zu übergeben. Ist ja eh nur nen Pointer, und wenn man nachher weniger braucht, kann das in der DLL ja immernoch leicht bewerkstelligt werden. Zitat:
Gruss, Fabian |
Re: TBassDllPlayer + Visualisierung (Komponenten)
Hast du die Gross und klein Schreibung beachtet?
Das laden erfolgt so. Vieleicht hilft das den Fehler zu finden:
Delphi-Quellcode:
TDrawDLLProcedure= procedure (CanvasHandle: HDC; Backgroundcolor,Bordercolor, BalkenColor: TColor; width,height: integer; var FFTData: TFFTandWaveData) stdcall;
TVersionDLLProcedure= function: integer; stdcall; procedure TVisualisierungEinstellungen.AddPlugin(filename: string); begin IF FileExists(filename) then begin ListederVisualisierungen.Add(TEinzelneVisualisierung.Create); TEinzelneVisualisierung(ListederVisualisierungen.last).filename := filename; TEinzelneVisualisierung(ListederVisualisierungen.last).modus := 1; TEinzelneVisualisierung(ListederVisualisierungen.last).DllHandle:=LoadLibrary(PChar(filename)); if TEinzelneVisualisierung(ListederVisualisierungen.last).DllHandle <> 0 then begin @TEinzelneVisualisierung(ListederVisualisierungen.last).VersionDLLProcedure := GetProcAddress(TEinzelneVisualisierung(ListederVisualisierungen.last).DllHandle, 'getVersion'); IF nil<>@TEinzelneVisualisierung(ListederVisualisierungen.last).VersionDLLProcedure then begin If TEinzelneVisualisierung(ListederVisualisierungen.last).VersionDLLProcedure=1 then begin @TEinzelneVisualisierung(ListederVisualisierungen.last).DrawDLLProcedure := GetProcAddress(TEinzelneVisualisierung(ListederVisualisierungen.last).DllHandle, 'draw'); end else begin ListederVisualisierungen.Delete(ListederVisualisierungen.count-1); showmessage('Dateiversion wird nicht unterstützt'); end; end else begin ListederVisualisierungen.Delete(ListederVisualisierungen.count-1); showmessage('Dateiversion wird nicht unterstützt'); end; end else begin ListederVisualisierungen.Delete(ListederVisualisierungen.count-1); showmessage('kein passendes Plugin'); end; end; end; |
Re: TBassDllPlayer + Visualisierung (Komponenten)
:shock: Frag mich nicht warum, aber ich habe meine DLL gerade einfach nochmal neu kompiliert - und nun klappts...
Und ich habe wirklich nichts anderes gemacht, als das Projekt zu öffnen und neu zu erstellen :gruebel: Naja, wäre dieser Punkt geklärt =) |
Re: TBassDllPlayer + Visualisierung (Komponenten)
Liste der Anhänge anzeigen (Anzahl: 1)
Täterätäää, mein neustes Kick-Ass Visual, die "Disco-Sprites", hübsch in eine DLL verpackt die in diesem Player als Plugin läuft.
Leider haben meine MMX-Optimierungen in dieser Version nicht funktioniert, in meinem Player geht's. Komischerweise reicht es schon einen Farbwert in ein MMX-Register zu schieben und zurück, um alle Bits auf 0 zu setzen :(. Keine Ahnung wer da noch an der FPU rumpfuscht :D. (Wobei ich bei meinem Player ja genau so mit Threads und der Bass.dll arbeite :gruebel:) Naja, dadurch wird's nicht weniger hübsch, nur etwas weniger performant. Die optimale Canvasgröße wäre so bei ca. 400x400 Pixeln, es sieht aber auch in dem Demo-Player schick aus ;) Das wäre btw. eines der Visuals, für die ich gern 512 (oder mehr) FFT-Werte hätte. Hab hier jetzt gepfuscht indem immer 2 Sprites den selben Wert bekommen, dann passte es. Anm.: Kein DirectX/OGL - reine G32 ;) Gruss, Fabian |
Re: TBassDllPlayer + Visualisierung (Komponenten)
Wow die Visual sieht ziemlich gut aus. :thumb:
Ich hab jetzt auch die entsprechenden Erweiterungen ergänzt. Die Dll muss jetzt so aussehen:
Delphi-Quellcode:
library Project1;
{keine normalen strings übergeben sonder nur PChar} uses Windows, Classes, Graphics, math, Controls, Messages, ExtCtrls, mmsystem, Dialogs, Contnrs, SysUtils; {$R *.res} type TFFTData256= array[0..256] of Extended; TFFTData512= array[0..512] of Extended; TWaveData = array [ 0..2048] of DWORD; TFFTandWaveData = record FFTdata256: TFFTdata256; FFTdata512: TFFTdata512; waveData: TwaveData; leftpeak,rightpeak: dword; {von 0 bis 32768} end; TVisInfo = record VisName: PChar; Author: Pchar; AuthorHomepage: Pchar; FFTdata256Flag: boolean; FFTdata512Flag: boolean; waveDataFlag: boolean; Peaks: boolean; end; TEinstellungen = record Backgroundcolor,Bordercolor,BalkenColor: Graphics.TColor; width,height: integer; end; var Einstellungen: TEinstellungen; function getVersion: integer; stdcall; begin result:=2; end; procedure setEinstellungen(neuEinstellungen: TEinstellungen); stdcall; begin Einstellungen := neuEinstellungen; end; function getVisInfo: TVisInfo; stdcall; var temp: TVisInfo; begin temp.VisName := 'test'; temp.Author:= 'Henning Brackmann'; temp.AuthorHomepage:= 'www.blubplayer.de'; temp.FFTdata256Flag := true; temp.FFTdata512Flag := false; temp.waveDataFlag := false; temp.Peaks := false; result:=temp; end; procedure draw(CanvasHandle: HDC; var FFTData: TFFTandWaveData); stdcall; var data: TFFTdata256; i: integer; TempBitmap: TBitmap; begin IF CanvasHandle=0 then exit; data := FFTData.FFTdata256; TempBitmap := TBitmap.create; TempBitmap.Width := Einstellungen.width; TempBitmap.height := Einstellungen.height; for i := 1 to 256 do begin Data[i] := Data[i]*ln(i)*4*((Einstellungen.height)); if Data[i] > (Einstellungen.height) then Data[i] := (Einstellungen.height); end; TempBitmap.canvas.pen.color := Einstellungen.Bordercolor; TempBitmap.canvas.brush.color := Einstellungen.Backgroundcolor; TempBitmap.canvas.Rectangle(0,0,Einstellungen.width,Einstellungen.height); TempBitmap.canvas.pen.color := Einstellungen.BalkenColor; for i := 1 to 256 do begin TempBitmap.Canvas.MoveTo(i,Einstellungen.height); TempBitmap.canvas.lineTo(i,(Einstellungen.height)-round(Data[i])); end; BitBlt(CanvasHandle, 0, 0, TempBitmap.width, TempBitmap.height, TempBitmap.canvas.Handle , 0, 0 , SRCCOPY); TempBitmap.free; end; exports draw, getVisInfo, setEinstellungen, getVersion; begin end. |
Re: TBassDllPlayer + Visualisierung (Komponenten)
Liste der Anhänge anzeigen (Anzahl: 1)
Södale, die neue Version. Sie ist nicht nur an das neue Interface angepasst, nein ich hab mich zu OpenGL hinreissen lassen :). Na denn: Fullscreen voraus!
Gruss, Fabian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 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