Вы находитесь на странице: 1из 11

(*

** Winamp 1.x/2.x/5.x SDK


**
** This is the modern replacement for the classic 'frontend.h'. Most of these
** updates are designed for in-process use, i.e. from a plugin.
** Copyright (C) 2003 Nullsoft, Inc.
**
** Портировал на Delphi Slava Antonov (ai@omskmail.ru)
** Copyrights (с) 2003
**
** Введение
** --------
** В этом файле описываются команды для управления Winamp
** используя Win32 Message API.
**
** Для начала, вам нужно определить дескриптор главного окна Winamp.
** Однако, если вы пишете плагин, то Winamp сам передаст дескриптор при
** загрузке плагина в соответсвующую структуру (hwndWinamp).
** hwndWinamp:= FindWindow("Winamp v1.x", nil);
**
** После того как вы определили дескриптор, неплохо бы проверить
** номер версии Winamp.
**
** Замечание: в некоторых случаях вы можете использовать PostMessage
** вместо SendMessage.
*)
unit WinampSDK;
interface
uses Messages, Windows;
type
TPlayingStatus = (psStop, psPlay, psPause);
const
WM_WA_IPC = WM_USER;
IPC_GetVersion = 0;
(*
** ver:= SendMessage(hWinamp, WM_WA_IPC, 0, IPC_GetVersion);
**
** Для Winamp 2.yx номер версии имеет следующий формат - 2y0x, для
** Winamp 1.zx - 1zyx
*)
type
TenqueueFileWithMetaStruct = packed record
FileName: PChar;
Title: PChar;
Length: Integer;
end;
// send this to a IPC_PLAYFILE in a non WM_COPYDATA,
// and you get the nice desired result. if title is NULL, it is treated as a "th
ing",
// otherwise it's assumed to be a file (for speed)
const
IPC_PLAYFILE = 100; // это и в самом деле тоже самое что и IPC_ENQUEUEFILE
IPC_ENQUEUEFILE = 100;
(* используется аналогичко WM_COPYDATA, с IPC_PLAYFILE в качестве dwData,
** и строкой для воспроизведение как lpData.
** Просто добавляет файл в список воспроизведения, не очищая его, и не
** переключая текущую композицию.
*)
IPC_Delete = 101;
(*
** SendMessage(hwndWinamp, WM_WA_IPC, 0, IPC_Delete);
**
** Полностью очищает список воспроизведения.
*)
IPC_StartPlay = 102;
(*
** SendMessage(hwndWinamp, WM_WA_IPC, 0, IPC_StartPlay);
**
** В основном IPC_StartPlay соответсвует нажатию кнопки 'Play' в Winamp.
*)
IPC_CHDIR = 103;
(*
** посылается так же как и WM_COPYDATA
** dwData = IPC_CHDIR
** lpData = Имя папки
*)
IPC_IsPlaying = 104;
(*
** res:= SendMessage(hwndWinamp, WM_WA_IPC, 0, IPC_IsPlaying);
**
** IPC_IsPlaying возвращает статут воспроизведения.
** 0 - не воспроизводится.
** 1 - воспроизведение.
** 3 - пауза.
*)
IPC_GETOUTPUTTIME = 105;
(*
** res:= SendMessage(hwndWinamp, WM_WA_IPC, mode, IPC_GETOUTPUTTIME);
**
** IPC_GetOutputTime возвращает текущую позицию в милисекундах в
** текущей песне (mode = 0) или продолжительность песни в
** секундах (mode = 1). Возвращает -1 если ничего не воспроизводится
** или в случае ошибки.
*)

IPC_JUMPTOTIME = 106;
(* требуется Winamp 1.60+
**
** SendMessage(hWinamp, WM_WA_IPC, ms, IPC_JumpToTime);
** IPC_JumpToTime перемещает воспроизведение на указанную позицию в
** милисекундах.
** Возвращает:
** 0 - в случае успеха.
** 1 - eof
** -1 - ничего не воспроизводится
*)

