123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- /*
- ** Example Winamp input plug-in
- ** Copyright (c) 1998, Justin Frankel/Nullsoft Inc.
- */
- #include <windows.h>
- #include <mmreg.h>
- #include <msacm.h>
- #include <math.h>
- #include <stdio.h>
- #include "../Winamp/in2.h"
- #define WM_WA_MPEG_EOF WM_USER+2
- extern In_Module mod;
- char lastfn[MAX_PATH];
- short sample_buffer[576*2];
- /*
- // avoid CRT. Evil. Big. Bloated.
- BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
- {
- return TRUE;
- }
- */
- int paused;
- DWORD WINAPI __stdcall PlayThread(void *b);
- int gen_freq=2600;
- int killDecodeThread=0;
- HANDLE thread_handle=INVALID_HANDLE_VALUE;
- void config(HWND hwndParent)
- {
- MessageBoxA(hwndParent,"To use, open 'tone://2600' (for 2600hz).","Configuration",MB_OK); // Must stay in ANSI
- }
- void about(HWND hwndParent)
- {
- MessageBoxA(hwndParent,"Nullsoft Tone Generator, by Justin Frankel","About Nullsoft Tone Generator",MB_OK); // Must stay in ANSI
- }
- int init()
- {
- return 0;
- }
- void quit() { }
- int isourfile(const char *fn)
- {
- char buf[8];
- memcpy(buf,fn,7);
- buf[7]=0;
- return lstrcmpA(buf,"tone://")?0:1; // Must stay in ANSI
- }
- int play(const char *fn) {
- int maxlatency;
- int tmp;
- strcpy(lastfn,fn);
- // simple atoi() inline so that we don't have to use libc (for a nice 4k dll)
- {
- const char *s=fn+7;
- int n=0;
- while (*s >= '0' && *s <= '9')
- {
- n*=10;
- n += *s++ -'0';
- }
- gen_freq=n;
- }
- paused=0;
- memset(sample_buffer,0,sizeof(sample_buffer));
- maxlatency = mod.outMod->Open(44100,1,16, -1,-1);
- if (maxlatency < 0)
- {
- return 1;
- }
- mod.SetInfo(0,44,1,1);
- mod.SAVSAInit(maxlatency,44100);
- mod.VSASetInfo(44100,1);
- mod.outMod->SetVolume(-666);
- killDecodeThread=0;
- thread_handle = (HANDLE) CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) PlayThread,(void *) &killDecodeThread,0,&tmp);
-
- return 0;
- }
- void pause() { paused=1; mod.outMod->Pause(1); }
- void unpause() { paused=0; mod.outMod->Pause(0); }
- int ispaused() { return paused; }
- void stop() {
- if (thread_handle != INVALID_HANDLE_VALUE)
- {
- killDecodeThread=1;
- if (WaitForSingleObject(thread_handle,INFINITE) == WAIT_TIMEOUT)
- {
- MessageBoxA(mod.hMainWindow,"error asking thread to die!\n","error killing decode thread",0); // Must stay in ANSI
- TerminateThread(thread_handle,0);
- }
- CloseHandle(thread_handle);
- thread_handle = INVALID_HANDLE_VALUE;
- }
- mod.outMod->Close();
- mod.SAVSADeInit();
- }
- int getlength() { return -1000; }
- int getoutputtime() { return mod.outMod->GetOutputTime(); }
- void setoutputtime(int time_in_ms) { }
- void setvolume(int volume) { mod.outMod->SetVolume(volume); }
- void setpan(int pan) { mod.outMod->SetPan(pan); }
- int infoDlg(const char *fn, HWND hwnd)
- {
- return 0;
- }
- void getfileinfo(const char *filename, char *title, int *length_in_ms)
- {
- if (!filename || !*filename) filename=lastfn;
- if (title)
- {
- const char *s=filename+7;
- int n=0;
- while (*s >= '0' && *s <= '9')
- {
- n*=10;
- n += *s++ -'0';
- }
- sprintf(title,"%dhz Tone",n);
- }
- if (length_in_ms) *length_in_ms=-1000;
- }
- void eq_set(int on, char data[10], int preamp)
- {
- }
- In_Module mod =
- {
- IN_VER,
- L"Nullsoft Tone Generator v0.2 "
- /* #ifdef __alpha
- "(AXP)"
- #else
- "(x86)"
- #endif */
- ,
- 0, // hMainWindow
- 0, // hDllInstance
- "\0"
- ,
- 0, // is_seekable
- 1, // uses output
- config,
- about,
- init,
- quit,
- getfileinfo,
- infoDlg,
- isourfile,
- play,
- pause,
- unpause,
- ispaused,
- stop,
-
- getlength,
- getoutputtime,
- setoutputtime,
- setvolume,
- setpan,
- 0,0,0,0,0,0,0,0,0, // vis stuff
- 0,0, // dsp
- eq_set,
- NULL, // setinfo
- 0 // out_mod
- };
- __declspec( dllexport ) In_Module * winampGetInModule2()
- {
- return &mod;
- }
- int _fltused=0;
- DWORD WINAPI __stdcall PlayThread(void *b)
- {
- double angle=0.0,dangle=3.14159*2.0*(double)gen_freq/(double)44100.0;
- while (! *((int *)b) )
- {
- if (mod.outMod->CanWrite() >= ((sizeof(sample_buffer)/2)<<(mod.dsp_isactive()?1:0)))
- {
- int l=sizeof(sample_buffer)/2,x=l/2;
- short *s=sample_buffer;
- while (x--)
- {
- int i;
- double d = sin(angle)*32766.5;
- #ifndef __alpha
- __asm {
- fld d
- fistp i
- }
- #else
- i = (int) d;
- #endif
- *s++=i;
- angle += dangle;
- }
- {
- int t=mod.outMod->GetWrittenTime();
- mod.SAAddPCMData((char *)sample_buffer,1,16,t);
- mod.VSAAddPCMData((char *)sample_buffer,1,16,t);
- }
- l=mod.dsp_dosamples(sample_buffer,l/2,16,1,44100)*2;
- mod.outMod->Write((char *)sample_buffer,l);
- }
- else Sleep(50);
- }
- return 0;
- }
|