From 8297a92012e3f42ed74d47fc3d11a3003c14b4ae Mon Sep 17 00:00:00 2001 From: "SND\\weimingzhi_cp" Date: Thu, 12 Aug 2010 02:56:43 +0000 Subject: dfsound: readded windows support. gtk gui: increased number of savestate slots. git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@56022 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- plugins/dfsound/cfg.h | 6 ++ plugins/dfsound/dsoundoss.h | 7 +- plugins/dfsound/externals.h | 35 ++++++++ plugins/dfsound/freeze.c | 7 ++ plugins/dfsound/spu.c | 201 ++++++++++++++++++++++++++++++++++++++------ plugins/dfsound/stdafx.h | 20 +++++ plugins/dfsound/xa.c | 16 +++- 7 files changed, 262 insertions(+), 30 deletions(-) (limited to 'plugins') diff --git a/plugins/dfsound/cfg.h b/plugins/dfsound/cfg.h index f64d6d62..b052b2d9 100644 --- a/plugins/dfsound/cfg.h +++ b/plugins/dfsound/cfg.h @@ -16,4 +16,10 @@ ***************************************************************************/ void ReadConfig(void); + +#ifdef _WINDOWS +BOOL CALLBACK AboutDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK DSoundDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam); +#else void StartCfgTool(char * pCmdLine); +#endif diff --git a/plugins/dfsound/dsoundoss.h b/plugins/dfsound/dsoundoss.h index 3702312f..f64f645b 100644 --- a/plugins/dfsound/dsoundoss.h +++ b/plugins/dfsound/dsoundoss.h @@ -18,5 +18,10 @@ void SetupSound(void); void RemoveSound(void); unsigned long SoundGetBytesBuffered(void); -void SoundFeedStreamData(unsigned char* pSound,long lBytes); +void SoundFeedStreamData(unsigned char* pSound,long lBytes); + +#ifdef _WINDOWS +#define timeGetTime_spu timeGetTime +#else unsigned long timeGetTime_spu(); +#endif \ No newline at end of file diff --git a/plugins/dfsound/externals.h b/plugins/dfsound/externals.h index f8562046..30ac977d 100644 --- a/plugins/dfsound/externals.h +++ b/plugins/dfsound/externals.h @@ -193,6 +193,11 @@ typedef struct int IN_COEF_R; // (coef.) } REVERBInfo; +#ifdef _WINDOWS +extern HINSTANCE hInst; +#define WM_MUTE (WM_USER+543) +#endif + /////////////////////////////////////////////////////////// // SPU.C globals /////////////////////////////////////////////////////////// @@ -240,10 +245,40 @@ extern int SSumL[]; extern int iCycle; extern short * pS; +#ifdef _WINDOWS +extern HWND hWMain; // window handle +extern HWND hWDebug; +#endif + extern void (CALLBACK *cddavCallback)(unsigned short,unsigned short); #endif +/////////////////////////////////////////////////////////// +// DSOUND.C globals +/////////////////////////////////////////////////////////// + +#ifndef _IN_DSOUND + +#ifdef _WINDOWS +extern unsigned long LastWrite; +extern unsigned long LastPlay; +#endif + +#endif + +/////////////////////////////////////////////////////////// +// RECORD.C globals +/////////////////////////////////////////////////////////// + +#ifndef _IN_RECORD + +#ifdef _WINDOWS +extern int iDoRecord; +#endif + +#endif + /////////////////////////////////////////////////////////// // XA.C globals /////////////////////////////////////////////////////////// diff --git a/plugins/dfsound/freeze.c b/plugins/dfsound/freeze.c index 12fdc1fd..e4283595 100644 --- a/plugins/dfsound/freeze.c +++ b/plugins/dfsound/freeze.c @@ -118,6 +118,13 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode,SPUFreeze_t * pF) if(ulFreezeMode!=0) return 0; // bad mode? bye +#ifdef _WINDOWS + if(iDebugMode && IsWindow(hWDebug)) // clean debug mute infos + SendMessage(hWDebug,WM_MUTE,0,0); + if(IsBadReadPtr(pF,sizeof(SPUFreeze_t))) // check bad emu stuff + return 0; +#endif + RemoveTimer(); // we stop processing while doing the save! memcpy(spuMem,pF->cSPURam,0x80000); // get ram diff --git a/plugins/dfsound/spu.c b/plugins/dfsound/spu.c index c086c06b..b11e5fac 100644 --- a/plugins/dfsound/spu.c +++ b/plugins/dfsound/spu.c @@ -23,6 +23,11 @@ #include "cfg.h" #include "dsoundoss.h" #include "regs.h" + +#ifdef _WINDOWS +#include "debug.h" +#include "record.h" +#endif #ifdef ENABLE_NLS #include @@ -33,8 +38,10 @@ #define _(x) (x) #define N_(x) (x) #endif - -#if defined (USEMACOSX) + +#if defined (_WINDOWS) +static char * libraryName = N_("DirectSound Driver"); +#elif defined (USEMACOSX) static char * libraryName = N_("Mac OS X Sound"); #elif defined (USEALSA) static char * libraryName = N_("ALSA Sound"); @@ -89,8 +96,15 @@ int bEndThread=0; // thread handlers int bThreadEnded=0; int bSpuInit=0; int bSPUIsOpen=0; - + +#ifdef _WINDOWS +HWND hWMain=0; // window handle +HWND hWDebug=0; +HWND hWRecord=0; +static HANDLE hMainThread; +#else static pthread_t thread = (pthread_t)-1; // thread id (linux) +#endif unsigned long dwNewChannel=0; // flags for faster testing, if new channel starts @@ -438,7 +452,11 @@ INLINE int iGetInterpolationVal(int ch) //////////////////////////////////////////////////////////////////////// -static void *MAINThread(void *arg) +#ifdef _WINDOWS +static VOID CALLBACK MAINProc(UINT nTimerId, UINT msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) +#else +static void *MAINThread(void *arg) +#endif { int s_1,s_2,fa,ns; #ifndef _MACOSX @@ -471,8 +489,19 @@ static void *MAINThread(void *arg) { iSecureStart=0; // reset secure - if(iUseTimer) return 0; // linux no-thread mode? bye - usleep(PAUSE_L); // else sleep for x ms (linux) +#ifdef _WINDOWS + if(iUseTimer) // no-thread mode? + { + if(iUseTimer==1) // -> ok, timer mode 1: setup a oneshot timer of x ms to wait + timeSetEvent(PAUSE_W,1,MAINProc,0,TIME_ONESHOT); + return; // -> and done this time (timer mode 1 or 2) + } + // win thread mode: + Sleep(PAUSE_W); // sleep for x ms (win) +#else + if(iUseTimer) return 0; // linux no-thread mode? bye + usleep(PAUSE_L); // else sleep for x ms (linux) +#endif if(dwNewChannel) iSecureStart=1; // if a new channel kicks in (or, of course, sound buffer runs low), we will leave the loop } @@ -605,14 +634,22 @@ static void *MAINThread(void *arg) while(iSpuAsyncWait && !bEndThread && timeGetTime_spu() no init, no call - MAINThread(0); // -> linux high-compat mode +#ifdef _WINDOWS + MAINProc(0,0,0,0,0); // -> experimental win mode... not really tested... don't like the drawbacks +#else + MAINThread(0); // -> linux high-compat mode +#endif } } @@ -825,17 +895,50 @@ void SetupTimer(void) bEndThread=0; // init thread vars bThreadEnded=0; bSpuInit=1; // flag: we are inited - + +#ifdef _WINDOWS + + if(iUseTimer==1) // windows: use timer + { + timeBeginPeriod(1); + timeSetEvent(1,1,MAINProc,0,TIME_ONESHOT); + } + else + if(iUseTimer==0) // windows: use thread + { + //_beginthread(MAINThread,0,NULL); + DWORD dw; + hMainThread=CreateThread(NULL,0,MAINThreadEx,0,0,&dw); + SetThreadPriority(hMainThread, + //THREAD_PRIORITY_TIME_CRITICAL); + THREAD_PRIORITY_HIGHEST); + } + +#else + if(!iUseTimer) // linux: use thread { pthread_create(&thread, NULL, MAINThread, NULL); - } + } + +#endif } // REMOVETIMER: kill threads/timers void RemoveTimer(void) { - bEndThread=1; // raise flag to end thread + bEndThread=1; // raise flag to end thread + +#ifdef _WINDOWS + + if(iUseTimer!=2) // windows thread? + { + while(!bThreadEnded) {Sleep(5L);} // -> wait till thread has ended + Sleep(5L); + } + if(iUseTimer==1) timeEndPeriod(1); // windows timer? stop it + +#else if(!iUseTimer) // linux tread? { @@ -843,6 +946,8 @@ void RemoveTimer(void) while(!bThreadEnded && i<2000) {usleep(1000L);i++;} // -> wait until thread has ended if(thread!=(pthread_t)-1) {pthread_cancel(thread);thread=(pthread_t)-1;} // -> cancel thread anyway } + +#endif bThreadEnded=0; // no more spu is running bSpuInit=0; @@ -933,14 +1038,44 @@ long CALLBACK SPUinit(void) } // SPUOPEN: called by main emu after init -long CALLBACK SPUopen(void) +#ifdef _WINDOWS +long CALLBACK SPUopen(HWND hW) +#else +long SPUopen(void) +#endif { - if (bSPUIsOpen) return 0; // security for some stupid main emus + if (bSPUIsOpen) return 0; // security for some stupid main emus + +#ifdef _WINDOWS + LastWrite=0xffffffff;LastPlay=0; // init some play vars + if(!IsWindow(hW)) hW=GetActiveWindow(); + hWMain = hW; // store hwnd +#endif SetupSound(); // setup sound (before init!) SetupTimer(); // timer for feeding data - bSPUIsOpen = 1; + bSPUIsOpen = 1; + +#ifdef _WINDOWS + if(iDebugMode) // windows debug dialog + { + hWDebug=CreateDialog(hInst,MAKEINTRESOURCE(IDD_DEBUG), + NULL,(DLGPROC)DebugDlgProc); + SetWindowPos(hWDebug,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW|SWP_NOACTIVATE); + UpdateWindow(hWDebug); + SetFocus(hWMain); + } + + if(iRecordMode) // windows recording dialog + { + hWRecord=CreateDialog(hInst,MAKEINTRESOURCE(IDD_RECORD), + NULL,(DLGPROC)RecordDlgProc); + SetWindowPos(hWRecord,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW|SWP_NOACTIVATE); + UpdateWindow(hWRecord); + SetFocus(hWMain); + } +#endif return PSE_SPU_ERR_SUCCESS; } @@ -950,7 +1085,14 @@ long CALLBACK SPUclose(void) { if (!bSPUIsOpen) return 0; // some security - bSPUIsOpen = 0; // no more open + bSPUIsOpen = 0; // no more open + +#ifdef _WINDOWS + if(IsWindow(hWDebug)) DestroyWindow(hWDebug); + hWDebug=0; + if(IsWindow(hWRecord)) DestroyWindow(hWRecord); + hWRecord=0; +#endif RemoveTimer(); // no more feeding RemoveSound(); // no more sound handling @@ -975,19 +1117,26 @@ long CALLBACK SPUtest(void) // SPUCONFIGURE: call config dialog long CALLBACK SPUconfigure(void) -{ -#ifdef _MACOSX +{ +#if defined (_WINDOWS) + DialogBox(hInst,MAKEINTRESOURCE(IDD_CFGDLG), + GetActiveWindow(),(DLGPROC)DSoundDlgProc); +#elif defined (_MACOSX) DoConfiguration(); #else StartCfgTool("CFG"); -#endif +#endif + return 0; } // SPUABOUT: show about window void CALLBACK SPUabout(void) -{ -#ifdef _MACOSX +{ +#if defined (_WINDOWS) + DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUT), + GetActiveWindow(),(DLGPROC)AboutDlgProc); +#elif defined (_MACOSX) DoAbout(); #else StartCfgTool("ABOUT"); @@ -1020,7 +1169,7 @@ unsigned long CALLBACK PSEgetLibType(void) unsigned long CALLBACK PSEgetLibVersion(void) { - return (1 << 16) | (6 << 8); + return (1 << 16) | (1 << 8); } char * SPUgetLibInfos(void) diff --git a/plugins/dfsound/stdafx.h b/plugins/dfsound/stdafx.h index 8be88489..7d1a1f52 100644 --- a/plugins/dfsound/stdafx.h +++ b/plugins/dfsound/stdafx.h @@ -14,6 +14,24 @@ * additional informations. * * * ***************************************************************************/ + +#ifdef _WINDOWS + +#define WIN32_LEAN_AND_MEAN +#define STRICT +#include +#include +#include "mmsystem.h" +#include +#include + +#ifndef INLINE +#define INLINE __inline +#endif + +#include "resource.h" + +#else #ifndef _MACOSX #include "config.h" @@ -42,5 +60,7 @@ #ifndef INLINE #define INLINE inline #endif + +#endif #include "psemuxa.h" diff --git a/plugins/dfsound/xa.c b/plugins/dfsound/xa.c index fdae4f9e..0c1ae57a 100644 --- a/plugins/dfsound/xa.c +++ b/plugins/dfsound/xa.c @@ -15,7 +15,8 @@ * * ***************************************************************************/ -#include "stdafx.h" +#include "stdafx.h" + #define _IN_XA #include @@ -101,6 +102,8 @@ INLINE void MixXA(void) //////////////////////////////////////////////////////////////////////// // small linux time helper... only used for watchdog //////////////////////////////////////////////////////////////////////// + +#ifndef _WINDOWS unsigned long timeGetTime_spu() { @@ -108,6 +111,8 @@ unsigned long timeGetTime_spu() gettimeofday(&tv, 0); // well, maybe there are better ways return tv.tv_sec * 1000 + tv.tv_usec/1000; // to do that, but at least it works } + +#endif //////////////////////////////////////////////////////////////////////// // FEED XA @@ -397,9 +402,14 @@ INLINE void FeedCDDA(unsigned char *pcm, int nBytes) if(CDDAFeed==CDDAEnd) CDDAFeed=CDDAStart; while(CDDAFeed==CDDAPlay-1|| (CDDAFeed==CDDAEnd-1&&CDDAPlay==CDDAStart)) - { + { +#ifdef _WINDOWS + if (!iUseTimer) Sleep(1); + else return; +#else if (!iUseTimer) usleep(1000); - else return; + else return; +#endif } *CDDAFeed++=(*pcm | (*(pcm+1)<<8) | (*(pcm+2)<<16) | (*(pcm+3)<<24)); nBytes-=4; -- cgit v1.2.3