/* ** 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. */ #ifndef _WAFE_H_ #define _WAFE_H_ #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 //_WAFE_H_