SPU2ghz: DLL now "properly" exports functions. May fix some compilation/plugin detection problems? Plus another attempt at fixing the XAudio 2 crash-on-exit bug.

git-svn-id: http://pcsx2-playground.googlecode.com/svn/trunk@292 a6443dda-0b58-4228-96e9-037be469359c
This commit is contained in:
Jake.Stine 2008-11-04 16:03:54 +00:00 committed by Gregory Hainaut
parent 323af0ebb2
commit 4c2518b0f0
4 changed files with 83 additions and 35 deletions

View File

@ -616,7 +616,7 @@ static void __forceinline __fastcall GetNoiseValues(V_Core& thiscore, V_Voice& v
} }
// GetNoiseValues can't set the phase zero on us unexpectedly // GetNoiseValues can't set the phase zero on us unexpectedly
// like GetVoiceValues can. // like GetVoiceValues can. Better asster just in case though..
jASSUME( vc.ADSR.Phase != 0 ); jASSUME( vc.ADSR.Phase != 0 );
CalculateADSR( vc ); CalculateADSR( vc );
@ -760,11 +760,10 @@ void __fastcall ReadInput(V_Core& thiscore, s32& PDataL,s32& PDataR)
if (thiscore.InputDataLeft<0x200) if (thiscore.InputDataLeft<0x200)
{ {
FileLog("[%10d] AutoDMA%c block end.\n",Cycles, (core==0)?'4':'7'); thiscore.AutoDMACtrl |= ~3;
thiscore.AutoDMACtrl |=~3;
#ifndef PUBLIC #ifndef PUBLIC
FileLog("[%10d] AutoDMA%c block end.\n",Cycles, (core==0)?'4':'7');
if(thiscore.InputDataLeft>0) if(thiscore.InputDataLeft>0)
{ {
if(MsgAutoDMA()) ConLog("WARNING: adma buffer didn't finish with a whole block!!\n"); if(MsgAutoDMA()) ConLog("WARNING: adma buffer didn't finish with a whole block!!\n");

View File

@ -22,6 +22,9 @@
#include "regtable.h" #include "regtable.h"
#include "svnrev.h" #include "svnrev.h"
// DLL Interface exportation:
void StartVoices(int core, u32 value); void StartVoices(int core, u32 value);
void StopVoices(int core, u32 value); void StopVoices(int core, u32 value);
@ -32,7 +35,7 @@ const unsigned char revision = 1;
const unsigned char build = 9; // increase that with each version const unsigned char build = 9; // increase that with each version
static __forceinline void SPU2_FastWrite( u32 rmem, u16 value ); static __forceinline void SPU2_FastWrite( u32 rmem, u16 value );
static void CALLBACK SPU2writeLog(u32 rmem, u16 value); static void SPU2writeLog(u32 rmem, u16 value);
DWORD CALLBACK TimeThread(PVOID /* unused param */); DWORD CALLBACK TimeThread(PVOID /* unused param */);
@ -67,8 +70,6 @@ u8 callirq;
HANDLE hThreadFunc; HANDLE hThreadFunc;
u32 ThreadFuncID; u32 ThreadFuncID;
char fname[]="01234567890123456789012345";
#ifndef PUBLIC #ifndef PUBLIC
V_CoreDebug DebugCores[2]; V_CoreDebug DebugCores[2];
#endif #endif
@ -129,47 +130,54 @@ void SysMessage(char *fmt, ...)
static void InitLibraryName() static void InitLibraryName()
{ {
sprintf_s( libraryName, 256, "GiGaHeRz SPU2 PPr %d%s", sprintf_s( libraryName, 256, "GiGaHeRz SPU2 PPr %d%s"
SVN_REV, #ifdef _DEBUG
"-Debug"
#elif !defined( PUBLIC )
"-Dev"
#endif
,SVN_REV,
SVN_MODS ? "m" : "" SVN_MODS ? "m" : ""
); );
} }
u32 CALLBACK PS2EgetLibType() EXPORT_C_(u32) PS2EgetLibType()
{ {
return PS2E_LT_SPU2; return PS2E_LT_SPU2;
} }
char* CALLBACK PS2EgetLibName() EXPORT_C_(char*) PS2EgetLibName()
{ {
InitLibraryName(); InitLibraryName();
return libraryName; return libraryName;
} }
u32 CALLBACK PS2EgetLibVersion2(u32 type) EXPORT_C_(u32) PS2EgetLibVersion2(u32 type)
{ {
return (version<<16)|(revision<<8)|build; return (version<<16)|(revision<<8)|build;
} }
void CALLBACK SPU2configure() { EXPORT_C_(void) SPU2configure() {
configure(); configure();
} }
void CALLBACK SPU2about() { EXPORT_C_(void) SPU2about() {
InitLibraryName(); InitLibraryName();
SysMessage( libraryName ); SysMessage( libraryName );
} }
s32 CALLBACK SPU2test() { EXPORT_C_(s32) SPU2test() {
return SndTest(); return SndTest();
} }
__forceinline s16 * __fastcall GetMemPtr(u32 addr) __forceinline s16 * __fastcall GetMemPtr(u32 addr)
{ {
#ifndef DEBUG_FAST
// In case you're wondering, this assert is the reason spu2ghz // In case you're wondering, this assert is the reason spu2ghz
// runs so incrediously slow in Debug mode. :P // runs so incrediously slow in Debug mode. :P
assert(addr<0x100000); assert(addr<0x100000);
#endif
return (_spu2mem+addr); return (_spu2mem+addr);
} }
@ -275,7 +283,7 @@ void CoreReset(int c)
extern void LowPassFilterInit(); extern void LowPassFilterInit();
s32 CALLBACK SPU2init() EXPORT_C_(s32) SPU2init()
{ {
#define MAKESURE(a,b) \ #define MAKESURE(a,b) \
/*fprintf(stderr,"%08p: %08p == %08p\n",&(regtable[a>>1]),regtable[a>>1],U16P(b));*/ \ /*fprintf(stderr,"%08p: %08p == %08p\n",&(regtable[a>>1]),regtable[a>>1],U16P(b));*/ \
@ -377,7 +385,7 @@ s32 CALLBACK SPU2init()
} }
BOOL CALLBACK DebugProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) static BOOL CALLBACK DebugProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{ {
int wmId,wmEvent; int wmId,wmEvent;
@ -411,7 +419,7 @@ BOOL CALLBACK DebugProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
return TRUE; return TRUE;
} }
s32 CALLBACK SPU2open(void *pDsp) EXPORT_C_(s32) SPU2open(void *pDsp)
{ {
if( spu2open ) return 0; if( spu2open ) return 0;
@ -442,7 +450,7 @@ s32 CALLBACK SPU2open(void *pDsp)
}; };
} }
void CALLBACK SPU2close() EXPORT_C_(void) SPU2close()
{ {
if( !spu2open ) return; if( !spu2open ) return;
FileLog("[%10d] SPU2 Close\n",Cycles); FileLog("[%10d] SPU2 Close\n",Cycles);
@ -454,7 +462,7 @@ void CALLBACK SPU2close()
spu2open = false; spu2open = false;
} }
void CALLBACK SPU2shutdown() EXPORT_C_(void) SPU2shutdown()
{ {
if(!spu2init) return; if(!spu2init) return;
@ -500,7 +508,7 @@ void CALLBACK SPU2shutdown()
#endif #endif
} }
void CALLBACK SPU2setClockPtr(u32 *ptr) EXPORT_C_(void) SPU2setClockPtr(u32 *ptr)
{ {
cPtr=ptr; cPtr=ptr;
hasPtr=(cPtr!=NULL); hasPtr=(cPtr!=NULL);
@ -639,7 +647,7 @@ void UpdateDebugDialog()
u32 TicksCore=0; u32 TicksCore=0;
u32 TicksThread=0; u32 TicksThread=0;
DWORD CALLBACK TimeThread(PVOID /* unused param */) static DWORD CALLBACK TimeThread(PVOID /* unused param */)
{ {
while(spu2open) while(spu2open)
{ {
@ -729,6 +737,7 @@ void __fastcall TimeUpdate(u32 cClocks, u32 syncType)
{ {
Cores[1].MADR=Cores[1].TADR; Cores[1].MADR=Cores[1].TADR;
Cores[1].DMAICounter=0; Cores[1].DMAICounter=0;
ConLog( "* SPU2 > AutoDMA 7 Callback! %d\n", Cycles );
if(dma7callback) dma7callback(); if(dma7callback) dma7callback();
} }
else { else {
@ -749,7 +758,7 @@ bool numpad_minus = false;
bool numpad_plus = false, numpad_plus_old = false; bool numpad_plus = false, numpad_plus_old = false;
void CALLBACK SPU2async(u32 cycles) EXPORT_C_(void) SPU2async(u32 cycles)
{ {
#ifndef PUBLIC #ifndef PUBLIC
u32 oldClocks = lClocks; u32 oldClocks = lClocks;
@ -799,7 +808,7 @@ void CALLBACK SPU2async(u32 cycles)
} }
} }
void CALLBACK SPU2irqCallback(void (*SPU2callback)(),void (*DMA4callback)(),void (*DMA7callback)()) EXPORT_C_(void) SPU2irqCallback(void (*SPU2callback)(),void (*DMA4callback)(),void (*DMA7callback)())
{ {
_irqcallback=SPU2callback; _irqcallback=SPU2callback;
dma4callback=DMA4callback; dma4callback=DMA4callback;
@ -852,7 +861,7 @@ __forceinline void RegLog(int level, char *RName,u32 mem,u32 core,u16 value)
FileLog("[%10d] SPU2 write mem %08x (core %d, register %s) value %04x\n",Cycles,mem,core,RName,value); FileLog("[%10d] SPU2 write mem %08x (core %d, register %s) value %04x\n",Cycles,mem,core,RName,value);
} }
void CALLBACK SPU_ps1_write(u32 mem, u16 value) static void SPU_ps1_write(u32 mem, u16 value)
{ {
bool show=true; bool show=true;
@ -993,7 +1002,7 @@ void CALLBACK SPU_ps1_write(u32 mem, u16 value)
spu2Ru16(mem)=value; spu2Ru16(mem)=value;
} }
u16 CALLBACK SPU_ps1_read(u32 mem) static u16 SPU_ps1_read(u32 mem)
{ {
bool show=true; bool show=true;
u16 value = spu2Ru16(mem); u16 value = spu2Ru16(mem);
@ -1070,7 +1079,7 @@ u16 CALLBACK SPU_ps1_read(u32 mem)
void RegWriteLog(u32 core,u16 value); void RegWriteLog(u32 core,u16 value);
static void CALLBACK SPU2writeLog(u32 rmem, u16 value) static void SPU2writeLog(u32 rmem, u16 value)
{ {
#ifndef PUBLIC #ifndef PUBLIC
u32 vx=0, vc=0, core=0, omem=rmem, mem=rmem&0x7FF; u32 vx=0, vc=0, core=0, omem=rmem, mem=rmem&0x7FF;
@ -1550,7 +1559,7 @@ static __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
break; break;
case REG_S_ADMAS: case REG_S_ADMAS:
RegLog(3,"ADMAS",rmem,core,value); RegLog(3,"ADMAS",rmem,core,value);
ConLog(" * SPU2: Core %d AutoDMAControl set to %d\n",core,value); //ConLog(" * SPU2: Core %d AutoDMAControl set to %d (%d)\n",core,value, Cycles);
Cores[core].AutoDMACtrl=value; Cores[core].AutoDMACtrl=value;
if(value==0) if(value==0)
@ -1573,7 +1582,7 @@ static __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
} }
void CALLBACK SPU2write(u32 rmem, u16 value) EXPORT_C_(void) SPU2write(u32 rmem, u16 value)
{ {
#ifdef S2R_ENABLE #ifdef S2R_ENABLE
if(!replay_mode) if(!replay_mode)
@ -1613,7 +1622,7 @@ void CALLBACK SPU2write(u32 rmem, u16 value)
} }
} }
u16 CALLBACK SPU2read(u32 rmem) EXPORT_C_(u16) SPU2read(u32 rmem)
{ {
// if(!replay_mode) // if(!replay_mode)
// s2r_readreg(Cycles,rmem); // s2r_readreg(Cycles,rmem);
@ -1713,7 +1722,7 @@ static int getFreezeSize()
} }
s32 CALLBACK SPU2freeze(int mode, freezeData *data) EXPORT_C_(s32) SPU2freeze(int mode, freezeData *data)
{ {
if (mode == FREEZE_LOAD) if (mode == FREEZE_LOAD)
{ {
@ -1978,7 +1987,7 @@ void StopVoices(int core, u32 value)
// if start is 1, starts recording spu2 data, else stops // if start is 1, starts recording spu2 data, else stops
// returns a non zero value if successful // returns a non zero value if successful
// for now, pData is not used // for now, pData is not used
int CALLBACK SPU2setupRecording(int start, void* pData) EXPORT_C_(int) SPU2setupRecording(int start, void* pData)
{ {
// Don't record if we have a bogus state. // Don't record if we have a bogus state.
if( disableFreezes ) return 0; if( disableFreezes ) return 0;

View File

@ -34,9 +34,49 @@
//SPU2 plugin defines //SPU2 plugin defines
//#define __MSCW32__ //#define __MSCW32__
#define SPU2defs //#define SPU2defs // not using the PCSX2 defs (see below)
#include "PS2Edefs.h" #include "PS2Edefs.h"
#define EXPORT_C_(type) extern "C" __declspec(dllexport) type __stdcall
// We have our own versions that have the DLLExport attribute configured:
EXPORT_C_(s32) SPU2init();
EXPORT_C_(s32) SPU2open(void *pDsp);
EXPORT_C_(void) SPU2close();
EXPORT_C_(void) SPU2shutdown();
EXPORT_C_(void) SPU2write(u32 mem, u16 value);
EXPORT_C_(u16) SPU2read(u32 mem);
EXPORT_C_(void) SPU2readDMA4Mem(u16 *pMem, u32 size);
EXPORT_C_(void) SPU2writeDMA4Mem(u16 *pMem, u32 size);
EXPORT_C_(void) SPU2interruptDMA4();
EXPORT_C_(void) SPU2readDMA7Mem(u16* pMem, u32 size);
EXPORT_C_(void) SPU2writeDMA7Mem(u16 *pMem, u32 size);
// all addresses passed by dma will be pointers to the array starting at baseaddr
// This function is necessary to successfully save and reload the spu2 state
EXPORT_C_(void) SPU2setDMABaseAddr(uptr baseaddr);
EXPORT_C_(void) SPU2interruptDMA7();
EXPORT_C_(u32) SPU2ReadMemAddr(int core);
EXPORT_C_(void) SPU2WriteMemAddr(int core,u32 value);
EXPORT_C_(void) SPU2irqCallback(void (*SPU2callback)(),void (*DMA4callback)(),void (*DMA7callback)());
// extended funcs
// if start is 1, starts recording spu2 data, else stops
// returns a non zero value if successful
// for now, pData is not used
EXPORT_C_(int) SPU2setupRecording(int start, void* pData);
EXPORT_C_(void) SPU2setClockPtr(u32* ptr);
EXPORT_C_(void) SPU2async(u32 cycles);
EXPORT_C_(s32) SPU2freeze(int mode, freezeData *data);
EXPORT_C_(void) SPU2configure();
EXPORT_C_(void) SPU2about();
EXPORT_C_(s32) SPU2test();
//#define EFFECTS_DUMP //#define EFFECTS_DUMP
//Plugin parts //Plugin parts

View File

@ -178,11 +178,11 @@ public:
{ {
pSourceVoice->Stop( 0 ); pSourceVoice->Stop( 0 );
pSourceVoice->FlushSourceBuffers(); pSourceVoice->FlushSourceBuffers();
pSourceVoice->DestroyVoice();
Sleep(50); // give the engine some time to stop voices Sleep(50); // give the engine some time to stop voices
pSourceVoice = NULL;
voiceContext.pSourceVoice = NULL; voiceContext.pSourceVoice = NULL;
voiceContext.sndout = NULL; voiceContext.sndout = NULL;
pSourceVoice->DestroyVoice();
pSourceVoice = NULL;
} }
Sleep(50); // give the engine some more time, because I don't trust it. Sleep(50); // give the engine some more time, because I don't trust it.