aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/SDK/in_tone/MAIN.C
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/SDK/in_tone/MAIN.C
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Plugins/SDK/in_tone/MAIN.C')
-rw-r--r--Src/Plugins/SDK/in_tone/MAIN.C240
1 files changed, 240 insertions, 0 deletions
diff --git a/Src/Plugins/SDK/in_tone/MAIN.C b/Src/Plugins/SDK/in_tone/MAIN.C
new file mode 100644
index 00000000..1ab7ccce
--- /dev/null
+++ b/Src/Plugins/SDK/in_tone/MAIN.C
@@ -0,0 +1,240 @@
+/*
+** 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;
+} \ No newline at end of file