IPC_WRITEPLAYLIST = 120;
(* (Winamp 1.666+)
** SendMessage(hWinamp, WM_WA_IPC, 0, IPC_WRITEPLAYLIST);
**
** сохраняет текущий список воспроизведения в \winamp.m3u,
** и возвращает текущую позицию в списке.
*)
IPC_SETPLAYLISTPOS = 121;
(* (Winamp 2.0+)
** SendMessage(hWinamp, WM_WA_IPC, Position, IPC_SETPLAYLISTPOS)
**
** просто делает указанный элемент в списке текущим.
** Не начинает воспроизведения и т.п.
*)
IPC_SETVOLUME = 122;
(* (Winamp 2.0+)
** SendMessage(hWinamp, WM_WA_IPC, Volume, IPC_SETVOLUME);
**
** Устанавливает громкость на указанный уровень от 0 до 255.
** Возвращает текущий уровень громкости если Volume = -666
*)
IPC_SETPANNING = 123;
(* (Winamp 2.0+)
** SendMessage(hWinamp, WM_WA_IPC , Panning, IPC_SETPANNING);
**
** Задает баланс левого и правого канало от 0 (только левый канал) до
** 255 (только правый канал)
*)
IPC_GETLISTLENGTH = 124;
(* (Winamp 2.0+)
** Length:= SendMessage(hWinamp, WM_WA_IPC, 0, IPC_GETLISTLENGTH);
**
** Возвращает кол-во элементов в списке воспроизведения
*)
IPC_GETLISTPOS = 125;
(* (Winamp 2.05+)
** Pos:= SendMessage(hWinamp, WM_WA_IPC, 0, IPC_GETLISTPOS);
**
** Возвращает текущую позицию в списке воспроизведения
*)
IPC_GETINFO = 126;
(* (Winamp 2.05+)
** Inf:= SendMessage(hWinamp, WM_WA_IPC, Mode, IPC_GETINFO);
**
** Возвращает информацию о воспроизводимой композиции. Смысл результата
** функции зависит от значения Mode:
** Mode Смысл
** ------------------
** 0 Samplerate (например 44100)
** 1 Bitrate (например 12 )
** 2 Кол-во каналов (например 2)
*)

IPC_GETEQDATA = 12 ;
(* (Winamp 2.05+)
** Data:= SendMessage(hWinamp, WM_WA_IPC, Pos, IPC_GETEQDATA);
**
** Возвращает различную информацию о настройках эквалайзера.
** Смысл результата зависит от значения Pos:
** Pos Смысл
** ------------------
** 0-  Полосы эквалайзера. Возвращает 0-63 (G - -20db)
** 10 Уровень preamp. 0-63 (G - -20db)
** 11 0 если эквалайзер отключен.
** 12 0 если выключена автоматическая загрузка пресетов.
*)
IPC_SETEQDATA = 12 ;
(* (Winamp 2.05+)
** Data:= SendMessage(hWinamp, WM_WA_IPC, Pos, IPC_GETEQDATA);
** SendMessage(hWinamp, WM_WA_IPC, NewValue, IPC_SETEQDATA);
**
** Позволяет изменять настройки эквалайзера.
** Сначала нужно указать какой параметр вы хотите изменить,
** послав IPC_GETEQDATA, а затем задать новое значение, послав
** IPC_SETEQDATA.
*)
IPC_ADDBOOKMARK = 12 ;
(* (Winamp 2.4+)
** Sent as a WM_COPYDATA, using IPC_ADDBOOKMARK
**
** Добавляет указанный файл/урл в Избранное.
*)
IPC_INSTALLPLUGIN = 130;
(* Пока не реализовано, но если будет, то будет посылаться как
** WM_COPYDATA, где будет указываться путь к файлу .wpz, который
** будет установлен.
*)
IPC_RESTARTWINAMP = 135;
(* (Winamp 2.2+)
** SendMessage(hWinamp, WM_WA_IPC, 0, IPC_RESTARTWINAMP);
** Перезапускает Winamp.
*)

