From 8d9113d8ac4876f754fc0ddc47cafb2cbba56db5 Mon Sep 17 00:00:00 2001 From: Josh Coalson Date: Wed, 8 Jan 2003 07:57:59 +0000 Subject: [PATCH] initial import --- src/plugin_winamp2/include/Makefile.am | 18 + src/plugin_winamp2/include/winamp2/Makefile.am | 21 ++ src/plugin_winamp2/include/winamp2/frontend.h | 441 +++++++++++++++++++++++++ src/plugin_winamp2/include/winamp2/in2.h | 104 ++++++ src/plugin_winamp2/include/winamp2/out.h | 55 +++ 5 files changed, 639 insertions(+) create mode 100644 src/plugin_winamp2/include/Makefile.am create mode 100644 src/plugin_winamp2/include/winamp2/Makefile.am create mode 100644 src/plugin_winamp2/include/winamp2/frontend.h create mode 100644 src/plugin_winamp2/include/winamp2/in2.h create mode 100644 src/plugin_winamp2/include/winamp2/out.h diff --git a/src/plugin_winamp2/include/Makefile.am b/src/plugin_winamp2/include/Makefile.am new file mode 100644 index 0000000..7342cca --- /dev/null +++ b/src/plugin_winamp2/include/Makefile.am @@ -0,0 +1,18 @@ +# in_flac - Winamp2 FLAC input plugin +# Copyright (C) 2000,2001,2002,2003 Josh Coalson +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +SUBDIRS = winamp2 diff --git a/src/plugin_winamp2/include/winamp2/Makefile.am b/src/plugin_winamp2/include/winamp2/Makefile.am new file mode 100644 index 0000000..c3f80d2 --- /dev/null +++ b/src/plugin_winamp2/include/winamp2/Makefile.am @@ -0,0 +1,21 @@ +# in_flac - Winamp2 FLAC input plugin +# Copyright (C) 2000,2001,2002,2003 Josh Coalson +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +EXTRA_DIST = \ + frontend.h \ + in2.h \ + out.h diff --git a/src/plugin_winamp2/include/winamp2/frontend.h b/src/plugin_winamp2/include/winamp2/frontend.h new file mode 100644 index 0000000..d5f7e20 --- /dev/null +++ b/src/plugin_winamp2/include/winamp2/frontend.h @@ -0,0 +1,441 @@ +#ifndef _WAFE_H_ +#define _WAFE_H_ +/* +** Winamp frontend/plug-in control API documentation v1.1. +** By Justin Frankel. Updates by Christophe Thibault. +** Copyright (C) 1997-2000, Nullsoft Inc. +** Last updated: JUL.12.2000. +** +** Introduction +** ----------------------- +** This file describes a means to easily communicate to Winamp +** via the classic Win32 Message API. +** +** These definitions/code assume C/C++. Porting to VB/Delphi shouldn't +** be too hard. +** +** First, you find the HWND of the Winamp main window. From a plug-in +** you can easily extract this from the plug-in structure (hMainWindow, +** hwndParent, whatever). For external apps, use: +** +** HWND hwnd_winamp = FindWindow("Winamp v1.x",NULL); +** +** (note: I know, we're in Winamp 2.x, but it's 1.x for compatibility) +** +** Once you have the hwnd_winamp, it's a good idea to check the version +** number. To do this, you send a WM_WA_IPC message to hwnd_winamp. +** Note that WM_WA_IPC is defined as Win32's WM_USER. +** +** Note that sometimes you might want to use PostMessage instead of +** SendMessage. +*/ + +#define WM_WA_IPC WM_USER + +/**************************************************************************/ + +#define IPC_GETVERSION 0 + +/* +** int version = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETVERSION); +** +** Version will be 0x20yx for winamp 2.yx. versions previous to Winamp 2.0 +** typically (but not always) use 0x1zyx for 1.zx versions. Weird, I know. +** +** The basic format for sending messages to Winamp is: +** int result=SendMessage(hwnd_winamp,WM_WA_IPC,command_data,command); +** (for the version check, command_data is 0). +*/ + + +#define IPC_DELETE 101 + +/* +** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_DELETE); +** +** You can use IPC_DELETE to clear Winamp's internal playlist. +*/ + + +#define IPC_STARTPLAY 102 + +/* +** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_STARTPLAY); +** +** Using IPC_STARTPLAY is like hitting 'Play' in Winamp, mostly. +*/ + + +#define IPC_ISPLAYING 104 + +/* +** int res = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_ISPLAYING); +** +** IPC_ISPLAYING returns the status of playback. +** If it returns 1, it is playing. if it returns 3, it is paused, +** if it returns 0, it is not playing. +*/ + + +#define IPC_GETOUTPUTTIME 105 + +/* +** int res = SendMessage(hwnd_winamp,WM_WA_IPC,mode,IPC_GETOUTPUTTIME); +** +** IPC_GETOUTPUTTIME returns the position in milliseconds of the +** current song (mode = 0), or the song length, in seconds (mode = 1). +** Returns -1 if not playing or error. +*/ + + +#define IPC_JUMPTOTIME 106 + +/* (requires Winamp 1.60+) +** SendMessage(hwnd_winamp,WM_WA_IPC,ms,IPC_JUMPTOTIME); +** IPC_JUMPTOTIME sets the position in milliseconds of the +** current song (approximately). +** Returns -1 if not playing, 1 on eof, or 0 if successful +*/ + + +#define IPC_WRITEPLAYLIST 120 + +/* (requires Winamp 1.666+) +** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_WRITEPLAYLIST); +** +** IPC_WRITEPLAYLIST writes the current playlist to \\Winamp.m3u, +** and returns the current playlist position. +** Kinda obsoleted by some of the 2.x new stuff, but still good for when +** using a front-end (instead of a plug-in) +*/ + + +#define IPC_SETPLAYLISTPOS 121 + +/* (requires Winamp 2.0+) +** SendMessage(hwnd_winamp,WM_WA_IPC,position,IPC_SETPLAYLISTPOS) +** +** IPC_SETPLAYLISTPOS sets the playlsit position to 'position'. +*/ + + +#define IPC_SETVOLUME 122 + +/* (requires Winamp 2.0+) +** SendMessage(hwnd_winamp,WM_WA_IPC,volume,IPC_SETVOLUME); +** +** IPC_SETVOLUME sets the volume of Winamp (from 0-255). +*/ + + +#define IPC_SETPANNING 123 + +/* (requires Winamp 2.0+) +** SendMessage(hwnd_winamp,WM_WA_IPC,panning,IPC_SETPANNING); +** +** IPC_SETPANNING sets the panning of Winamp (from 0 (left) to 255 (right)). +*/ + + +#define IPC_GETLISTLENGTH 124 + +/* (requires Winamp 2.0+) +** int length = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETLISTLENGTH); +** +** IPC_GETLISTLENGTH returns the length of the current playlist, in +** tracks. +*/ + + +#define IPC_SETSKIN 200 + +/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) +** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)"skinname",IPC_SETSKIN); +** +** IPC_SETSKIN sets the current skin to "skinname". Note that skinname +** can be the name of a skin, a skin .zip file, with or without path. +** If path isn't specified, the default search path is the winamp skins +** directory. +*/ + + +#define IPC_GETSKIN 201 + +/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) +** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)skinname_buffer,IPC_GETSKIN); +** +** IPC_GETSKIN puts the directory where skin bitmaps can be found +** into skinname_buffer. +** skinname_buffer must be MAX_PATH characters in length. +** When using a .zip'd skin file, it'll return a temporary directory +** where the ZIP was decompressed. +*/ + + +#define IPC_EXECPLUG 202 + +/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) +** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)"vis_file.dll",IPC_EXECPLUG); +** +** IPC_EXECPLUG executes a visualization plug-in pointed to by WPARAM. +** the format of this string can be: +** "vis_whatever.dll" +** "vis_whatever.dll,0" // (first mod, file in winamp plug-in dir) +** "C:\\dir\\vis_whatever.dll,1" +*/ + + +#define IPC_GETPLAYLISTFILE 211 + +/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) +** char *name=SendMessage(hwnd_winamp,WM_WA_IPC,index,IPC_GETPLAYLISTFILE); +** +** IPC_GETPLAYLISTFILE gets the filename of the playlist entry [index]. +** returns a pointer to it. returns NULL on error. +*/ + + +#define IPC_GETPLAYLISTTITLE 212 + +/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) +** char *name=SendMessage(hwnd_winamp,WM_WA_IPC,index,IPC_GETPLAYLISTTITLE); +** +** IPC_GETPLAYLISTTITLE gets the title of the playlist entry [index]. +** returns a pointer to it. returns NULL on error. +*/ + + +#define IPC_GETLISTPOS 125 + +/* (requires Winamp 2.05+) +** int pos=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETLISTPOS); +** +** IPC_GETLISTPOS returns the playlist position. A lot like IPC_WRITEPLAYLIST +** only faster since it doesn't have to write out the list. Heh, silly me. +*/ + + +#define IPC_GETINFO 126 + +/* (requires Winamp 2.05+) +** int inf=SendMessage(hwnd_winamp,WM_WA_IPC,mode,IPC_GETINFO); +** +** IPC_GETINFO returns info about the current playing song. The value +** it returns depends on the value of 'mode'. +** Mode Meaning +** ------------------ +** 0 Samplerate (i.e. 44100) +** 1 Bitrate (i.e. 128) +** 2 Channels (i.e. 2) +*/ + + +#define IPC_GETEQDATA 127 + +/* (requires Winamp 2.05+) +** int data=SendMessage(hwnd_winamp,WM_WA_IPC,pos,IPC_GETEQDATA); +** +** IPC_GETEQDATA queries the status of the EQ. +** The value returned depends on what 'pos' is set to: +** Value Meaning +** ------------------ +** 0-9 The 10 bands of EQ data. 0-63 (+20db - -20db) +** 10 The preamp value. 0-63 (+20db - -20db) +** 11 Enabled. zero if disabled, nonzero if enabled. +** 12 Autoload. zero if disabled, nonzero if enabled. +*/ + + +#define IPC_SETEQDATA 128 +/* (requires Winamp 2.05+) +** SendMessage(hwnd_winamp,WM_WA_IPC,pos,IPC_GETEQDATA); +** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_SETEQDATA); +** +** IPC_SETEQDATA sets the value of the last position retrieved +** by IPC_GETEQDATA. +*/ + +#define IPC_ADDBOOKMARK 129 +/* (requires Winamp 2.4+) +** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)file,IPC_ADDBOOKMARK); +** +** IPC_ADDBOOKMARK will add the specified file to the Winamp bookmark list. +*/ + +#define IPC_RESTARTWINAMP 135 +/* (requires Winamp 2.2+) +** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_RESTARTWINAMP); +** +** IPC_RESTARTWINAMP will restart Winamp (isn't that obvious ? :) +*/ + +#define IPC_MBOPEN 241 +/* (requires Winamp 2.05+) +** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_MBOPEN); +** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)url,IPC_MBOPEN); +** +** IPC_MBOPEN will open a new URL in the minibrowser. if url is NULL, it will open the Minibrowser window. +*/ + +#define IPC_INETAVAILABLE 242 +/* (requires Winamp 2.05+) +** val=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_INETAVAILABLE); +** +** IPC_INETAVAILABLE will return 1 if the Internet connection is available for Winamp. +*/ + +#define IPC_UPDTITLE 243 +/* (requires Winamp 2.2+) +** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_UPDTITLE); +** +** IPC_UPDTITLE will ask Winamp to update the informations about the current title. +*/ + +#define IPC_CHANGECURRENTFILE 245 +/* (requires Winamp 2.05+) +** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)file,IPC_CHANGECURRENTFILE); +** +** IPC_CHANGECURRENTFILE will set the current playlist item. +*/ + +#define IPC_GETMBURL 246 +/* (requires Winamp 2.2+) +** char buffer[4096]; // Urls can be VERY long +** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)buffer,IPC_GETMBURL); +** +** IPC_GETMBURL will retrieve the current Minibrowser URL into buffer. +*/ + +#define IPC_REFRESHPLCACHE 247 +/* (requires Winamp 2.2+) +** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_REFRESHPLCACHE); +** +** IPC_REFRESHPLCACHE will flush the playlist cache buffer. +*/ + +#define IPC_MBBLOCK 248 +/* (requires Winamp 2.4+) +** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_MBBLOCK); +** +** IPC_MBBLOCK will block the Minibrowser from updates if value is set to 1 +*/ + +#define IPC_MBOPENREAL 249 +/* (requires Winamp 2.4+) +** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)url,IPC_MBOPENREAL); +** +** IPC_MBOPENREAL works the same as IPC_MBOPEN except that it will works even if +** IPC_MBBLOCK has been set to 1 +*/ + +#define IPC_GET_SHUFFLE 250 +/* (requires Winamp 2.4+) +** val=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GET_SHUFFLE); +** +** IPC_GET_SHUFFLE returns the status of the Shuffle option (1 if set) +*/ + +#define IPC_GET_REPEAT 251 +/* (requires Winamp 2.4+) +** val=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GET_REPEAT); +** +** IPC_GET_REPEAT returns the status of the Repeat option (1 if set) +*/ + +#define IPC_SET_SHUFFLE 252 +/* (requires Winamp 2.4+) +** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_SET_SHUFFLE); +** +** IPC_SET_SHUFFLE sets the status of the Shuffle option (1 to turn it on) +*/ + +#define IPC_SET_REPEAT 253 +/* (requires Winamp 2.4+) +** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_SET_REPEAT); +** +** IPC_SET_REPEAT sets the status of the Repeat option (1 to turn it on) +*/ + +/**************************************************************************/ + +/* +** Some API calls tend to require that you send data via WM_COPYDATA +** instead of WM_USER. Such as IPC_PLAYFILE: +*/ + +#define IPC_PLAYFILE 100 + +/* +** COPYDATASTRUCT cds; +** cds.dwData = IPC_PLAYFILE; +** cds.lpData = (void *) "file.mp3"; +** cds.cbData = strlen((char *) cds.lpData)+1; // include space for null char +** SendMessage(hwnd_winamp,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds); +** +** This will play the file "file.mp3". +** +*/ + + +#define IPC_CHDIR 103 + +/* +** COPYDATASTRUCT cds; +** cds.dwData = IPC_CHDIR; +** cds.lpData = (void *) "c:\\download"; +** cds.cbData = strlen((char *) cds.lpData)+1; // include space for null char +** SendMessage(hwnd_winamp,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds); +** +** This will make Winamp change to the directory C:\\download +** +*/ + + +/**************************************************************************/ + +/* +** Finally there are some WM_COMMAND messages that you can use to send +** Winamp misc commands. +** +** To send these, use: +** +** SendMessage(hwnd_winamp, WM_COMMAND,command_name,0); +*/ + +#define WINAMP_OPTIONS_EQ 40036 // toggles the EQ window +#define WINAMP_OPTIONS_PLEDIT 40040 // toggles the playlist window +#define WINAMP_VOLUMEUP 40058 // turns the volume up a little +#define WINAMP_VOLUMEDOWN 40059 // turns the volume down a little +#define WINAMP_FFWD5S 40060 // fast forwards 5 seconds +#define WINAMP_REW5S 40061 // rewinds 5 seconds + +// the following are the five main control buttons, with optionally shift +// or control pressed +// (for the exact functions of each, just try it out) +#define WINAMP_BUTTON1 40044 +#define WINAMP_BUTTON2 40045 +#define WINAMP_BUTTON3 40046 +#define WINAMP_BUTTON4 40047 +#define WINAMP_BUTTON5 40048 +#define WINAMP_BUTTON1_SHIFT 40144 +#define WINAMP_BUTTON2_SHIFT 40145 +#define WINAMP_BUTTON3_SHIFT 40146 +#define WINAMP_BUTTON4_SHIFT 40147 +#define WINAMP_BUTTON5_SHIFT 40148 +#define WINAMP_BUTTON1_CTRL 40154 +#define WINAMP_BUTTON2_CTRL 40155 +#define WINAMP_BUTTON3_CTRL 40156 +#define WINAMP_BUTTON4_CTRL 40157 +#define WINAMP_BUTTON5_CTRL 40158 + +#define WINAMP_FILE_PLAY 40029 // pops up the load file(s) box +#define WINAMP_OPTIONS_PREFS 40012 // pops up the preferences +#define WINAMP_OPTIONS_AOT 40019 // toggles always on top +#define WINAMP_HELP_ABOUT 40041 // pops up the about box :) + + +/* +** EOF.. Enjoy. +*/ + +#endif diff --git a/src/plugin_winamp2/include/winamp2/in2.h b/src/plugin_winamp2/include/winamp2/in2.h new file mode 100644 index 0000000..8886027 --- /dev/null +++ b/src/plugin_winamp2/include/winamp2/in2.h @@ -0,0 +1,104 @@ +/* Standard Winamp input-plugin header + */ + +#include "out.h" + +// note: exported symbol is now winampGetInModule2. + +#define IN_VER 0x100 + +typedef struct +{ + int version; // module type (IN_VER) + char *description; // description of module, with version string + + HWND hMainWindow; // winamp's main window (filled in by winamp) + HINSTANCE hDllInstance; // DLL instance handle (Also filled in by winamp) + + char *FileExtensions; // "mp3\0Layer 3 MPEG\0mp2\0Layer 2 MPEG\0mpg\0Layer 1 MPEG\0" + // May be altered from Config, so the user can select what they want + + int is_seekable; // is this stream seekable? + int UsesOutputPlug; // does this plug-in use the output plug-ins? (musn't ever change, ever :) + + void (*Config)(HWND hwndParent); // configuration dialog + void (*About)(HWND hwndParent); // about dialog + + void (*Init)(); // called at program init + void (*Quit)(); // called at program quit + + void (*GetFileInfo)(char *file, char *title, int *length_in_ms); // if file == NULL, current playing is used + int (*InfoBox)(char *file, HWND hwndParent); + + int (*IsOurFile)(char *fn); // called before extension checks, to allow detection of mms://, etc + // playback stuff + int (*Play)(char *fn); // return zero on success, -1 on file-not-found, some other value on other (stopping winamp) error + void (*Pause)(); // pause stream + void (*UnPause)(); // unpause stream + int (*IsPaused)(); // ispaused? return 1 if paused, 0 if not + void (*Stop)(); // stop (unload) stream + + // time stuff + int (*GetLength)(); // get length in ms + int (*GetOutputTime)(); // returns current output time in ms. (usually returns outMod->GetOutputTime() + void (*SetOutputTime)(int time_in_ms); // seeks to point in stream (in ms). Usually you signal yoru thread to seek, which seeks and calls outMod->Flush().. + + // volume stuff + void (*SetVolume)(int volume); // from 0 to 255.. usually just call outMod->SetVolume + void (*SetPan)(int pan); // from -127 to 127.. usually just call outMod->SetPan + + // in-window builtin vis stuff + + void (*SAVSAInit)(int maxlatency_in_ms, int srate); // call once in Play(). maxlatency_in_ms should be the value returned from outMod->Open() + // call after opening audio device with max latency in ms and samplerate + void (*SAVSADeInit)(); // call in Stop() + + + // simple vis supplying mode + void (*SAAddPCMData)(void *PCMData, int nch, int bps, int timestamp); + // sets the spec data directly from PCM data + // quick and easy way to get vis working :) + // needs at least 576 samples :) + + // advanced vis supplying mode, only use if you're cool. Use SAAddPCMData for most stuff. + int (*SAGetMode)(); // gets csa (the current type (4=ws,2=osc,1=spec)) + // use when calling SAAdd() + void (*SAAdd)(void *data, int timestamp, int csa); // sets the spec data, filled in by winamp + + + // vis stuff (plug-in) + // simple vis supplying mode + void (*VSAAddPCMData)(void *PCMData, int nch, int bps, int timestamp); // sets the vis data directly from PCM data + // quick and easy way to get vis working :) + // needs at least 576 samples :) + + // advanced vis supplying mode, only use if you're cool. Use VSAAddPCMData for most stuff. + int (*VSAGetMode)(int *specNch, int *waveNch); // use to figure out what to give to VSAAdd + void (*VSAAdd)(void *data, int timestamp); // filled in by winamp, called by plug-in + + + // call this in Play() to tell the vis plug-ins the current output params. + void (*VSASetInfo)(int nch, int srate); + + + // dsp plug-in processing: + // (filled in by winamp, called by input plug) + + // returns 1 if active (which means that the number of samples returned by dsp_dosamples + // could be greater than went in.. Use it to estimate if you'll have enough room in the + // output buffer + int (*dsp_isactive)(); + + // returns number of samples to output. This can be as much as twice numsamples. + // be sure to allocate enough buffer for samples, then. + int (*dsp_dosamples)(short int *samples, int numsamples, int bps, int nch, int srate); + + + // eq stuff + void (*EQSet)(int on, char data[10], int preamp); // 0-64 each, 31 is +0, 0 is +12, 63 is -12. Do nothing to ignore. + + // info setting (filled in by winamp) + void (*SetInfo)(int bitrate, int srate, int stereo, int synched); // if -1, changes ignored? :) + + Out_Module *outMod; // filled in by winamp, optionally used :) +} In_Module; diff --git a/src/plugin_winamp2/include/winamp2/out.h b/src/plugin_winamp2/include/winamp2/out.h new file mode 100644 index 0000000..e8ad412 --- /dev/null +++ b/src/plugin_winamp2/include/winamp2/out.h @@ -0,0 +1,55 @@ +/* Standard Winamp output-plugin header + */ + +#define OUT_VER 0x10 + +typedef struct +{ + int version; // module version (OUT_VER) + char *description; // description of module, with version string + int id; // module id. each input module gets its own. non-nullsoft modules should + // be >= 65536. + + HWND hMainWindow; // winamp's main window (filled in by winamp) + HINSTANCE hDllInstance; // DLL instance handle (filled in by winamp) + + void (*Config)(HWND hwndParent); // configuration dialog + void (*About)(HWND hwndParent); // about dialog + + void (*Init)(); // called when loaded + void (*Quit)(); // called when unloaded + + int (*Open)(int samplerate, int numchannels, int bitspersamp, int bufferlenms, int prebufferms); + // returns >=0 on success, <0 on failure + // NOTENOTENOTE: bufferlenms and prebufferms are ignored in most if not all output plug-ins. + // ... so don't expect the max latency returned to be what you asked for. + // returns max latency in ms (0 for diskwriters, etc) + // bufferlenms and prebufferms must be in ms. 0 to use defaults. + // prebufferms must be <= bufferlenms + + void (*Close)(); // close the ol' output device. + + int (*Write)(char *buf, int len); + // 0 on success. Len == bytes to write (<= 8192 always). buf is straight audio data. + // 1 returns not able to write (yet). Non-blocking, always. + + int (*CanWrite)(); // returns number of bytes possible to write at a given time. + // Never will decrease unless you call Write (or Close, heh) + + int (*IsPlaying)(); // non0 if output is still going or if data in buffers waiting to be + // written (i.e. closing while IsPlaying() returns 1 would truncate the song + + int (*Pause)(int pause); // returns previous pause state + + void (*SetVolume)(int volume); // volume is 0-255 + void (*SetPan)(int pan); // pan is -128 to 128 + + void (*Flush)(int t); // flushes buffers and restarts output at time t (in ms) + // (used for seeking) + + int (*GetOutputTime)(); // returns played time in MS + int (*GetWrittenTime)(); // returns time written in MS (used for synching up vis stuff) + +} Out_Module; + + -- 2.7.4