From: notaz Date: Sat, 27 Dec 2025 00:50:15 +0000 (+0200) Subject: spu: remove struct duplications X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f06cf4a22e554ec6f6bd668a96470422d8b38f75;p=pcsx_rearmed.git spu: remove struct duplications caused spunull savestate crashes --- diff --git a/include/psemu_plugin_defs.h b/include/psemu_plugin_defs.h index c2c61444..2003e65d 100644 --- a/include/psemu_plugin_defs.h +++ b/include/psemu_plugin_defs.h @@ -241,6 +241,34 @@ typedef struct PadDataS unsigned char reserved[22]; } PadDataS; +typedef struct { + int y0, y1; +} ADPCM_Decode_t; + +typedef struct xa_decode { + int freq; + int nbits; + int stereo; + int nsamples; + ADPCM_Decode_t left, right; + short pcm[16384]; +} xa_decode_t; + +typedef struct { + char PluginName[8]; + unsigned int PluginVersion; + unsigned int Size; +} SPUFreezeHdr_t; + +typedef struct SPUFreeze { + char PluginName[8]; + unsigned int PluginVersion; + unsigned int Size; + unsigned char SPUPorts[0x200]; + unsigned char SPURam[0x80000]; + xa_decode_t xa; +} SPUFreeze_t; + /* NET PlugIn v2 */ /* Added by linuzappz@pcsx.net */ diff --git a/libpcsxcore/decode_xa.c b/libpcsxcore/decode_xa.c index fb6fd135..449111cb 100644 --- a/libpcsxcore/decode_xa.c +++ b/libpcsxcore/decode_xa.c @@ -22,6 +22,7 @@ */ #include "decode_xa.h" +#include "psemu_plugin_defs.h" #define FIXED diff --git a/libpcsxcore/decode_xa.h b/libpcsxcore/decode_xa.h index 2d85c931..5495f326 100644 --- a/libpcsxcore/decode_xa.h +++ b/libpcsxcore/decode_xa.h @@ -26,20 +26,9 @@ extern "C" { #include "psxcommon.h" -typedef struct { - s32 y0, y1; -} ADPCM_Decode_t; +struct xa_decode; -typedef struct xa_decode { - int freq; - int nbits; - int stereo; - int nsamples; - ADPCM_Decode_t left, right; - short pcm[16384]; -} xa_decode_t; - -s32 xa_decode_sector( xa_decode_t *xdp, +s32 xa_decode_sector( struct xa_decode *xdp, const unsigned char *sectorp, int is_first_sector ); diff --git a/libpcsxcore/plugins.h b/libpcsxcore/plugins.h index d32c9e41..80417577 100644 --- a/libpcsxcore/plugins.h +++ b/libpcsxcore/plugins.h @@ -100,20 +100,6 @@ typedef void (CALLBACK* SPUreadDMAMem)(unsigned short *, int, unsigned int); typedef void (CALLBACK* SPUplayADPCMchannel)(xa_decode_t *, unsigned int, int); typedef void (CALLBACK* SPUregisterCallback)(void (CALLBACK *callback)(int)); typedef void (CALLBACK* SPUregisterScheduleCb)(void (CALLBACK *callback)(unsigned int cycles_after)); -typedef struct { - unsigned char PluginName[8]; - uint32_t PluginVersion; - uint32_t Size; -} SPUFreezeHdr_t; -typedef struct SPUFreeze { - unsigned char PluginName[8]; - uint32_t PluginVersion; - uint32_t Size; - unsigned char SPUPorts[0x200]; - unsigned char SPURam[0x80000]; - xa_decode_t xa; - unsigned char *unused; -} SPUFreeze_t; typedef long (CALLBACK* SPUfreeze)(unsigned int, struct SPUFreeze *, unsigned int); typedef void (CALLBACK* SPUasync)(unsigned int, unsigned int); typedef int (CALLBACK* SPUplayCDDAchannel)(short *, int, unsigned int, int); diff --git a/plugins/dfsound/externals.h b/plugins/dfsound/externals.h index 3303853b..cf8b7183 100644 --- a/plugins/dfsound/externals.h +++ b/plugins/dfsound/externals.h @@ -90,6 +90,8 @@ typedef struct int StepCounter; // 0 -> 32k } ADSRInfoEx; +struct xa_decode; + /////////////////////////////////////////////////////////// // MAIN CHANNEL STRUCT @@ -244,7 +246,7 @@ typedef struct //void (CALLBACK *cddavCallback)(short, short); void (CALLBACK *scheduleCallback)(unsigned int); - const xa_decode_t * xapGlobal; + const struct xa_decode * xapGlobal; unsigned int * XAFeed; unsigned int * XAPlay; unsigned int * XAStart; @@ -294,7 +296,7 @@ void do_irq_io(int cycles_after); #endif -void FeedXA(const xa_decode_t *xap); +void FeedXA(const struct xa_decode *xap); void FeedCDDA(unsigned char *pcm, int nBytes); #endif /* __P_SOUND_EXTERNALS_H__ */ diff --git a/plugins/dfsound/freeze.c b/plugins/dfsound/freeze.c index 13ee2a56..76dad065 100644 --- a/plugins/dfsound/freeze.c +++ b/plugins/dfsound/freeze.c @@ -24,6 +24,7 @@ #include "externals.h" #include "registers.h" #include "spu.h" +#include "psemu_plugin_defs.h" //////////////////////////////////////////////////////////////////////// // freeze structs @@ -108,16 +109,6 @@ typedef struct ADSRInfoEx_orig ADSRX; // next ADSR settings (will be moved to active on sample start) } SPUCHAN_orig; -typedef struct SPUFreeze -{ - char szSPUName[8]; - uint32_t ulFreezeVersion; - uint32_t ulFreezeSize; - unsigned char cSPUPort[0x200]; - unsigned char cSPURam[0x80000]; - xa_decode_t xaS; -} SPUFreeze_t; - typedef struct { unsigned short spuIrq; @@ -261,23 +252,23 @@ long DoFreeze(unsigned int ulFreezeMode, SPUFreeze_t * pF, if(ulFreezeMode==1) memset(pF,0,sizeof(SPUFreeze_t)+sizeof(SPUOSSFreeze_t)); - strcpy(pF->szSPUName,"PBOSS"); - pF->ulFreezeVersion=5; - pF->ulFreezeSize=sizeof(SPUFreeze_t)+sizeof(SPUOSSFreeze_t); + strcpy(pF->PluginName, "PBOSS"); + pF->PluginVersion = 5; + pF->Size = sizeof(SPUFreeze_t)+sizeof(SPUOSSFreeze_t); if(ulFreezeMode==2) return 1; // info mode? ok, bye // save mode: regAreaGet(H_SPUctrl) = spu.spuCtrl; regAreaGet(H_SPUstat) = spu.spuStat; - memcpy(pF->cSPURam,spu.spuMem,0x80000); // copy common infos - memcpy(pF->cSPUPort,spu.regArea,0x200); + memcpy(pF->SPURam, spu.spuMem, 0x80000); // copy common infos + memcpy(pF->SPUPorts, spu.regArea, 0x200); if(spu.xapGlobal && spu.XAPlay!=spu.XAFeed) // some xa { xa_left = spu.XAFeed - spu.XAPlay; if (xa_left < 0) xa_left = spu.XAEnd - spu.XAPlay + spu.XAFeed - spu.XAStart; - pF->xaS = *spu.xapGlobal; + pF->xa = *spu.xapGlobal; } else if (spu.CDDAPlay != spu.CDDAFeed) { @@ -286,19 +277,19 @@ long DoFreeze(unsigned int ulFreezeMode, SPUFreeze_t * pF, cdda_left = spu.CDDAFeed - spu.CDDAPlay; if (cdda_left < 0) cdda_left = spu.CDDAEnd - spu.CDDAPlay + spu.CDDAFeed - spu.CDDAStart; - if (cdda_left > sizeof(pF->xaS.pcm) / 4) - cdda_left = sizeof(pF->xaS.pcm) / 4; + if (cdda_left > sizeof(pF->xa.pcm) / 4) + cdda_left = sizeof(pF->xa.pcm) / 4; if (p + cdda_left <= spu.CDDAEnd) - memcpy(pF->xaS.pcm, p, cdda_left * 4); + memcpy(pF->xa.pcm, p, cdda_left * 4); else { - memcpy(pF->xaS.pcm, p, (spu.CDDAEnd - p) * 4); - memcpy((char *)pF->xaS.pcm + (spu.CDDAEnd - p) * 4, spu.CDDAStart, + memcpy(pF->xa.pcm, p, (spu.CDDAEnd - p) * 4); + memcpy((char *)pF->xa.pcm + (spu.CDDAEnd - p) * 4, spu.CDDAStart, (cdda_left - (spu.CDDAEnd - p)) * 4); } - pF->xaS.nsamples = 0; + pF->xa.nsamples = 0; } else - memset(&pF->xaS,0,sizeof(xa_decode_t)); // or clean xa + memset(&pF->xa, 0, sizeof(xa_decode_t)); // or clean xa pFO=(SPUOSSFreeze_t *)(pF+1); // store special stuff @@ -338,27 +329,27 @@ long DoFreeze(unsigned int ulFreezeMode, SPUFreeze_t * pF, if(ulFreezeMode!=0) return 0; // bad mode? bye - memcpy(spu.spuMem,pF->cSPURam,0x80000); // get ram - memcpy(spu.regArea,pF->cSPUPort,0x200); + memcpy(spu.spuMem, pF->SPURam, 0x80000); // get ram + memcpy(spu.regArea, pF->SPUPorts, 0x200); spu.bMemDirty = 1; spu.spuCtrl = regAreaGet(H_SPUctrl); spu.spuStat = regAreaGet(H_SPUstat); - if (!strcmp(pF->szSPUName,"PBOSS") && pF->ulFreezeVersion==5) + if (!strcmp(pF->PluginName, "PBOSS") && pF->PluginVersion == 5) pFO = LoadStateV5(pF, cycles); else LoadStateUnknown(pF, cycles); spu.XAPlay = spu.XAFeed = spu.XAStart; spu.CDDAPlay = spu.CDDAFeed = spu.CDDAStart; spu.cdClearSamples = 512; - if (pFO && pFO->xa_left && pF->xaS.nsamples) { // start xa again - FeedXA(&pF->xaS); + if (pFO && pFO->xa_left && pF->xa.nsamples) { // start xa again + FeedXA(&pF->xa); spu.XAPlay = spu.XAFeed - pFO->xa_left; if (spu.XAPlay < spu.XAStart) spu.XAPlay = spu.XAStart; } else if (pFO && pFO->cdda_left) { // start cdda again - FeedCDDA((void *)pF->xaS.pcm, pFO->cdda_left * 4); + FeedCDDA((void *)pF->xa.pcm, pFO->cdda_left * 4); } // not in old savestates @@ -370,7 +361,7 @@ long DoFreeze(unsigned int ulFreezeMode, SPUFreeze_t * pF, spu.XALastVal = 0; spu.last_keyon_cycles = cycles - 16*786u; spu.interpolation = -1; - if (pFO && pF->ulFreezeSize >= sizeof(*pF) + offsetof(SPUOSSFreeze_t, rvb_sb)) { + if (pFO && pF->Size >= sizeof(*pF) + offsetof(SPUOSSFreeze_t, rvb_sb)) { spu.cycles_dma_end = pFO->cycles_dma_end; spu.decode_dirty_ch = pFO->decode_dirty_ch; spu.dwNoiseVal = pFO->dwNoiseVal; @@ -379,7 +370,7 @@ long DoFreeze(unsigned int ulFreezeMode, SPUFreeze_t * pF, spu.XALastVal = pFO->XALastVal; spu.last_keyon_cycles = pFO->last_keyon_cycles; } - if (pFO && pF->ulFreezeSize >= sizeof(*pF) + sizeof(*pFO)) { + if (pFO && pF->Size >= sizeof(*pF) + sizeof(*pFO)) { for (i = 0; i < 2; i++) for (j = 0; j < 2; j++) memcpy(&sb_rvb->SB_rvb[i][j*4], pFO->rvb_sb[i], 4 * sizeof(sb_rvb->SB_rvb[i][0])); diff --git a/plugins/dfsound/psemuxa.h b/plugins/dfsound/psemuxa.h index 11b748df..741b7eba 100644 --- a/plugins/dfsound/psemuxa.h +++ b/plugins/dfsound/psemuxa.h @@ -6,22 +6,9 @@ #ifndef DECODEXA_H #define DECODEXA_H -typedef struct -{ - int y0, y1; -} ADPCM_Decode_t; +struct xa_decode; -typedef struct xa_decode -{ - int freq; - int nbits; - int stereo; - int nsamples; - ADPCM_Decode_t left, right; - short pcm[16384]; -} xa_decode_t; - -int xa_decode_sector( xa_decode_t *xdp, +int xa_decode_sector( struct xa_decode *xdp, unsigned char *sectorp, int is_first_sector ); diff --git a/plugins/dfsound/xa.c b/plugins/dfsound/xa.c index 380d1388..0c774f03 100644 --- a/plugins/dfsound/xa.c +++ b/plugins/dfsound/xa.c @@ -19,6 +19,7 @@ #include "spu.h" #define _IN_XA #include +#include "psemu_plugin_defs.h" // will be included from spu.c #ifdef _IN_SPU diff --git a/plugins/spunull/spunull.c b/plugins/spunull/spunull.c index 38cd44b5..e941fff1 100644 --- a/plugins/spunull/spunull.c +++ b/plugins/spunull/spunull.c @@ -1,11 +1,3 @@ -///////////////////////////////////////////////////////// - -#define PSE_LT_SPU 4 -#define PSE_SPU_ERR_SUCCESS 0 -#define PSE_SPU_ERR -60 -#define PSE_SPU_ERR_NOTCONFIGURED PSE_SPU_ERR -1 -#define PSE_SPU_ERR_INIT PSE_SPU_ERR -2 - ///////////////////////////////////////////////////////// // main emu calls: // 0. Get type/name/version @@ -21,8 +13,8 @@ #include #include #include -#include "xa.h" #include "register.h" +#include "../../include/psemu_plugin_defs.h" // some ms windows compatibility define #undef CALLBACK #define CALLBACK @@ -400,16 +392,6 @@ char * SPUgetLibInfos(void) //////////////////////////////////////////////////////////////////////// -typedef struct -{ - char szSPUName[8]; - unsigned long ulFreezeVersion; - unsigned long ulFreezeSize; - unsigned char cSPUPort[0x200]; - unsigned char cSPURam[0x80000]; - xa_decode_t xaS; -} SPUFreeze_t; - typedef struct { unsigned long Future[256]; @@ -429,23 +411,23 @@ long CALLBACK SPUfreeze(unsigned long ulFreezeMode,SPUFreeze_t * pF,unsigned int if(ulFreezeMode==1) memset(pF,0,sizeof(SPUFreeze_t)+sizeof(SPUNULLFreeze_t)); - strcpy(pF->szSPUName,"PBNUL"); - pF->ulFreezeVersion=1; - pF->ulFreezeSize=sizeof(SPUFreeze_t)+sizeof(SPUNULLFreeze_t); + strcpy(pF->PluginName, "PBNUL"); + pF->PluginVersion = 1; + pF->Size = sizeof(SPUFreeze_t)+sizeof(SPUNULLFreeze_t); if(ulFreezeMode==2) return 1; - memcpy(pF->cSPURam,spuMem,0x80000); - memcpy(pF->cSPUPort,regArea,0x200); + memcpy(pF->SPURam, spuMem, 0x80000); + memcpy(pF->SPUPorts, regArea, 0x200); // dummy: - memset(&pF->xaS,0,sizeof(xa_decode_t)); + memset(&pF->xa, 0, sizeof(xa_decode_t)); return 1; } if(ulFreezeMode!=0) return 0; - memcpy(spuMem,pF->cSPURam,0x80000); - memcpy(regArea,pF->cSPUPort,0x200); + memcpy(spuMem, pF->SPURam, 0x80000); + memcpy(regArea, pF->SPUPorts, 0x200); for(i=0;i<0x100;i++) { diff --git a/plugins/spunull/xa.h b/plugins/spunull/xa.h deleted file mode 100644 index 6fb7bfdf..00000000 --- a/plugins/spunull/xa.h +++ /dev/null @@ -1,22 +0,0 @@ -//============================================ -//=== Audio XA decoding -//=== Kazzuya -//============================================ - -typedef struct -{ - int y0, y1; -} ADPCM_Decode_t; - -typedef struct -{ - int freq; - int nbits; - int stereo; - int nsamples; - ADPCM_Decode_t left, right; - short pcm[16384]; -} xa_decode_t; - - -