psxcounters: change spu update ~2ms
[pcsx_rearmed.git] / plugins / dfsound / registers.c
index f6c3058..669c70f 100644 (file)
@@ -21,7 +21,6 @@
 \r
 #include "externals.h"\r
 #include "registers.h"\r
-#include "regs.h"\r
 \r
 /*\r
 // adsr time values (in ms) by James Higgs ... see the end of\r
 #define SUSTAIN_MS     441L\r
 #define RELEASE_MS     437L\r
 \r
+static void SoundOn(int start,int end,unsigned short val);\r
+static void SoundOff(int start,int end,unsigned short val);\r
+static void FModOn(int start,int end,unsigned short val);\r
+static void NoiseOn(int start,int end,unsigned short val);\r
+static void SetVolumeL(unsigned char ch,short vol);\r
+static void SetVolumeR(unsigned char ch,short vol);\r
+static void SetPitch(int ch,unsigned short val);\r
+static void ReverbOn(int start,int end,unsigned short val);\r
+\r
 ////////////////////////////////////////////////////////////////////////\r
 // WRITE REGISTERS: called by main emu\r
 ////////////////////////////////////////////////////////////////////////\r
@@ -69,8 +77,7 @@ void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val)
        break;\r
      //------------------------------------------------// start\r
      case 6:      \r
-       // Brain Dead 13 - align to 16 boundary\r
-       s_chan[ch].pStart= spuMemC+(unsigned long)((val<<3)&~0xf);\r
+       // taken from regArea later\r
        break;\r
      //------------------------------------------------// level with pre-calcs\r
      case 8:\r
@@ -165,11 +172,11 @@ void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val)
        break;\r
      //------------------------------------------------//\r
      case 14:                                          // loop?\r
-       //WaitForSingleObject(s_chan[ch].hMutex,2000);        // -> no multithread fuckups\r
-       s_chan[ch].pLoop=spuMemC+((unsigned long)((val<<3)&~0xf));\r
-       //s_chan[ch].bIgnoreLoop=1;\r
-       //ReleaseMutex(s_chan[ch].hMutex);                    // -> oki, on with the thread\r
-       dwChannelDead&=~(1<<ch);\r
+       s_chan[ch].pLoop=spuMemC+((val&~1)<<3);\r
+       if(s_chan[ch].bJump)\r
+        // real machine would be most likely still doing the last block and use new value for the jump;\r
+        // but we decode ahead a bit and already did the jump part, so compensate for that now.\r
+        s_chan[ch].pCurr=s_chan[ch].pLoop;\r
        break;\r
      //------------------------------------------------//\r
     }\r
@@ -413,20 +420,20 @@ unsigned short CALLBACK SPUreadRegister(unsigned long reg)
 // SOUND ON register write\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-void SoundOn(int start,int end,unsigned short val)     // SOUND ON PSX COMAND\r
+static void SoundOn(int start,int end,unsigned short val)\r
 {\r
  int ch;\r
 \r
  for(ch=start;ch<end;ch++,val>>=1)                     // loop channels\r
   {\r
-   if((val&1) && s_chan[ch].pStart)                    // mmm... start has to be set before key on !?!\r
+   if((val&1) && regAreaGet(ch,6))                     // mmm... start has to be set before key on !?!\r
     {\r
-     s_chan[ch].bIgnoreLoop=0;\r
-\r
      // do this here, not in StartSound\r
      // - fixes fussy timing issues\r
      s_chan[ch].bStop=0;\r
-     s_chan[ch].pCurr=s_chan[ch].pStart;\r
+     s_chan[ch].pCurr=spuMemC+((regAreaGet(ch,6)&~1)<<3); // must be block aligned\r
+     s_chan[ch].pLoop=spuMemC+((regAreaGet(ch,14)&~1)<<3);\r
+     s_chan[ch].bJump=0;\r
 \r
      dwNewChannel|=(1<<ch);                            // bitfield for faster testing\r
      dwChannelOn|=1<<ch;\r
@@ -439,7 +446,7 @@ void SoundOn(int start,int end,unsigned short val)     // SOUND ON PSX COMAND
 // SOUND OFF register write\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-void SoundOff(int start,int end,unsigned short val)    // SOUND OFF PSX COMMAND\r
+static void SoundOff(int start,int end,unsigned short val)\r
 {\r
  int ch;\r
  for(ch=start;ch<end;ch++,val>>=1)                     // loop channels\r
@@ -459,7 +466,7 @@ void SoundOff(int start,int end,unsigned short val)    // SOUND OFF PSX COMMAND
 // FMOD register write\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-void FModOn(int start,int end,unsigned short val)      // FMOD ON PSX COMMAND\r
+static void FModOn(int start,int end,unsigned short val)\r
 {\r
  int ch;\r
 \r
@@ -486,7 +493,7 @@ void FModOn(int start,int end,unsigned short val)      // FMOD ON PSX COMMAND
 // NOISE register write\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-void NoiseOn(int start,int end,unsigned short val)     // NOISE ON PSX COMMAND\r
+static void NoiseOn(int start,int end,unsigned short val)\r
 {\r
  int ch;\r
 \r
@@ -503,7 +510,7 @@ void NoiseOn(int start,int end,unsigned short val)     // NOISE ON PSX COMMAND
 // please note: sweep and phase invert are wrong... but I've never seen\r
 // them used\r
 \r
-void SetVolumeL(unsigned char ch,short vol)            // LEFT VOLUME\r
+static void SetVolumeL(unsigned char ch,short vol)     // LEFT VOLUME\r
 {\r
  if(vol&0x8000)                                        // sweep?\r
   {\r
@@ -529,7 +536,7 @@ void SetVolumeL(unsigned char ch,short vol)            // LEFT VOLUME
 // RIGHT VOLUME register write\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-void SetVolumeR(unsigned char ch,short vol)            // RIGHT VOLUME\r
+static void SetVolumeR(unsigned char ch,short vol)     // RIGHT VOLUME\r
 {\r
  if(vol&0x8000)                                        // comments... see above :)\r
   {\r
@@ -555,24 +562,22 @@ void SetVolumeR(unsigned char ch,short vol)            // RIGHT VOLUME
 // PITCH register write\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-void SetPitch(int ch,unsigned short val)               // SET PITCH\r
+static void SetPitch(int ch,unsigned short val)               // SET PITCH\r
 {\r
  int NP;\r
  if(val>0x3fff) NP=0x3fff;                             // get pitch val\r
  else           NP=val;\r
 \r
  s_chan[ch].iRawPitch=NP;\r
-\r
- NP=(44100L*NP)/4096L;                                 // calc frequency\r
- if(NP<1) NP=1;                                        // some security\r
- s_chan[ch].iActFreq=NP;                               // store frequency\r
+ s_chan[ch].sinc=(NP<<4)|8;\r
+ if(iUseInterpolation==1) s_chan[ch].SB[32]=1;         // -> freq change in simple interpolation mode: set flag\r
 }\r
 \r
 ////////////////////////////////////////////////////////////////////////\r
 // REVERB register write\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
-void ReverbOn(int start,int end,unsigned short val)    // REVERB ON PSX COMMAND\r
+static void ReverbOn(int start,int end,unsigned short val)\r
 {\r
  int ch;\r
 \r