AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Neustrukturierung einer DLL

Ein Thema von EWeiss · begonnen am 5. Jul 2007 · letzter Beitrag vom 7. Jul 2007
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
EWeiss
(Gast)

n/a Beiträge
 
#1

Neustrukturierung einer DLL

  Alt 5. Jul 2007, 13:41
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:
//'--------------------------- 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.
gruss Emil
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#2

Re: Neustrukturierung einer DLL

  Alt 5. Jul 2007, 13:53
Na mach als ersten Parameter aller Funktionen eine ID.
Delphi-Quellcode:
const
  BASSVIS_SONIQUE = 1;
  BASSVIS_WINAMP = 2;
  BASSVIS_WMP = 3;
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.
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

Re: Neustrukturierung einer DLL

  Alt 5. Jul 2007, 14:11
Zitat von Robert Marquardt:
Na mach als ersten Parameter aller Funktionen eine ID.
Delphi-Quellcode:
const
  BASSVIS_SONIQUE = 1;
  BASSVIS_WINAMP = 2;
  BASSVIS_WMP = 3;
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.
.
Wie meinst du das mit SuperSet wie sollte das aussehen.
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.
Geht nicht da ein FakeWindow nur für bestimmte Plugins von nöten sind dieses wird nicht grundsätzlich generiert.
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
Du meinst
Delphi-Quellcode:
Const
BASSVIS_API : String = 'BassVis.Dll'
welchen vorteil bringt mir das ? bzw.. was spart das.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

Re: Neustrukturierung einer DLL

  Alt 5. Jul 2007, 14:24
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:
const
  BassVisDllName = 'bass_vis.dll';
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

Re: Neustrukturierung einer DLL

  Alt 5. Jul 2007, 14:40
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.
Bitte benenne mir einige damit ich es in zukunft besser machen kann
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.
Nein ein Fenster welches dem jeweiligen Plugin zugewiesen wird das es für seine eigenschaften benötigt.
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';
Ja ok wie man es letztendlich benennt ist egal
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
Ok das kann ich nachvollziehen.

Wie meinst du das mit SuperSet wie sollte das aussehen.

das *.h File sieht so aus und wie gesagt bisher keine fehler gemeldet!
Code:
#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
gruss Emil
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#6

Re: Neustrukturierung einer DLL

  Alt 5. Jul 2007, 15:05
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

Re: Neustrukturierung einer DLL

  Alt 5. Jul 2007, 15:38
Hi Robert erstmal Danke für das auseinandernehmen der API

Zitat:
// (rom) warum nicht THandle?
HVIS = DWORD;
Weil unter Bass HVIS auch als DWORD deklariert ist!
Und der Wert nichts mit einem THandle zu tun hat.

Result := DWORD(Vismod[moduleNum]);
Zitat:
// (rom) aussagekraeftige Parameternamen verwenden
Was verstehst du darunter?
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.
Reicht für TRUE,FALSE nicht 1-Byte -Typ? mehr ist das doch nicht
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.
theoretisch
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';
handle ist die allgemeine Variable für HVIS unter Bass da weiss jeder was damit gemeint ist.
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';
Deshalb nicht weil es hier um Integer werte und nicht um bool geht.
1 = Play, 0 = stop, 3 = pause

gruss Emil
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#8

Re: Neustrukturierung einer DLL

  Alt 5. Jul 2007, 16:11
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

Re: Neustrukturierung einer DLL

  Alt 5. Jul 2007, 16:28
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).
Da bin ich variabel könnt es im .h file ja nach boolean umbenennen wäre auch kein Beinbruch wenn in c möglich
Das -h file habe ich ja selbst erstellt kann da also ändern was ich will

Zitat:
f, w, h sind keine aussagekraeftige Namen.
korrekt

Zitat:
Immer den korrekten Typ verwenden, HWND bzw HVIS. Das macht das API verstaendlicher.
Ok kann ich ändern.

Zitat:
VB steht hier nicht zur Debatte.
Doch denn meine App ist in VB geschrieben die möchte ich gerne noch mit meiner Lib in Delphi geschrieben verwenden.
Da muss ich also darauf achten das auch übergebene variabeln aus Delphi dort funktionieren.

Zitat:
BASS_WINAMPVIS_PlayState waere besser.
Richtig .. Werde ich ebenfalls übernehmen
Dann aber
BASS_WINAMPVIS_GetPlayState da ich ihn erfragen will nur BASS_WINAMPVIS_PlayState
würde bei mir eine übergabe vorraussetzen.

gruss Emil
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

Re: Neustrukturierung einer DLL

  Alt 6. Jul 2007, 07:49
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:
Type
BassVisTypes = (Winamp, Sonique, WinMediaplayer)

VisTyes : BassVisTypes;
Wenn eine neue Instanz von außen erstellt wird wie müßte die classe am besten generiert werden
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf