spu: remove struct duplications
authornotaz <notasas@gmail.com>
Sat, 27 Dec 2025 00:50:15 +0000 (02:50 +0200)
committernotaz <notasas@gmail.com>
Sat, 27 Dec 2025 00:50:15 +0000 (02:50 +0200)
caused spunull savestate crashes

include/psemu_plugin_defs.h
libpcsxcore/decode_xa.c
libpcsxcore/decode_xa.h
libpcsxcore/plugins.h
plugins/dfsound/externals.h
plugins/dfsound/freeze.c
plugins/dfsound/psemuxa.h
plugins/dfsound/xa.c
plugins/spunull/spunull.c
plugins/spunull/xa.h [deleted file]

index c2c6144..2003e65 100644 (file)
@@ -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 */
 
index fb6fd13..449111c 100644 (file)
@@ -22,6 +22,7 @@
 */
 
 #include "decode_xa.h"
+#include "psemu_plugin_defs.h"
 
 #define FIXED
 
index 2d85c93..5495f32 100644 (file)
@@ -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 );
 
index d32c9e4..8041757 100644 (file)
@@ -100,20 +100,6 @@ typedef void (CALLBACK* SPUreadDMAMem)(unsigned short *, int, unsigned int);
 typedef void (CALLBACK* SPUplayADPCMchannel)(xa_decode_t *, unsigned int, int);\r
 typedef void (CALLBACK* SPUregisterCallback)(void (CALLBACK *callback)(int));\r
 typedef void (CALLBACK* SPUregisterScheduleCb)(void (CALLBACK *callback)(unsigned int cycles_after));\r
-typedef struct {\r
-       unsigned char PluginName[8];\r
-       uint32_t PluginVersion;\r
-       uint32_t Size;\r
-} SPUFreezeHdr_t;\r
-typedef struct SPUFreeze {\r
-       unsigned char PluginName[8];\r
-       uint32_t PluginVersion;\r
-       uint32_t Size;\r
-       unsigned char SPUPorts[0x200];\r
-       unsigned char SPURam[0x80000];\r
-       xa_decode_t xa;\r
-       unsigned char *unused;\r
-} SPUFreeze_t;\r
 typedef long (CALLBACK* SPUfreeze)(unsigned int, struct SPUFreeze *, unsigned int);\r
 typedef void (CALLBACK* SPUasync)(unsigned int, unsigned int);\r
 typedef int  (CALLBACK* SPUplayCDDAchannel)(short *, int, unsigned int, int);\r
index 3303853..cf8b718 100644 (file)
@@ -90,6 +90,8 @@ typedef struct
  int            StepCounter;   // 0 -> 32k\r
 } ADSRInfoEx;\r
               \r
+struct xa_decode;\r
+\r
 ///////////////////////////////////////////////////////////\r
 \r
 // MAIN CHANNEL STRUCT\r
@@ -244,7 +246,7 @@ typedef struct
  //void (CALLBACK *cddavCallback)(short, short);\r
  void (CALLBACK *scheduleCallback)(unsigned int);\r
 \r
- const xa_decode_t * xapGlobal;\r
+ const struct xa_decode * xapGlobal;\r
  unsigned int  * XAFeed;\r
  unsigned int  * XAPlay;\r
  unsigned int  * XAStart;\r
@@ -294,7 +296,7 @@ void do_irq_io(int cycles_after);
 \r
 #endif\r
 \r
-void FeedXA(const xa_decode_t *xap);\r
+void FeedXA(const struct xa_decode *xap);\r
 void FeedCDDA(unsigned char *pcm, int nBytes);\r
 \r
 #endif /* __P_SOUND_EXTERNALS_H__ */\r
index 13ee2a5..76dad06 100644 (file)
@@ -24,6 +24,7 @@
 #include "externals.h"\r
 #include "registers.h"\r
 #include "spu.h"\r
+#include "psemu_plugin_defs.h"\r
 \r
 ////////////////////////////////////////////////////////////////////////\r
 // freeze structs\r
@@ -108,16 +109,6 @@ typedef struct
  ADSRInfoEx_orig   ADSRX;                              // next ADSR settings (will be moved to active on sample start)\r
 } SPUCHAN_orig;\r
 \r
