#ifndef NULLSOFT_VISH #define NULLSOFT_VISH // Visualization plugin interface typedef struct winampVisModule { char *description; // description of module HWND hwndParent; // parent window (filled in by calling app) HINSTANCE hDllInstance; // instance handle to this DLL (filled in by calling app) int sRate; // sample rate (filled in by calling app) int nCh; // number of channels (filled in...) int latencyMs; // latency from call of RenderFrame to actual drawing // (calling app looks at this value when getting data) int delayMs; // delay between calls in ms // the data is filled in according to the respective Nch entry int spectrumNch; int waveformNch; unsigned char spectrumData[2][576]; unsigned char waveformData[2][576]; void (__cdecl *Config)(struct winampVisModule *this_mod); // configuration dialog int (__cdecl *Init)(struct winampVisModule *this_mod); // 0 on success, creates window, etc int (__cdecl *Render)(struct winampVisModule *this_mod); // returns 0 if successful, 1 if vis should end void (__cdecl *Quit)(struct winampVisModule *this_mod); // call when done void *userData; // user data, optional } winampVisModule; typedef struct { int version; // VID_HDRVER char *description; // description of library winampVisModule* (__cdecl *getModule)(int); } winampVisHeader; // exported symbols #ifdef USE_VIS_HDR_HWND typedef winampVisHeader* (__cdecl *winampVisGetHeaderType)(HWND); // version of current module (0x102 == 1.02) #define VIS_HDRVER 0x102 #else typedef winampVisHeader* (__cdecl *winampVisGetHeaderType)(); // version of current module (0x101 == 1.01) #define VIS_HDRVER 0x101 #endif // Version note: // // Updated to 1.02 for 5.36+ // Added passing of Winamp's main hwnd in the call to the exported winampVisGetHeader() // which allows for primarily the use of localisation features with the bundled plugins. // If you want to use the new version then either you can edit you version of vis.h or // you can add USE_VIS_HRD_HWND to your project's defined list or before use of vis.h // // Miscellaneous notes: // * Any window that remains in foreground should optimally pass keystrokes to the parent // (Winamp's) window, so that the user can still control it unless escape is pressed or // some option key specific to the visualization is pressed. // * Storing configuration can be done any where though it's recommended to use the api // IPC_GETINIDIRECTORY as the basis of the path to save things to e.g. INIDIR\plugins\plugin.ini // * ints are 32 bits and structure members are aligned on the default 8 byte boundaries. // These are the return values to be used with the uninstall plugin export function: // __declspec(dllexport) int __cdecl winampUninstallPlugin(HINSTANCE hDllInst, HWND hwndDlg, int param) // which determines if Winamp can uninstall the plugin immediately or on winamp restart. // If this is not exported then Winamp will assume an uninstall with reboot is the only way. // Note: visualization plugins are always uninstalled without a reboot (unlike other plugin types). // #define VIS_PLUGIN_UNINSTALL_NOW 0x0 // // Uninstall support was added from 5.0+ and uninstall now support from 5.5+ though note // that it is down to you to ensure that if uninstall now is returned that it will not // cause a crash i.e. don't use if you've been subclassing the main window. // // The HWND passed in the calling of winampUninstallPlugin(..) is the preference page HWND. // // For a vis plugin to be correctly detected by Winamp you need to ensure that // the exported winampVisGetHeader(..) is exported as an undecorated function // e.g. // #ifdef __cplusplus // extern "C" { // #endif // __declspec(dllexport) winampVisHeader * __cdecl winampVisGetHeader(){ return &plugin; } // #ifdef __cplusplus // } // #endif // #endif