|
Antwort |
EWeiss
(Gast)
n/a Beiträge |
#1
Hi
Wie einige vielleicht hier wissen habe ich die BassVis DLL geschrieben Mein.. den User sein Problem ist nun das er für jede visualisierung WMP/WINAMP/SONIQUE jede menge code schreiben muss da es für jede Visualisierung eigene dem Type angepaßte API gibt. Das es für die Typen fast immer den gleichen aufruf gibt habe ich mir überlegt das ganze etwas zu kürzen. Die Idee ist die Api so auszulegen das mit einen Aufruf jeder Typ angesprochen werden kann. Bisher geht das so! BASS_WINAMP_IsFree BASS_WMP_IsFree usw... Wie würdet ihr vorgehen um den ganzen kram mit einem aufruf zu erledigen ohne zu viel am code zu ändern? Es geht mir also um die Neustukturierung. Die API sieht bisher so aus!
Delphi-Quellcode:
gruss Emil
//'--------------------------- BassVis API Module -----------------------------
//' BassVis API Module ADD-ON for Bass Audio Library //' Copyright © 2007 BrewIdeas@Emil Weiss, All Rights Reserved //' //' Author(s) of this module: Emil Weiss //' //' Code was written in and formatted for 10pt Courier New //'---------------------------------------------------------------------------- unit BassVis; interface uses Windows; type HVIS = DWORD; QWORD = Int64; const // BASS_SONIQUEVIS_CreateVis flags BASS_VIS_NOINIT = 1; // BASS_SONIQUEVIS_SetConfig flags BASS_SONIQUEVIS_CONFIG_FFTAMP = 1; BASS_SONIQUEVIS_CONFIG_FFT_SKIPCOUNT = 2; // Skip count range is from 0 to 3 (because of limited FFT request size) BASS_SONIQUEVIS_CONFIG_WAVE_SKIPCOUNT = 3; // Skip count range is from 0 to (...) try it out, whenever Bass crashes or does not return enough sample data BASS_SONIQUEVIS_CONFIG_SLOWFADE = 4; // Dim light colors to less than half, then slowly fade them out // BASS_WINAMP_SetConfig flags BASS_WINAMPVIS_CONFIG_FFTAMP = 1; // BASS_WMPVIS_SetConfig flags BASS_WMPVIS_CONFIG_FFTAMP = 1; // Bass FFT Amplification values BASS_VIS_FFTAMP_NORMAL = 1; BASS_VIS_FFTAMP_HIGH = 2; BASS_VIS_FFTAMP_HIGHER = 3; BASS_VIS_FFTAMP_HIGHEST = 4; // BASS_VIS_FindPlugin flags BASS_VIS_FIND_SONIQUE = 1; BASS_VIS_FIND_WINAMP = 2; BASS_VIS_FIND_RECURSIVE = 4; // return value type BASS_VIS_FIND_COMMALIST = 8; // Delphi's comma list style (item1,item2,"item 3",item4,"item with space") // the list ends with single NULL character function BASS_SONIQUEVIS_CreateVis(f, visconfig:PChar; flags, w, h: DWORD):HVIS; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Render(handle: HVIS; channel: DWORD; canvas: HDC): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Render2(handle: HVIS; data, fft: Pointer; canvas: HDC; flags, pos: DWORD): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Free(handle: HVIS): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_GetName(handle: HVIS): PChar; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Clicked(handle: HVIS; x, y: DWORD): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Resize(handle: HVIS; nw, nh: DWORD): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_GetConfig(option: DWORD): DWORD; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_SetFullScreen(handle: HVIS; SourceHandle: DWORD; DestHandle: DWORD; SourceLeft: DWORD; SourceTop: DWORD; SourceWidth: DWORD; SourceHeight: DWORD; FullScreen: BOOL; FullScreeWidth: DWORD; FullScreenHeight: DWORD): boolean; stdcall; external 'bass_vis.dll'; procedure BASS_SONIQUEVIS_CreateFakeSoniqueWnd; stdcall; external 'bass_vis.dll'; procedure BASS_SONIQUEVIS_DestroyFakeSoniqueWnd; stdcall; external 'bass_vis.dll'; procedure BASS_SONIQUEVIS_SetConfig(option, Value: DWORD); stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_ExecuteVis(PluginName: PChar; moduleNum: integer; ownHdc: boolean; ownHdcW2: boolean): HVIS; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_RenderStream(StreamHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_Free(handle: HVIS): Boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetModuleName(handle: HVIS; VismodNum: integer): PChar; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetName(handle: HVIS): PChar; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_Config(handle: HVIS; VismodNum: Integer): Boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_SetChanInfo(handle: HVIS; title: PChar; filename: PChar; pos, len: DWORD; PListPos: integer; PLLength: integer): Boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_SetChanMPEGInfo(handle: HVIS; SampleRate, BitRate: integer; Duration: DWORD; Channels: integer): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetNumModules(PluginName: PChar):integer; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetHandle(PluginName: PChar): HVIS; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_StartRecord(SampleRate: DWORD; Channels: Integer): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetAmpHwnd: DWORD; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetGenHwnd: DWORD; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_Init(AppHandle: DWORD; WinHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetConfig(option: DWORD): DWORD; stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_SetConfig(option, Value: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_SetGenHwndParent(hWindow : DWORD; hContainer: DWORD; x, y, w, h: Integer); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_RecordFree; stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Quit; stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Play(handle: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Pause(handle: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Stop(handle: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_SetPlaylistPos(handle: DWORD; PlPos: Integer); stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetPlaylistPos(handle: DWORD):integer; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_IsPlaying(handle: DWORD):integer; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_Init(AppHandle: DWORD; WinHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_ExecuteVis(PlgListIndex: Integer; PresetIndex: Integer; VisWinhandle: DWORD; Left, Top, width, heigth: Integer): HVIS; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetPresetTitle(PlgListIndex: Integer; NumPresets: Integer): PChar; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetPresetCount(PlgListIndex: Integer):integer; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetPluginDescription(): PChar; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_Free(handle: HVIS): boolean; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_RenderStream(StreamHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_FindPlugins(): PChar; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetConfig(option: DWORD): DWORD; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_SetFullScreen(SourceHandle: DWORD; DestHandle: DWORD; SourceLeft: DWORD; SourceTop: DWORD; SourceWidth: DWORD; SourceHeight: DWORD; FullScreen: BOOL; FullScreeWidth: DWORD; FullScreenHeight: DWORD): boolean; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Resize(SourceWidth: DWORD; SourceHeight: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_SetCurrentPreset(PresetIndex: Integer); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Config(hwndOwner: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_SetConfig(option, Value: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_SetMediaInfo(Channels: integer; SampleRate: integer; Title: string); stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_StartRecord(SampleRate: DWORD; Channels: Integer): boolean; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_RecordFree; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Play; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Pause; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Stop; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Quit; stdcall; external 'bass_vis.dll'; function BASS_VIS_FindPlugins(vispath: PChar; flags: DWORD): PChar; stdcall; external 'bass_vis.dll'; implementation end. |
Zitat |
Robert Marquardt
(Gast)
n/a Beiträge |
#2
Na mach als ersten Parameter aller Funktionen eine ID.
Delphi-Quellcode:
Intern verzweigst du dann einfach auf die spezifischen Funktionen. Das Set der API-Funktionen wird vereinheitlicht. Erstelle ein Superset aller Funktionen. Einige Funktionen tun dann halt nichts.
const
BASSVIS_SONIQUE = 1; BASSVIS_WINAMP = 2; BASSVIS_WMP = 3; Ich glaube BASS_SONIQUEVIS_CreateFakeSoniqueWnd und BASS_SONIQUEVIS_DestroyFakeSoniqueWnd koennen ganz aus dem API fallen. Es sotlle doch moeglich sein das intern in der DLL zu regeln. BTW deklariere 'bass_vis.dll' als Konstante und verwende sie. Das spart ein bischen, da dann der String nur einmal vorhanden ist. |
Zitat |
EWeiss
(Gast)
n/a Beiträge |
#3
Zitat von Robert Marquardt:
Na mach als ersten Parameter aller Funktionen eine ID.
Delphi-Quellcode:
Intern verzweigst du dann einfach auf die spezifischen Funktionen. Das Set der API-Funktionen wird vereinheitlicht. Erstelle ein Superset aller Funktionen. Einige Funktionen tun dann halt nichts.
const
BASSVIS_SONIQUE = 1; BASSVIS_WINAMP = 2; BASSVIS_WMP = 3; . Und verzweigen auf die Functionen ja weis nur noch nicht wie am besten ohne den ganzen quelltext neuzuschreiben. die Const für die BASSVIS_TYPE := ->>> Wie diese const mit der API nach draußen tragen ebenfalls ohne viel zu ändern?
Zitat:
Ich glaube BASS_SONIQUEVIS_CreateFakeSoniqueWnd und BASS_SONIQUEVIS_DestroyFakeSoniqueWnd koennen ganz aus dem API fallen. Es sotlle doch moeglich sein das intern in der DLL zu regeln.
Der User muss also zugriff darauf haben und selbst bestimmen können ob er das abhängig von seiner Anwendung erstellen will.
Zitat:
BTW deklariere 'bass_vis.dll' als Konstante und verwende sie. Das spart ein bischen, da dann der String nur einmal vorhanden ist
Delphi-Quellcode:
welchen vorteil bringt mir das ? bzw.. was spart das.
Const
BASSVIS_API : String = 'BassVis.Dll' |
Zitat |
Robert Marquardt
(Gast)
n/a Beiträge |
#4
Also ohne das Umschreiben der DLL geht es nicht. Das API enthaelt sowieso so viele kleine Unsauberkeiten und Designschwaechen das man es neu entwerfen sollte.
Offensichtlich erstellt BASS_SONIQUEVIS_CreateFakeSoniqueWnd ein nur in der DLL erreichbares Fenster. Das kann man doch einfach immer erstellen und spart sich die API-Funktionen. Ich meinte
Delphi-Quellcode:
Jedesmal wenn man 'bass_vis.dll' direkt benutzt wird der String im EXE abgelegt. Pro Funktionsdeklaration gibt es daher eine Kopie des Strings in der EXE. Das kann leicht ausarten.
const
BassVisDllName = 'bass_vis.dll'; |
Zitat |
EWeiss
(Gast)
n/a Beiträge |
#5
Hi Robert
Zitat:
Also ohne das Umschreiben der DLL geht es nicht. Das API enthaelt sowieso so viele kleine Unsauberkeiten und Designschwaechen das man es neu entwerfen sollte.
Viele Leute benutzen die DLL und Probleme diesbezüglich hat mir bisher niemand mitgeteilt. Egal unter welcher Sprache sie benutzt wurde. #C_NET,VB_NET,Delphi,Vb,C,C++,MSVC
Zitat:
Offensichtlich erstellt BASS_SONIQUEVIS_CreateFakeSoniqueWnd ein nur in der DLL erreichbares Fenster. Das kann man doch einfach immer erstellen und spart sich die API-Funktionen.
Wenn es immer erstellt wird funktionieren einige andere Plugins nicht mehr. Außerdem stellt deine Anwendung im normalfall das Window für Sonique dar es wird dann nur umgelenkt und den Plugins wird vorgegaukelt das es Sonique ist.
Zitat:
Ich meinte
Delphi-Quellcode:
const
BassVisDllName = 'bass_vis.dll'; Aber warum deklarierst du den Wert nicht ? 'bass_vis.dll kann ja vieles sein denke nach außen hin sollte ich ihm schon einen wert übergeben oder?
Zitat:
Jedesmal wenn man 'bass_vis.dll' direkt benutzt wird der String im EXE abgelegt. Pro Funktionsdeklaration gibt es daher eine Kopie des Strings in der EXE. Das kann leicht ausarten
Wie meinst du das mit SuperSet wie sollte das aussehen. das *.h File sieht so aus und wie gesagt bisher keine fehler gemeldet!
Code:
gruss Emil
#ifndef BASSVIS_H
#define BASSVIS_H #include <wtypes.h> #ifdef __cplusplus extern "C" { #endif #ifndef BASSVISDEF #define BASSVISDEF(f) WINAPI f #endif typedef DWORD HVIS; typedef unsigned __int64 QWORD; // BASS_SONIQUEVIS_CreateVis flags #define BASS_VIS_NOINIT 1 // BASS_SONIQUEVIS_SetConfig flags #define BASS_SONIQUEVIS_CONFIG_FFTAMP 1 #define BASS_SONIQUEVIS_CONFIG_FFT_SKIPCOUNT 2 // Skip count range is from 0 to 3 (because of limited FFT request size) #define BASS_SONIQUEVIS_CONFIG_WAVE_SKIPCOUNT 3 // Skip count range is from 0 to (...) try it out, whenever Bass crashes or does not return enough sample data #define BASS_SONIQUEVIS_CONFIG_SLOWFADE 4 // Dim light colors to less than half, then slowly fade them out // BASS_WINAMP_SetConfig flags #define BASS_WINAMPVIS_CONFIG_FFTAMP 1 // BASS_WMPVIS_SetConfig flags #define BASS_WMPVIS_CONFIG_FFTAMP 1 // Bass FFT Amplification values #define BASS_VIS_FFTAMP_NORMAL 1 #define BASS_VIS_FFTAMP_HIGH 2 #define BASS_VIS_FFTAMP_HIGHER 3 #define BASS_VIS_FFTAMP_HIGHEST 4 // BASS_VIS_FindPlugin flags #define BASS_VIS_FIND_SONIQUE 1 #define BASS_VIS_FIND_WINAMP 2 #define BASS_VIS_FIND_RECURSIVE 4 // return value type #define BASS_VIS_FIND_COMMALIST 8 // Delphi's comma list style (item1,item2,"item 3",item4,"item with space") // the list ends with single NULL character HVIS BASSVISDEF(BASS_SONIQUEVIS_CreateVis)(char *f, char *visconfig, DWORD flags, DWORD w, DWORD h); BOOL BASSVISDEF(BASS_SONIQUEVIS_SetFullScreen)(HVIS handle, DWORD SourceHandle, DWORD DestHandle, DWORD SourceLeft, DWORD SourceTop, DWORD SourceWidth, DWORD SourceHeight, BOOL FullScreen, DWORD FullScreeWidth, DWORD FullScreenHeight); BOOL BASSVISDEF(BASS_SONIQUEVIS_Render)(HVIS handle, DWORD channel, HDC canvas); BOOL BASSVISDEF(BASS_SONIQUEVIS_Render2)(HVIS handle, void *data, void *fft, HDC canvas, DWORD flags, DWORD pos); BOOL BASSVISDEF(BASS_SONIQUEVIS_Free)(HVIS handle); BOOL BASSVISDEF(BASS_SONIQUEVIS_Clicked)(HVIS handle, DWORD x, DWORD y); BOOL BASSVISDEF(BASS_SONIQUEVIS_Resize)(HVIS handle, DWORD nw, DWORD nh); DWORD BASSVISDEF(BASS_SONIQUEVIS_GetConfig)(DWORD option); char* BASSVISDEF(BASS_SONIQUEVIS_GetName)(HVIS handle); void BASSVISDEF(BASS_SONIQUEVIS_CreateFakeSoniqueWnd)(); void BASSVISDEF(BASS_SONIQUEVIS_DestroyFakeSoniqueWnd)(); void BASSVISDEF(BASS_SONIQUEVIS_SetConfig)(DWORD option, DWORD Value); HVIS BASSVISDEF(BASS_WINAMPVIS_ExecuteVis)(char *PluginName, int moduleNum, BOOL ownHdc, BOOL ownHdcW2); HVIS BASSVISDEF(BASS_WINAMPVIS_GetHandle)(char *PluginName); BOOL BASSVISDEF(BASS_WINAMPVIS_RenderStream)(DWORD StreamHandle); BOOL BASSVISDEF(BASS_WINAMPVIS_Free)(HVIS handle); BOOL BASSVISDEF(BASS_WINAMPVIS_Config)(HVIS handle, int VismodNum); BOOL BASSVISDEF(BASS_WINAMPVIS_SetChanInfo)(HVIS handle, char* title, char* filename, DWORD pos, DWORD len, DWORD plistpos, DWORD pllength); BOOL BASSVISDEF(BASS_WINAMPVIS_SetChanMPEGInfo)(HVIS handle, int SampleRate, int BitRate, DWORD Duration, int Channels); BOOL BASSVISDEF(BASS_WINAMPVIS_StartRecord)(DWORD SampleRate, int Channels); BOOL BASSVISDEF(BASS_WINAMPVIS_Init)(DWORD AppHandle, DWORD WinHandle); BOOL BASSVISDEF(BASS_WINAMPVIS_Config)(HVIS handle, int VismodNum); BOOL BASSVISDEF(BASS_WINAMPVIS_IsFree)(); DWORD BASSVISDEF(BASS_WINAMPVIS_GetAmpHwnd)(); DWORD BASSVISDEF(BASS_WINAMPVIS_GetGenHwnd)(); DWORD BASSVISDEF(BASS_WINAMPVIS_GetConfig)(DWORD option); char* BASSVISDEF(BASS_WINAMPVIS_GetModuleName)(HVIS handle, int VismodNum); char* BASSVISDEF(BASS_WINAMPVIS_GetName)(HVIS handle); int BASSVISDEF(BASS_WINAMPVIS_GetNumModules)(char *PluginName); void BASSVISDEF(BASS_WINAMPVIS_SetGenHwndParent)(DWORD hWindow, DWORD hContainer, int x, int y, int width, int height); void BASSVISDEF(BASS_WINAMPVIS_RecordFree)(); void BASSVISDEF(BASS_WINAMPVIS_Quit)(); void BASSVISDEF(BASS_WINAMPVIS_SetConfig)(DWORD option, DWORD value); void BASSVISDEF(BASS_WINAMPVIS_Play)(DWORD handle); void BASSVISDEF(BASS_WINAMPVIS_Pause)(DWORD handle); void BASSVISDEF(BASS_WINAMPVIS_Stop)(DWORD handle); void BASSVISDEF(BASS_WINAMPVIS_SetPlaylistPos)(handle: DWORD, int PlPos); DWORD BASSVISDEF(BASS_WINAMPVIS_GetPlaylistPos)(DWORD handle); DWORD BASSVISDEF(BASS_WINAMPVIS_IsPlaying)(DWORD handle); HVIS BASSVISDEF(BASS_WMPVIS_ExecuteVis)(int PlgListIndex, int PresetIndex, DWORD VisWinhandle, int Left, int Top, int width, int heigth); int BASSVISDEF(BASS_WMPVIS_GetPresetCount)(int PlgListIndex); char* BASSVISDEF(BASS_WMPVIS_GetPresetTitle)(int PlgListIndex, int NumPresets); char* BASSVISDEF(BASS_WMPVIS_GetPluginDescription)(); char* BASSVISDEF(BASS_WMPVIS_FindPlugins)(); DWORD BASSVISDEF(BASS_WMPVIS_GetConfig)(DWORD option); BOOL BASSVISDEF(BASS_WMPVIS_Init)(DWORD AppHandle, DWORD WinHandle); BOOL BASSVISDEF(BASS_WMPVIS_Free)(HVIS handle); BOOL BASSVISDEF(BASS_WMPVIS_IsFree)(); BOOL BASSVISDEF(BASS_WMPVIS_RenderStream)(DWORD StreamHandle); BOOL BASSVISDEF(BASS_WMPVIS_StartRecord)(DWORD SampleRate, int Channels); BOOL BASSVISDEF(BASS_WMPVIS_SetFullScreen)(DWORD SourceHandle, DWORD DestHandle, DWORD SourceLeft, DWORD SourceTop, DWORD SourceWidth, DWORD SourceHeight, BOOL FullScreen, DWORD FullScreeWidth, DWORD FullScreenHeight); void BASSVISDEF(BASS_WMPVIS_SetMediaInfo)(int Channels, int SampleRate, Title: char); void BASSVISDEF(BASS_WMPVIS_SetCurrentPreset)(int PresetIndex); void BASSVISDEF(BASS_WMPVIS_Config)(DWORD hwndOwner); void BASSVISDEF(BASS_WMPVIS_SetConfig)(DWORD option, DWORD value); void BASSVISDEF(BASS_WMPVIS_RecordFree)(); void BASSVISDEF(BASS_WMPVIS_Play)(); void BASSVISDEF(BASS_WMPVIS_Pause)(); void BASSVISDEF(BASS_WMPVIS_Stop)(); void BASSVISDEF(BASS_WMPVIS_Quit)(); char* BASSVISDEF(BASS_VIS_FindPlugins)(char *vispath, DWORD flags); #ifdef __cplusplus } #endif #endif |
Zitat |
Robert Marquardt
(Gast)
n/a Beiträge |
#6
Erst mal zu den Unsauberkeiten und Designschwaechen. Siehe die Kommentare "// (rom)".
Delphi-Quellcode:
//'--------------------------- BassVis API Module -----------------------------
//' BassVis API Module ADD-ON for Bass Audio Library //' Copyright © 2007 BrewIdeas@Emil Weiss, All Rights Reserved //' //' Author(s) of this module: Emil Weiss //' //' Code was written in and formatted for 10pt Courier New //'---------------------------------------------------------------------------- unit BassVis; interface uses Windows; type // (rom) warum nicht THandle? HVIS = DWORD; QWORD = Int64; const // BASS_SONIQUEVIS_CreateVis flags BASS_VIS_NOINIT = 1; // BASS_SONIQUEVIS_SetConfig flags BASS_SONIQUEVIS_CONFIG_FFTAMP = 1; BASS_SONIQUEVIS_CONFIG_FFT_SKIPCOUNT = 2; // Skip count range is from 0 to 3 (because of limited FFT request size) BASS_SONIQUEVIS_CONFIG_WAVE_SKIPCOUNT = 3; // Skip count range is from 0 to (...) try it out, whenever Bass crashes or does not return enough sample data BASS_SONIQUEVIS_CONFIG_SLOWFADE = 4; // Dim light colors to less than half, then slowly fade them out // BASS_WINAMP_SetConfig flags BASS_WINAMPVIS_CONFIG_FFTAMP = 1; // BASS_WMPVIS_SetConfig flags BASS_WMPVIS_CONFIG_FFTAMP = 1; // Bass FFT Amplification values BASS_VIS_FFTAMP_NORMAL = 1; BASS_VIS_FFTAMP_HIGH = 2; BASS_VIS_FFTAMP_HIGHER = 3; BASS_VIS_FFTAMP_HIGHEST = 4; // BASS_VIS_FindPlugin flags BASS_VIS_FIND_SONIQUE = 1; BASS_VIS_FIND_WINAMP = 2; BASS_VIS_FIND_RECURSIVE = 4; // return value type BASS_VIS_FIND_COMMALIST = 8; // Delphi's comma list style (item1,item2,"item 3",item4,"item with space") // the list ends with single NULL character // (rom) Es wird viel zuviel DWORD benutzt. Es gibt z. B. ULONG als Alternative. // (rom) Das ist zwar effektiv das Gleiche, aber der Typname drueckt auch den Verwendungszweck aus. // (rom) aussagekraeftige Parameternamen verwenden function BASS_SONIQUEVIS_CreateVis(f, visconfig:PChar; flags, w, h: DWORD):HVIS; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Render(handle: HVIS; channel: DWORD; canvas: HDC): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Render2(handle: HVIS; data, fft: Pointer; canvas: HDC; flags, pos: DWORD): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Free(handle: HVIS): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_GetName(handle: HVIS): PChar; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Clicked(handle: HVIS; x, y: DWORD): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Resize(handle: HVIS; nw, nh: DWORD): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_GetConfig(option: DWORD): DWORD; stdcall; external 'bass_vis.dll'; // (rom) Boolean ist fast sicher falsch. Boolean ist ein 1-Byte-Typ. Vermutlich ist BOOL gemeint. function BASS_SONIQUEVIS_SetFullScreen(handle: HVIS; SourceHandle: DWORD; DestHandle: DWORD; SourceLeft: DWORD; SourceTop: DWORD; SourceWidth: DWORD; SourceHeight: DWORD; FullScreen: BOOL; FullScreeWidth: DWORD; FullScreenHeight: DWORD): boolean; stdcall; external 'bass_vis.dll'; procedure BASS_SONIQUEVIS_CreateFakeSoniqueWnd; stdcall; external 'bass_vis.dll'; procedure BASS_SONIQUEVIS_DestroyFakeSoniqueWnd; stdcall; external 'bass_vis.dll'; procedure BASS_SONIQUEVIS_SetConfig(option, Value: DWORD); stdcall; external 'bass_vis.dll'; // (rom) auch hier vermute ich das BOOL statt Boolean korrekt ist function BASS_WINAMPVIS_ExecuteVis(PluginName: PChar; moduleNum: integer; ownHdc: boolean; ownHdcW2: boolean): HVIS; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_RenderStream(StreamHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_Free(handle: HVIS): Boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetModuleName(handle: HVIS; VismodNum: integer): PChar; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetName(handle: HVIS): PChar; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_Config(handle: HVIS; VismodNum: Integer): Boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_SetChanInfo(handle: HVIS; title: PChar; filename: PChar; pos, len: DWORD; PListPos: integer; PLLength: integer): Boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_SetChanMPEGInfo(handle: HVIS; SampleRate, BitRate: integer; Duration: DWORD; Channels: integer): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetNumModules(PluginName: PChar):integer; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetHandle(PluginName: PChar): HVIS; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_StartRecord(SampleRate: DWORD; Channels: Integer): boolean; stdcall; external 'bass_vis.dll'; // (rom) Der korrekte Typ fuer ein Fenster-Handle ist HWND. function BASS_WINAMPVIS_GetAmpHwnd: DWORD; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetGenHwnd: DWORD; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_Init(AppHandle: DWORD; WinHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetConfig(option: DWORD): DWORD; stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_SetConfig(option, Value: DWORD); stdcall; external 'bass_vis.dll'; // (rom) HWND procedure BASS_WINAMPVIS_SetGenHwndParent(hWindow : DWORD; hContainer: DWORD; x, y, w, h: Integer); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_RecordFree; stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Quit; stdcall; external 'bass_vis.dll'; // (rom) HWND oder HVIS (vermutlich HVIS). procedure BASS_WINAMPVIS_Play(handle: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Pause(handle: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Stop(handle: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_SetPlaylistPos(handle: DWORD; PlPos: Integer); stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetPlaylistPos(handle: DWORD):integer; stdcall; external 'bass_vis.dll'; // (rom) warum wird kein BOOL zurueckgeliefert? function BASS_WINAMPVIS_IsPlaying(handle: DWORD):integer; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_Init(AppHandle: DWORD; WinHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_ExecuteVis(PlgListIndex: Integer; PresetIndex: Integer; VisWinhandle: DWORD; Left, Top, width, heigth: Integer): HVIS; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetPresetTitle(PlgListIndex: Integer; NumPresets: Integer): PChar; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetPresetCount(PlgListIndex: Integer):integer; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetPluginDescription(): PChar; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_Free(handle: HVIS): boolean; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_RenderStream(StreamHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_FindPlugins(): PChar; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetConfig(option: DWORD): DWORD; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_SetFullScreen(SourceHandle: DWORD; DestHandle: DWORD; SourceLeft: DWORD; SourceTop: DWORD; SourceWidth: DWORD; SourceHeight: DWORD; FullScreen: BOOL; FullScreeWidth: DWORD; FullScreenHeight: DWORD): boolean; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Resize(SourceWidth: DWORD; SourceHeight: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_SetCurrentPreset(PresetIndex: Integer); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Config(hwndOwner: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_SetConfig(option, Value: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_SetMediaInfo(Channels: integer; SampleRate: integer; Title: string); stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_StartRecord(SampleRate: DWORD; Channels: Integer): boolean; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_RecordFree; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Play; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Pause; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Stop; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Quit; stdcall; external 'bass_vis.dll'; function BASS_VIS_FindPlugins(vispath: PChar; flags: DWORD): PChar; stdcall; external 'bass_vis.dll'; implementation end. |
Zitat |
EWeiss
(Gast)
n/a Beiträge |
#7
Hi Robert erstmal Danke für das auseinandernehmen der API
Zitat:
// (rom) warum nicht THandle?
HVIS = DWORD; Und der Wert nichts mit einem THandle zu tun hat. Result := DWORD(Vismod[moduleNum]);
Zitat:
// (rom) aussagekraeftige Parameternamen verwenden
visConfig sagt mir das hier die konfiguration (Pfad zur Konfig) der Vis übergeben werden soll weiss nun nicht was da nicht aussagekräftig ist ?
Zitat:
// (rom) Boolean ist fast sicher falsch. Boolean ist ein 1-Byte-Typ. Vermutlich ist BOOL gemeint.
Brauche werde LongBool noch WordBool
Zitat:
ByteBool / Boolean = 1 Byte true oder false boolescher Wert
WordBool = 2 Byte true oder false boolescher Wert LongBool = 4 Byte true oder false boolescher Wert
Zitat:
// (rom) Der korrekte Typ fuer ein Fenster-Handle ist HWND.
In VB ist es long der name sagt da nichts aus Übergebe ich nur HWND weiss VB nicht ob es ein integer, long oder sonstiger wert ist. Bei VB sieht das so aus. HWND as Long Wenn ich also nur HWND aus Delphi übergebe kennt VB den Wert nicht! Bei DWORD gibt es kein Problem damit.
Zitat:
// (rom) HWND oder HVIS (vermutlich HVIS).
procedure BASS_WINAMPVIS_Play(handle: DWORD); stdcall; external 'bass_vis.dll'; Deshalb auch hier nicht HVIS (könnte man aber ändern)
Zitat:
// (rom) warum wird kein BOOL zurueckgeliefert?
function BASS_WINAMPVIS_IsPlaying(handle: DWORD):integer; stdcall; external 'bass_vis.dll'; 1 = Play, 0 = stop, 3 = pause gruss Emil |
Zitat |
Robert Marquardt
(Gast)
n/a Beiträge |
#8
HVIS ist ok.
f, w, h sind keine aussagekraeftige Namen. Boolean ist sicher falsch, da das .h File BOOL deklariert fuer die Rueckgabewerte und Parameter. BOOL ist 4 Byte lang. BOOL verwenden (ist in Windows.pas enthalten). Immer den korrekten Typ verwenden, HWND bzw HVIS. Das macht das API verstaendlicher. VB steht hier nicht zur Debatte. BASS_WINAMPVIS_IsPlaying ist also ein schlechter Name. BASS_WINAMPVIS_PlayState waere besser. "Is" deutet immer einen booleschen Rueckgabewert an und mit den nachlaessig gbenutzten Typen kann man nicht erkennen das hier eben kein boolescher Wert geliefert wird. |
Zitat |
EWeiss
(Gast)
n/a Beiträge |
#9
Zitat:
Boolean ist sicher falsch, da das .h File BOOL deklariert fuer die Rueckgabewerte und Parameter. BOOL ist 4 Byte lang. BOOL verwenden (ist in Windows.pas enthalten).
Das -h file habe ich ja selbst erstellt kann da also ändern was ich will
Zitat:
f, w, h sind keine aussagekraeftige Namen.
Zitat:
Immer den korrekten Typ verwenden, HWND bzw HVIS. Das macht das API verstaendlicher.
Zitat:
VB steht hier nicht zur Debatte.
Da muss ich also darauf achten das auch übergebene variabeln aus Delphi dort funktionieren.
Zitat:
BASS_WINAMPVIS_PlayState waere besser.
Dann aber BASS_WINAMPVIS_GetPlayState da ich ihn erfragen will nur BASS_WINAMPVIS_PlayState würde bei mir eine übergabe vorraussetzen. gruss Emil |
Zitat |
EWeiss
(Gast)
n/a Beiträge |
#10
Wäre jemand bereit mir ein Sample oder beispiel zu zeigen
wie man die ganzen funktionen am besten zusammenführt ohne viel am Code selbst ändern zu müssen? Wir sind leider etwas vom eigentlichen thema abgekommen. Meine Idee ist erstmal eine type anstatt einer Const zu verwenden
Delphi-Quellcode:
Wenn eine neue Instanz von außen erstellt wird wie müßte die classe am besten generiert werden
Type
BassVisTypes = (Winamp, Sonique, WinMediaplayer) VisTyes : BassVisTypes; class(Tcomponent) oder wie ? Im moment verwende ich eine classe TBASSVis = class(TComponent) wenn möglich sollte diese erhalten bleiben aber aus der anderen gesteuert werden können. Jaja mir fehlt noch einiges an wissen Deshalb frage ich ja. gruss Emil |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |