-extern SPUCHAN s_chan[];\r
-extern REVERBInfo rvb;\r
-\r
-extern unsigned long dwNoiseVal;\r
-extern unsigned short spuCtrl;\r
-extern unsigned short spuStat;\r
-extern unsigned short spuIrq;\r
-extern unsigned long spuAddr;\r
-extern int bSpuInit;\r
-extern unsigned int dwNewChannel;\r
-extern unsigned int dwChannelOn;\r
-extern unsigned int dwPendingChanOff;\r
-extern unsigned int dwChannelDead;\r
-\r
-extern int SSumR[];\r
-extern int SSumL[];\r
-extern int iCycle;\r
-extern short * pS;\r
-\r
-extern void (CALLBACK *cddavCallback)(unsigned short,unsigned short);\r
-\r
-#endif\r
+typedef struct\r
+{\r
+ unsigned short spuCtrl;\r
+ unsigned short spuStat;\r
+\r
+ unsigned int spuAddr;\r
+ union {\r
+ unsigned char *spuMemC;\r
+ unsigned short *spuMem;\r
+ };\r
+ unsigned char * pSpuIrq;\r
+\r
+ unsigned int cycles_played;\r
+ int decode_pos;\r
+ int decode_dirty_ch;\r
+ unsigned int bSpuInit:1;\r
+ unsigned int bSPUIsOpen:1;\r
+\r
+ unsigned int dwNoiseVal; // global noise generator\r
+ unsigned int dwNoiseCount;\r
+ unsigned int dwNewChannel; // flags for faster testing, if new channel starts\r
+ unsigned int dwChannelOn; // not silent channels\r
+ unsigned int dwChannelDead; // silent+not useful channels\r
+\r
+ unsigned char * pSpuBuffer;\r
+ short * pS;\r
+\r
+ void (CALLBACK *irqCallback)(void); // func of main emu, called on spu irq\r
+ void (CALLBACK *cddavCallback)(unsigned short,unsigned short);\r
+ void (CALLBACK *scheduleCallback)(unsigned int);\r
+\r
+ xa_decode_t * xapGlobal;\r
+ unsigned int * XAFeed;\r
+ unsigned int * XAPlay;\r
+ unsigned int * XAStart;\r
+ unsigned int * XAEnd;\r
+\r
+ unsigned int * CDDAFeed;\r
+ unsigned int * CDDAPlay;\r
+ unsigned int * CDDAStart;\r
+ unsigned int * CDDAEnd;\r
+\r
+ unsigned int XARepeat;\r
+ unsigned int XALastVal;\r
+\r
+ int iLeftXAVol;\r
+ int iRightXAVol;\r
+\r
+ SPUCHAN * s_chan;\r
+ REVERBInfo * rvb;\r
+\r
+ // buffers\r
+ int * SB;\r
+ int * SSumLR;\r
+\r
+ int pad[29];\r
+ unsigned short regArea[0x400];\r
+} SPUInfo;\r