winamp/Src/Plugins/SDK/out_null/main.c

160 lines
2.0 KiB
C

#include <windows.h>
#include <shlobj.h>
#include "../winamp/out.h"
#define PI_VER2 "v1.2"
/* #ifdef __alpha
#define PI_VER PI_VER2 " (AXP)"
#else
#define PI_VER PI_VER2 " (x86)"
#endif */
int getwrittentime();
int getoutputtime();
int srate, numchan, bps, active;
volatile int writtentime, w_offset;
BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
Out_Module out;
static int last_pause=0;
void config(HWND hwnd)
{
}
void about(HWND hwnd)
{
}
void init()
{
}
void quit()
{
}
int start_t;
int open(int samplerate, int numchannels, int bitspersamp, int bufferlenms, int prebufferms)
{
start_t=GetTickCount();
w_offset = writtentime = 0;
active=1;
numchan = numchannels;
srate = samplerate;
bps = bitspersamp;
return 1;
}
void close()
{
}
int write(char *buf, int len)
{
writtentime += len;
return 0;
}
int canwrite()
{
if (last_pause) return 0;
if (getwrittentime() < getoutputtime()+MulDiv(65536,1000,srate*bps*numchan/8)) return 65536;
return 0;
}
int isplaying()
{
return 0;
}
int pause(int pause)
{
int t=last_pause;
if (!last_pause && pause) { w_offset+=GetTickCount()-start_t; writtentime=0; }
if (last_pause && !pause) { start_t=GetTickCount(); }
last_pause=pause;
return t;
}
void setvolume(int volume)
{
}
void setpan(int pan)
{
}
void flush(int t)
{
w_offset=t;
start_t=GetTickCount();
writtentime=0;
}
int getoutputtime()
{
if (last_pause)
return w_offset;
return GetTickCount()-start_t + w_offset;
}
int getwrittentime()
{
int t=srate*numchan,l;
int ms=writtentime;
if (t)
{
l=ms%t;
ms /= t;
ms *= 1000;
ms += (l*1000)/t;
ms/=(bps/8);
return ms + w_offset;
}
else
return ms;
}
Out_Module out = {
OUT_VER,
"Nullsoft NULL Output " PI_VER2
,
65,
0, // hmainwindow
0, // hdllinstance
config,
about,
init,
quit,
open,
close,
write,
canwrite,
isplaying,
pause,
setvolume,
setpan,
flush,
getoutputtime,
getwrittentime
};
__declspec( dllexport ) Out_Module * winampGetOutModule()
{
return &out;
}