+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
+ unsigned int bMemDirty:1; // had external write to SPU RAM\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)(short, 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
+\r
+#define regAreaGet(ch,offset) \\r
+ spu.regArea[((ch<<4)|(offset))>>1]\r