IPC_ISFULLSTOP = 400;
(* (Winamp 2. +)
** Res:= SendMessage(hWinamp, WM_WA_IPC, 0, IPC_ISFULLSTOP);
**
** useful for when you're an output plugin, and you want to see
** if the stop/close is a full stop, or just between tracks.
** returns nonzero if it's full, zero if it's just a new track.
*)
IPC_INETAVAILABLE = 242;
(* (Winamp 2.05+)
** Val:= SendMessage(hWinamp, WM_WA_IPC, 0, IPC_INETAVAILABLE);
**
** 1 если доступно соединение с интернет.
*)
IPC_UPDTITLE = 243;
(* (Winamp 2.2+)
** SendMessage(hWinamp, WM_WA_IPC, 0, IPC_UPDTITLE);
**
** Заставляет Winamp обновить отображаемую информацию о текущей
** композиции в списке воспроизведения.
*)
IPC_CHANGECURRENTFILE = 245;
(* (Winamp 2.05+)
** SendMessage(hWinamp, WM_WA_IPC, Integer(PChar(FileName)), IPC_CHANGECURRENTFI
LE);
**
** Задает текущий файл.
*)
IPC_GETMBURL = 246;
(* (requires Winamp 2.2+)
** char buffer[40 6]; // 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.
*)
IPC_REFRESHPLCACHE = 24 ;
(* (requires Winamp 2.2+)
** SendMessage(hWinamp, WM_WA_IPC, 0, IPC_REFRESHPLCACHE);
**
** Заставляет Winamp обновить информацию о всех композициях
** в списке воспроизведения.
*)
IPC_MBBLOCK = 24 ;
(* (requires Winamp 2.4+)
** SendMessage(hWinamp, WM_WA_IPC, value, IPC_MBBLOCK);
**
** IPC_MBBLOCK will block the Minibrowser from updates if value is set to 1
*)
IPC_MBOPENREAL = 24 ;
(* (requires Winamp 2.4+)
** SendMessage(hWinamp, WM_WA_IPC, Integer(PChar(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
*)
IPC_GET_SHUFFLE = 250;
(* (requires Winamp 2.4+)
** Val:= SendMessage(hWinamp, WM_WA_IPC, 0, IPC_GET_SHUFFLE);
**
** Возвращает 1 если режим перемещивания включен.
*)
IPC_GET_REPEAT = 251;
(* (requires Winamp 2.4+)
** Val:= SendMessage(hWinamp, WM_WA_IPC, 0, IPC_GET_REPEAT);
**
** Возвращает 1 если режим повтора включен.
*)
IPC_SET_SHUFFLE = 252;
(* (requires Winamp 2.4+)
** SendMessage(hWinamp, WM_WA_IPC, Value, IPC_SET_SHUFFLE);
**
** Задает режим перемещивания: 1 - включить, 0 - выключить
*)
IPC_SET_REPEAT = 253;
(* (requires Winamp 2.4+)
** SendMessage(hWinamp, WM_WA_IPC, Value, IPC_SET_REPEAT);
**
** Задает режим перемешивания: 1 - включить, 0 - выключить
*)
IPC_ENABLEDISABLE_ALL_WINDOWS = 25 ;
(* (Winamp 2. +)
** SendMessage(hWinamp, WM_WA_IPC, Value, IPC_ENABLEDISABLE_ALL_WINDOWS);
**
** Вкл./Выкл. все окна Winamp.
** Если Value = DEADBEEF, то все окна будут задизаблены.
*)
IPC_GETWND_EQ = 0;
IPC_GETWND_PE = 1;
IPC_GETWND_MB = 2;
IPC_GETWND_VIDEO = 3;
IPC_GETWND = 260;
(* (Winamp 2. +)
** hWnd:= SendMessage(hWinamp, WM_WA_IPC, IPC_GETWND_xxx, IPC_GETWND);
** возвращяет дескриптор указанного окна Winamp.
*)
(*
** Функции, которые будут работать только из плагинов,
** но не из сторонних приложений
*)
IPC_SETSKIN = 200;
(* (requires Winamp 2.04+, only usable from plug-ins (not external apps))
** SendMessage(hWinamp, WM_WA_IPC, Integer(PChar(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.
*)
IPC_GETSKIN = 201;
(* (requires Winamp 2.04+, only usable from plug-ins (not external apps))
** SendMessage(hWinamp, WM_WA_IPC, Integer(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.
*)
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"
*)
IPC_GETPLAYLISTFILE = 211;
(* (requires Winamp 2.04+, only usable from plug-ins (not external apps))
** FileName:= PChar(SendMessage(hWinamp, 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.
*)
IPC_GETPLAYLISTTITLE = 212;
(* (requires Winamp 2.04+, only usable from plug-ins (not external apps))
** Title:= PChar(SendMessage(hWinamp, 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.
*)
IPC_GETHTTPGETTER = 240;
(* retrieves a function pointer to a HTTP retrieval function.
** if this is unsupported, returns 1 or 0.
** the function should be:
** int (*httpRetrieveFile)(HWND hwnd, char *url, char *file, char *dlgtitle);
** if you call this function, with a parent window, a URL, an output file, and a
dialog title,
** it will return 0 on successful download, 1 on error.
*)
IPC_MBOPEN = 241;
(* (requires Winamp 2.05+)
** SendMessage(hWinamp, WM_WA_IPC,0,IPC_MBOPEN);
** SendMessage(hWinamp, WM_WA_IPC, Integer(PChar(url)), IPC_MBOPEN);
** IPC_MBOPEN will open a new URL in the minibrowser. if url is NULL, it will op
en the Minibrowser window.
*)
IPC_ADJUST_OPTIONSMENUPOS = 2 0;
(* (requires Winamp 2. +)
** NewPos:= SendMessage(hWinamp, WM_WA_IPC, (WPARAM)adjust_offset, IPC_ADJUST_OP
TIONSMENUPOS);
** moves where winamp expects the Options menu in the main menu. Useful if you w
ish to insert a
** menu item above the options/skins/vis menus.
*)
IPC_GET_HMENU = 2 1;
(* (requires Winamp 2. +)
** hMenu:= SendMessage(hWinamp, WM_WA_IPC, 0, IPC_GET_HMENU);
**
** Возвращает дескриптор главного меню Winamp.
*)
IPC_GET_EXTENDED_FILE_INFO = 2 0; //pass a pointer to the following struct in
wParam
(* (requires Winamp 2. +)
** to use, create an extendedFileInfoStruct, point the values filename and metad
ata to the
** filename and metadata field you wish to query, and ret to a buffer, with retl
en to the
** length of that buffer, and then SendMessage(hwnd_winamp,WM_WA_IPC, struct,IPC
_GET_EXTENDED_FILE_INFO);
** the results should be in the buffer pointed to by ret.
** returns 1 if the decoder supports a getExtendedFileInfo method
*)
type
TExtendedFileInfoStruct = packed record
FileName: PChar;
Metadata: PChar;
Ret: PChar;
RetLen: Integer;
end;
const
IPC_GET_BASIC_FILE_INFO = 2 1; //pass a pointer to the following struct in wPa
ram
type
TBasicFileInfoStruct = packed record
FileName: PChar;
QuickCheck: Integer; // set to 0 to always get, 1 for quick, 2 for default (
if 2, quickCheck will be set to 0 if quick wasnot used)
// filled in by winamp
Length: Integer;
Title: PChar;
TitleLen: Integer;
end;
const
IPC_GET_EXTLIST = 2 2;
(* returns doublenull delimited. GlobalFree() it when done.
** if data is 0, returns raw extlist, if 1, returns something
** suitable for getopenfilename
*)
IPC_INFOBOX = 2 3;
type
TInfoBoxParam = packed record
ParentHWND: THandle;
FileName: PChar;
end;
const
IPC_SET_EXTENDED_FILE_INFO = 2 4; //pass a pointer to the a extendedFileInfoSt
ruct in wParam
(* (requires Winamp 2. +)
** to use, create an extendedFileInfoStruct, point the values filename and metad
ata to the
** filename and metadata field you wish to write in ret. (retlen is not used). a
nd then
** SendMessage(hwnd_winamp,WM_WA_IPC, struct,IPC_SET_EXTENDED_FILE_INFO);
** returns 1 if the metadata is supported
** Call IPC_WRITE_EXTENDED_FILE_INFO once you're done setting all the metadata y
ou want to update
*)
IPC_WRITE_EXTENDED_FILE_INFO = 2 5;
(* (requires Winamp 2. +)
** writes all the metadata set thru IPC_SET_EXTENDED_FILE_INFO to the file
** returns 1 if the file has been successfully updated, 0 if error
*)
IPC_ADD_PREFS_DLG = 332;
IPC_REMOVE_PREFS_DLG = 333;
(* (requires Winamp 2. +)
** to use, allocate a prefsDlgRec structure (either on the heap or some global
** data, but NOT on the stack), initialze the members:
** hInst to the DLL instance where the resource is located
** dlgID to the ID of the dialog,
** proc to the window procedure for the dialog
** name to the name of the prefs page in the prefs.
** where to 0 (eventually we may add more options)
** then, SendMessage(hwnd_winamp,WM_WA_IPC, prefsRec,IPC_ADD_PREFS_DLG);
**
** you can also IPC_REMOVE_PREFS_DLG with the address of the same prefsRec,
** but you shouldn't really ever have to.
**
*)
type
PPrefsDlgRec = ^TPrefsDlgRec;
TPrefsDlgRec = packed record
hInst: THandle;
dlgID: Integer;
Proc: Pointer;
Name: PChar;
Where: Integer;
_id: Integer;
Next: PPrefsDlgRec;
end;
const
IPC_GETINIFILE = 334; // returns a pointer to winamp.ini
IPC_OPENURLBOX = 360; // pass a HWND to a parent, returns a HGLOBAL that needs
to be freed with GlobalFree(), if successful
// pass 0 for a copy of the skin HBITMAP
// pass 1 for name of font to use for playlist editor likeness
// pass 2 for font charset
// pass 3 for font size
IPC_GET_GENSKINBITMAP = 503;
IPC_GET_EMBEDIF = 505; // pass an embedWindowState
// returns an HWND embedWindow(embedWindowState *); if the data is NULL, otherwi
se returns the HWND directly
type
TEmbedWindowState = packed record
Me: THandle; //hwnd of the window
Flags: Integer;
Rect: TRect;
User_ptr: Pointer; // for application use
Extra_data: array[0..63] of Integer; // for internal winamp use
end;
const
EMBED_FLAGS_NORESIZE = 1; // set this bit in embedWindowState.flags to keep wi
ndow from being resizable
// system tray sends this (you might want to simulate it)
WM_WA_SYSTRAY = WM_USER + 1;
// input plugins send this when they are done playing back
WM_WA_MPEG_EOF = WM_USER + 2;
(**************************************************************************)
(*
** 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);
*)
WINAMP_OPTIONS_EQ = 40036; // toggles the EQ window
WINAMP_OPTIONS_PLEDIT = 40040; // toggles the playlist window
WINAMP_VOLUMEUP = 4005 ; // turns the volume up a little
WINAMP_VOLUMEDOWN = 4005 ; // turns the volume down a little
WINAMP_FFWD5S = 40060; // fast forwards 5 seconds
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)
WINAMP_BUTTON1 = 40044;
WINAMP_BUTTON2 = 40045;
WINAMP_BUTTON3 = 40046;
WINAMP_BUTTON4 = 4004 ;
WINAMP_BUTTON5 = 4004 ;
WINAMP_BUTTON1_SHIFT = 40144;
WINAMP_BUTTON2_SHIFT = 40145;
WINAMP_BUTTON3_SHIFT = 40146;
WINAMP_BUTTON4_SHIFT = 4014 ;
WINAMP_BUTTON5_SHIFT = 4014 ;
WINAMP_BUTTON1_CTRL = 40154;
WINAMP_BUTTON2_CTRL = 40155;
WINAMP_BUTTON3_CTRL = 40156;
WINAMP_BUTTON4_CTRL = 4015 ;
WINAMP_BUTTON5_CTRL = 4015 ;
WINAMP_FILE_PLAY = 4002 ; // pops up the load file(s) box
WINAMP_OPTIONS_PREFS = 40012; // pops up the preferences
WINAMP_OPTIONS_AOT = 4001 ; // toggles always on top
WINAMP_HELP_ABOUT = 40041; // pops up the about box :)
WINAMP_FILE_QUIT = 40001;
WINAMP_OPTIONS_EASYMOVE = 401 6;
WINAMP_REFRESHSKIN = 402 1;
WINAMP_DOUBLESIZE = 40165;
Winamp_Playlist = 40040;
Winamp_Equalizer = 40036;
Winamp_FileInfo = 4020 ;
Winamp_JumpToFile = 401 4;
end.

Оценить