2017-04-28 16:15:32 +02:00
# ifndef NULLSOFT_WINAMP_IN2H
# define NULLSOFT_WINAMP_IN2H
2008-03-10 23:58:31 +01:00
# include "out.h"
// note: exported symbol is now winampGetInModule2.
2017-04-28 16:15:32 +02:00
# define IN_UNICODE 0x0F000000
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
# ifdef UNICODE_INPUT_PLUGIN
# define in_char wchar_t
# define IN_VER (IN_UNICODE | 0x100)
# else
# define in_char char
# define IN_VER 0x100
# endif
# define IN_MODULE_FLAG_USES_OUTPUT_PLUGIN 1
// By default, Winamp assumes that your input plugin wants to use Winamp's EQ, and doesn't do replay gain
// if you handle any of these yourself (EQ, Replay Gain adjustments), then set these flags accordingly
# define IN_MODULE_FLAG_EQ 2 // set this if you do your own EQ
# define IN_MODULE_FLAG_REPLAYGAIN 8 // set this if you adjusted volume for replay gain
// for tracks with no replay gain metadata, you should clear this flag
// UNLESS you handle "non_replaygain" gain adjustment yourself
# define IN_MODULE_FLAG_REPLAYGAIN_PREAMP 16 // use this if you queried for the replay gain preamp parameter and used it
// this parameter is new to 5.54
2008-03-10 23:58:31 +01:00
typedef struct
{
2017-04-28 16:15:32 +02:00
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 :)
// note that this has turned into a "flags" field
// see IN_MODULE_FLAG_*
void ( * Config ) ( HWND hwndParent ) ; // configuration dialog
void ( * About ) ( HWND hwndParent ) ; // about dialog
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
void ( * Init ) ( ) ; // called at program init
void ( * Quit ) ( ) ; // called at program quit
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
# define GETFILEINFO_TITLE_LENGTH 2048
void ( * GetFileInfo ) ( const in_char * file , in_char * title , int * length_in_ms ) ; // if file == NULL, current playing is used
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
# define INFOBOX_EDITED 0
# define INFOBOX_UNCHANGED 1
int ( * InfoBox ) ( const in_char * file , HWND hwndParent ) ;
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
int ( * IsOurFile ) ( const in_char * fn ) ; // called before extension checks, to allow detection of mms://, etc
// playback stuff
int ( * Play ) ( const in_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
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
// 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 your thread to seek, which seeks and calls outMod->Flush()..
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
// 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
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
// in-window builtin vis stuff
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
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()
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
// 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 :)
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
// 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()
int ( * SAAdd ) ( void * data , int timestamp , int csa ) ; // sets the spec data, filled in by winamp
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
// 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 :)
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
// 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
int ( * VSAAdd ) ( void * data , int timestamp ) ; // filled in by winamp, called by plug-in
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
// call this in Play() to tell the vis plug-ins the current output params.
void ( * VSASetInfo ) ( int srate , int nch ) ; // <-- Correct (benski, dec 2005).. old declaration had the params backwards
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
// dsp plug-in processing:
// (filled in by winamp, calld by input plug)
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
// 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 ) ( ) ;
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
// 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 ) ;
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
// 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.
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
// info setting (filled in by winamp)
void ( * SetInfo ) ( int bitrate , int srate , int stereo , int synched ) ; // if -1, changes ignored? :)
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
Out_Module * outMod ; // filled in by winamp, optionally used :)
2008-03-10 23:58:31 +01:00
} In_Module ;
2017-04-28 16:15:32 +02:00
// return values from the winampUninstallPlugin(HINSTANCE hdll, HWND parent, int param)
// which determine if we can uninstall the plugin immediately or on winamp restart
//
// uninstall support was added from 5.0+ and uninstall now support from 5.5+
// it is down to you to ensure that if uninstall now is returned that it will not cause a crash
// (ie don't use if you've been subclassing the main window)
# define IN_PLUGIN_UNINSTALL_NOW 0x1
# define IN_PLUGIN_UNINSTALL_REBOOT 0x0
2008-03-10 23:58:31 +01:00
2017-04-28 16:15:32 +02:00
# endif