-typedef struct SPUFreeze\r
-{\r
- char          szSPUName[8];\r
- uint32_t ulFreezeVersion;\r
- uint32_t ulFreezeSize;\r
- unsigned char cSPUPort[0x200];\r
- unsigned char cSPURam[0x80000];\r
- xa_decode_t   xaS;     \r
-} SPUFreeze_t;\r
-\r
 typedef struct\r
 {\r
  unsigned short  spuIrq;\r
@@ -261,23 +252,23 @@ long DoFreeze(unsigned int ulFreezeMode, SPUFreeze_t * pF,
    if(ulFreezeMode==1)                                 \r
     memset(pF,0,sizeof(SPUFreeze_t)+sizeof(SPUOSSFreeze_t));\r
 \r
-   strcpy(pF->szSPUName,"PBOSS");\r
-   pF->ulFreezeVersion=5;\r
-   pF->ulFreezeSize=sizeof(SPUFreeze_t)+sizeof(SPUOSSFreeze_t);\r
+   strcpy(pF->PluginName, "PBOSS");\r
+   pF->PluginVersion = 5;\r
+   pF->Size = sizeof(SPUFreeze_t)+sizeof(SPUOSSFreeze_t);\r
 \r
    if(ulFreezeMode==2) return 1;                       // info mode? ok, bye\r
                                                        // save mode:\r
    regAreaGet(H_SPUctrl) = spu.spuCtrl;\r
    regAreaGet(H_SPUstat) = spu.spuStat;\r
-   memcpy(pF->cSPURam,spu.spuMem,0x80000);             // copy common infos\r
-   memcpy(pF->cSPUPort,spu.regArea,0x200);\r
+   memcpy(pF->SPURam, spu.spuMem, 0x80000);            // copy common infos\r
+   memcpy(pF->SPUPorts, spu.regArea, 0x200);\r
 \r
    if(spu.xapGlobal && spu.XAPlay!=spu.XAFeed)         // some xa\r
     {\r
      xa_left = spu.XAFeed - spu.XAPlay;\r
      if (xa_left < 0)\r
       xa_left = spu.XAEnd - spu.XAPlay + spu.XAFeed - spu.XAStart;\r
-     pF->xaS = *spu.xapGlobal;\r
+     pF->xa = *spu.xapGlobal;\r
     }\r
    else if (spu.CDDAPlay != spu.CDDAFeed)\r
     {\r
@@ -286,19 +277,19 @@ long DoFreeze(unsigned int ulFreezeMode, SPUFreeze_t * pF,
      cdda_left = spu.CDDAFeed - spu.CDDAPlay;\r
      if (cdda_left < 0)\r
       cdda_left = spu.CDDAEnd - spu.CDDAPlay + spu.CDDAFeed - spu.CDDAStart;\r
-     if (cdda_left > sizeof(pF->xaS.pcm) / 4)\r
-      cdda_left = sizeof(pF->xaS.pcm) / 4;\r
+     if (cdda_left > sizeof(pF->xa.pcm) / 4)\r
+      cdda_left = sizeof(pF->xa.pcm) / 4;\r
      if (p + cdda_left <= spu.CDDAEnd)\r
-      memcpy(pF->xaS.pcm, p, cdda_left * 4);\r
+      memcpy(pF->xa.pcm, p, cdda_left * 4);\r
      else {\r
-      memcpy(pF->xaS.pcm, p, (spu.CDDAEnd - p) * 4);\r
-      memcpy((char *)pF->xaS.pcm + (spu.CDDAEnd - p) * 4, spu.CDDAStart,\r
+      memcpy(pF->xa.pcm, p, (spu.CDDAEnd - p) * 4);\r
+      memcpy((char *)pF->xa.pcm + (spu.CDDAEnd - p) * 4, spu.CDDAStart,\r
              (cdda_left - (spu.CDDAEnd - p)) * 4);\r
      }\r
-     pF->xaS.nsamples = 0;\r
+     pF->xa.nsamples = 0;\r
     }\r
    else\r
-    memset(&pF->xaS,0,sizeof(xa_decode_t));            // or clean xa\r
+    memset(&pF->xa, 0, sizeof(xa_decode_t));           // or clean xa\r
 \r
    pFO=(SPUOSSFreeze_t *)(pF+1);                       // store special stuff\r
 \r
@@ -338,27 +329,27 @@ long DoFreeze(unsigned int ulFreezeMode, SPUFreeze_t * pF,
                                                        \r
  if(ulFreezeMode!=0) return 0;                         // bad mode? bye\r
 \r
- memcpy(spu.spuMem,pF->cSPURam,0x80000);               // get ram\r
- memcpy(spu.regArea,pF->cSPUPort,0x200);\r
+ memcpy(spu.spuMem, pF->SPURam, 0x80000);              // get ram\r
+ memcpy(spu.regArea, pF->SPUPorts, 0x200);\r
  spu.bMemDirty = 1;\r
  spu.spuCtrl = regAreaGet(H_SPUctrl);\r
  spu.spuStat = regAreaGet(H_SPUstat);\r
 \r
- if (!strcmp(pF->szSPUName,"PBOSS") && pF->ulFreezeVersion==5)\r
+ if (!strcmp(pF->PluginName, "PBOSS") && pF->PluginVersion == 5)\r
    pFO = LoadStateV5(pF, cycles);\r
  else LoadStateUnknown(pF, cycles);\r
 \r
  spu.XAPlay = spu.XAFeed = spu.XAStart;\r
  spu.CDDAPlay = spu.CDDAFeed = spu.CDDAStart;\r
  spu.cdClearSamples = 512;\r
- if (pFO && pFO->xa_left && pF->xaS.nsamples) {        // start xa again\r
-  FeedXA(&pF->xaS);\r
+ if (pFO && pFO->xa_left && pF->xa.nsamples) {         // start xa again\r
+  FeedXA(&pF->xa);\r
   spu.XAPlay = spu.XAFeed - pFO->xa_left;\r
   if (spu.XAPlay < spu.XAStart)\r
    spu.XAPlay = spu.XAStart;\r
  }\r
  else if (pFO && pFO->cdda_left) {                     // start cdda again\r
-  FeedCDDA((void *)pF->xaS.pcm, pFO->cdda_left * 4);\r
+  FeedCDDA((void *)pF->xa.pcm, pFO->cdda_left * 4);\r
  }\r
 \r
  // not in old savestates\r
@@ -370,7 +361,7 @@ long DoFreeze(unsigned int ulFreezeMode, SPUFreeze_t * pF,
  spu.XALastVal = 0;\r
  spu.last_keyon_cycles = cycles - 16*786u;\r
  spu.interpolation = -1;\r
- if (pFO && pF->ulFreezeSize >= sizeof(*pF) + offsetof(SPUOSSFreeze_t, rvb_sb)) {\r
+ if (pFO && pF->Size >= sizeof(*pF) + offsetof(SPUOSSFreeze_t, rvb_sb)) {\r
   spu.cycles_dma_end = pFO->cycles_dma_end;\r
   spu.decode_dirty_ch = pFO->decode_dirty_ch;\r
   spu.dwNoiseVal = pFO->dwNoiseVal;\r
@@ -379,7 +370,7 @@ long DoFreeze(unsigned int ulFreezeMode, SPUFreeze_t * pF,
   spu.XALastVal = pFO->XALastVal;\r
   spu.last_keyon_cycles = pFO->last_keyon_cycles;\r
  }\r
- if (pFO && pF->ulFreezeSize >= sizeof(*pF) + sizeof(*pFO)) {\r
+ if (pFO && pF->Size >= sizeof(*pF) + sizeof(*pFO)) {\r
   for (i = 0; i < 2; i++)\r
    for (j = 0; j < 2; j++)\r
     memcpy(&sb_rvb->SB_rvb[i][j*4], pFO->rvb_sb[i], 4 * sizeof(sb_rvb->SB_rvb[i][0]));\r
index 11b748d..741b7eb 100644 (file)
@@ -6,22 +6,9 @@
 #ifndef DECODEXA_H\r
 #define DECODEXA_H\r
 \r
-typedef struct\r
-{\r
-       int     y0, y1;\r
-} ADPCM_Decode_t;\r
+struct xa_decode;\r
 \r
-typedef struct xa_decode\r
-{                                                                   \r
-       int                             freq;\r
-       int                             nbits;\r
-       int                             stereo;\r
-       int                             nsamples;\r
-       ADPCM_Decode_t  left, right;\r
-       short                   pcm[16384];\r
-} xa_decode_t;\r
-\r
-int xa_decode_sector( xa_decode_t *xdp,\r
+int xa_decode_sector( struct xa_decode *xdp,\r
                                           unsigned char *sectorp,\r
                                           int is_first_sector );\r
 \r
index 380d138..0c774f0 100644 (file)
@@ -19,6 +19,7 @@
 #include "spu.h"
 #define _IN_XA
 #include <stdint.h>
+#include "psemu_plugin_defs.h"
 
 // will be included from spu.c
 #ifdef _IN_SPU
index 38cd44b..e941fff 100644 (file)
@@ -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 <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#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)
 
 ////////////////////////////////////////////////////////////////////////\r
 
-typedef struct\r
-{
- 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 (file)
index 6fb7bfd..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-//============================================\r
-//=== Audio XA decoding\r
-//=== Kazzuya\r
-//============================================\r
-\r
-typedef struct\r
-{\r
-       int     y0, y1;\r
-} ADPCM_Decode_t;\r
-\r
-typedef struct\r
-{                                                                   \r
-       int                             freq;\r
-       int                             nbits;\r
-       int                             stereo;\r
-       int                             nsamples;\r
-       ADPCM_Decode_t  left, right;\r
-       short                   pcm[16384];\r
-} xa_decode_t;\r
-\r
-\r
-