123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- #include "out_wave.h"
- #include "api.h"
- #include <commctrl.h>
- #include "resource.h"
- #include <math.h>
- #include "../winamp/wa_ipc.h"
- #pragma intrinsic(log)
- #ifndef _WIN64
- //__inline long int lrint (double flt)
- //{
- // int intgr;
- //
- // _asm
- // {
- // fld flt
- // fistp intgr
- // }
- //
- // return intgr;
- //}
- #else
- //__inline long int lrint (double flt)
- //{
- // return (int)flt;
- //}
- #endif
- #pragma warning(disable:4800)
- extern Out_Module mod;
- extern UINT cfg_buf_ms,cfg_dev,cfg_prebuf;
- extern bool cfg_volume,cfg_altvol,cfg_resetvol;
- extern UINT cfg_trackhack;
- bool get_waveout_state(char * z) throw();
- void _init();
- #define BUFFER_SCALE 4000.0
- static UINT cur_buffer;
- static UINT get_buffer(HWND wnd)
- {
- if (cur_buffer) return cur_buffer;
- //0-BUFFER_SCALE => 200-20000
- LRESULT z=SendDlgItemMessage(wnd,IDC_BUFFER,TBM_GETPOS,0,0);
- //return cur_buffer=lrint( 0.5 + 200.0*pow(100.0,((double)z)/BUFFER_SCALE) );
- }
- #define LOG100 4.6051701859880913680359829093687
- static void set_buffer(HWND wnd,UINT b)
- {
- cur_buffer=b;
- SendDlgItemMessage(wnd,IDC_BUFFER,TBM_SETPOS,1,lrint( 0.5 + BUFFER_SCALE * log( (double)b/200.0 ) / LOG100 /* / log( 100.0 )*/ ));
- }
- static void update_prebuf_1(HWND wnd)
- {
- WCHAR zz[128] = { 0 };
- wsprintf(zz, WASABI_API_LNGSTRINGW(IDS_WAVE_U_MS), SendDlgItemMessage(wnd, IDC_PREBUFFER_1, TBM_GETPOS, 0, 0));
- SetDlgItemText(wnd,IDC_PREBUF_DISP_1,zz);
- }
- static void update_prebuf_2(HWND wnd)
- {
- WCHAR zz[128] = { 0 };
- wsprintf(zz, WASABI_API_LNGSTRINGW(IDS_WAVE_U_MS), SendDlgItemMessage(wnd, IDC_PREBUFFER_2, TBM_GETPOS, 0, 0));
- SetDlgItemText(wnd,IDC_PREBUF_DISP_2,zz);
- }
- static void update_prebuf_range(HWND wnd)
- {
- UINT max=get_buffer(wnd);
- if (max>0x7FFF) max=0x7FFF;
- SendDlgItemMessage(wnd,IDC_PREBUFFER_1,TBM_SETRANGE,1,MAKELONG(0,max));
- SendDlgItemMessage(wnd,IDC_PREBUFFER_2,TBM_SETRANGE,1,MAKELONG(0,max));
- }
- static void update_buf(HWND wnd)
- {
- WCHAR zz[128] = { 0 };
- wsprintf(zz, WASABI_API_LNGSTRINGW(IDS_WAVE_U_MS), get_buffer(wnd));
- SetDlgItemText(wnd,IDC_BUF_DISP,zz);
- }
- static INT_PTR WINAPI CfgProc(HWND wnd,UINT msg,WPARAM wp,LPARAM lp)
- {
- switch(msg)
- {
- case WM_INITDIALOG:
- {
- wchar_t title[128] = {0}, temp[128] = {0};
- swprintf(title,128,WASABI_API_LNGSTRINGW(IDS_PREFS_TITLE),WASABI_API_LNGSTRINGW_BUF(IDS_NULLSOFT_WAVEOUT_OLD,temp,128));
- SetWindowTextW(wnd,title);
- SendDlgItemMessage(wnd,IDC_VOL_ENABLE,BM_SETCHECK,(long)cfg_volume,0);
- SendDlgItemMessage(wnd,IDC_ALT_VOL,BM_SETCHECK,(long)cfg_altvol,0);
- SendDlgItemMessage(wnd,IDC_VOL_RESET,BM_SETCHECK,(long)cfg_resetvol,0);
- {
- int dev;
- HWND w=GetDlgItem(wnd,IDC_DEV);
- UINT max=waveOutGetNumDevs();
- WAVEOUTCAPS caps;
- for(dev=-1;dev<(int)max;dev++)
- {
- if (waveOutGetDevCaps((UINT)dev,&caps,sizeof(caps)) == MMSYSERR_NOERROR)
- SendMessage(w,CB_ADDSTRING,0,(LPARAM)caps.szPname);
- }
- SendMessage(w,CB_SETCURSEL,cfg_dev,0);
- }
- SendDlgItemMessage(wnd,IDC_BUFFER,TBM_SETRANGE,0,MAKELONG(0,(int)BUFFER_SCALE));
- set_buffer(wnd,cfg_buf_ms);
- update_prebuf_range(wnd);
- SendDlgItemMessage(wnd,IDC_PREBUFFER_1,TBM_SETPOS,1,cfg_prebuf);
- SendDlgItemMessage(wnd,IDC_PREBUFFER_2,TBM_SETPOS,1,cfg_trackhack);
- update_prebuf_1(wnd);
- update_prebuf_2(wnd);
- update_buf(wnd);
- SetTimer(wnd,1,500,0);
- CfgProc(wnd,WM_TIMER,0,0);
- }
- return 1;
- case WM_COMMAND:
- switch(wp)
- {
- case IDC_RESET:
- SendDlgItemMessage(wnd,IDC_VOL_ENABLE,BM_SETCHECK,1,0);
- SendDlgItemMessage(wnd,IDC_ALT_VOL,BM_SETCHECK,0,0);
- SendDlgItemMessage(wnd,IDC_VOL_RESET,BM_SETCHECK,0,0);
- SendDlgItemMessage(wnd,IDC_DEV,CB_SETCURSEL,0,0);
- set_buffer(wnd,2000);
- update_prebuf_range(wnd);
- SendDlgItemMessage(wnd,IDC_PREBUFFER_1,TBM_SETPOS,1,200);
- SendDlgItemMessage(wnd,IDC_PREBUFFER_2,TBM_SETPOS,1,200);
- update_prebuf_1(wnd);
- update_prebuf_2(wnd);
- update_buf(wnd);
- break;
- case IDOK:
- KillTimer(wnd,1);
- cfg_dev=(UINT)SendDlgItemMessage(wnd,IDC_DEV,CB_GETCURSEL,0,0);
- cfg_buf_ms=get_buffer(wnd);
- cfg_prebuf= (UINT)SendDlgItemMessage(wnd,IDC_PREBUFFER_1,TBM_GETPOS,0,0);
- cfg_trackhack=(UINT)SendDlgItemMessage(wnd,IDC_PREBUFFER_2,TBM_GETPOS,0,0);
- cfg_volume=(bool)SendDlgItemMessage(wnd,IDC_VOL_ENABLE,BM_GETCHECK,0,0);
- cfg_altvol=(bool)SendDlgItemMessage(wnd,IDC_ALT_VOL,BM_GETCHECK,0,0);
- cfg_resetvol=(bool)SendDlgItemMessage(wnd,IDC_VOL_RESET,BM_GETCHECK,0,0);
- EndDialog(wnd,1);
- break;
- case IDCANCEL:
- KillTimer(wnd,1);
- EndDialog(wnd,0);
- break;
- }
- break;
- case WM_HSCROLL:
- switch(GetWindowLong((HWND)lp,GWL_ID))
- {
- case IDC_BUFFER:
- cur_buffer=0;
- update_buf(wnd);
- update_prebuf_range(wnd);
- update_prebuf_1(wnd);
- update_prebuf_2(wnd);
- break;
- case IDC_PREBUFFER_1:
- update_prebuf_1(wnd);
- break;
- case IDC_PREBUFFER_2:
- update_prebuf_2(wnd);
- break;
- }
- break;
- case WM_TIMER:
- {
- char poo[512] = {0};
- bool z=get_waveout_state(poo);
- SetDlgItemTextA(wnd,IDC_STATE,z ? poo : WASABI_API_LNGSTRING(IDS_NOT_ACTIVE));
- EnableWindow(GetDlgItem(wnd,IDC_BLAH),z);
- }
- break;
- }
- const int controls[] =
- {
- IDC_BUFFER,
- IDC_PREBUFFER_1,
- IDC_PREBUFFER_2,
- };
- if (FALSE != WASABI_API_APP->DirectMouseWheel_ProcessDialogMessage(wnd, msg, wp, lp, controls, ARRAYSIZE(controls)))
- {
- return TRUE;
- }
- return 0;
- }
- void Config(HWND w)
- {
- _init();
- WASABI_API_DIALOGBOXW(IDD_CONFIG,w,CfgProc);
- }
- static char _dllfile[MAX_PATH];
- static char * dllfile;
- char *inifile=0;
- static UINT atoui(char* s)
- {
- int ret=0;
- while(s && *s>='0' && *s<='9') {ret=10*ret+(*s-'0');s++;}
- return ret;
- }
- static int _do_var(unsigned int v,char* n,bool s)
- {
- if (s)
- {
- char tmp[2*sizeof(unsigned int) + 1] = {0}; // max 32 bit unsigned int == 4 294 967 296 == 10 digits, 11 if signed
- wsprintfA(tmp,"%u",v);
- WritePrivateProfileStringA(dllfile,n,tmp,inifile);
- return v;
- }
- else
- {
- char tmp[64],tmp_s[2*sizeof(unsigned int) + 1] = {0};
- wsprintfA(tmp_s,"%u",v);
- GetPrivateProfileStringA(dllfile,n,tmp_s,tmp,64,inifile);
- return atoui(tmp);
- }
- }
- #define do_var(V) {V=_do_var(V,#V,s);}
- void do_cfg(bool s)
- {
- if (!inifile)
- inifile =(char *)SendMessage(mod.hMainWindow, WM_WA_IPC, 0, IPC_GETINIFILE);
- if (!dllfile)
- {
- GetModuleFileNameA(mod.hDllInstance,_dllfile,sizeof(_dllfile));
- dllfile=strrchr(_dllfile,'\\');
- if (!dllfile) dllfile=_dllfile;
- else dllfile++;
- char * p=strchr(dllfile,'.');
- if (p) *p=0;
- }
- do_var(cfg_buf_ms);
- do_var(cfg_dev);
- do_var(cfg_volume);
- do_var(cfg_altvol);
- do_var(cfg_resetvol);
- do_var(cfg_prebuf);
- do_var(cfg_trackhack);
- }
|