spu: get rid of pCurr -1, pass right chans to silent handler
authornotaz <notasas@gmail.com>
Wed, 21 Sep 2011 01:03:48 +0000 (04:03 +0300)
committernotaz <notasas@gmail.com>
Wed, 21 Sep 2011 01:03:48 +0000 (04:03 +0300)
pCurr -1 would work weird with savestates and could screw things up in
general..

frontend/plugin_lib.c
plugins/dfsound/externals.h
plugins/dfsound/freeze.c
plugins/dfsound/registers.c
plugins/dfsound/spu.c

index b60c1cd..57b9422 100644 (file)
@@ -81,8 +81,9 @@ static void print_cpu_usage(void)
 // draw 192x8 status of 24 sound channels
 static __attribute__((noinline)) void draw_active_chans(void)
 {
-       extern void spu_get_debug_info(int *chans_out, int *fmod_chans_out, int *noise_chans_out); // hack
-       int live_chans, fmod_chans, noise_chans;
+       extern void spu_get_debug_info(int *chans_out, int *run_chans,
+               int *fmod_chans_out, int *noise_chans_out); // hack
+       int live_chans, run_chans, fmod_chans, noise_chans;
 
        static const unsigned short colors[2] = { 0x1fe3, 0x0700 };
        unsigned short *dest = (unsigned short *)pl_vout_buf +
@@ -93,11 +94,11 @@ static __attribute__((noinline)) void draw_active_chans(void)
        if (pl_vout_bpp != 16)
                return;
 
-       spu_get_debug_info(&live_chans, &fmod_chans, &noise_chans);
+       spu_get_debug_info(&live_chans, &run_chans, &fmod_chans, &noise_chans);
 
        for (c = 0; c < 24; c++) {
                d = dest + c * 8;
-               p = !(live_chans & (1<<c)) ? 0 :
+               p = !(live_chans & (1<<c)) ? (run_chans & (1<<c) ? 0x01c0 : 0) :
                     (fmod_chans & (1<<c)) ? 0xf000 :
                     (noise_chans & (1<<c)) ? 0x001f :
                     colors[c & 1];
index c69af81..5d72002 100644 (file)
@@ -227,6 +227,7 @@ extern int      bSpuInit;
 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
index 41c6f16..d09a9b0 100644 (file)
@@ -315,6 +315,7 @@ void LoadStateV5(SPUFreeze_t * pF)
 \r
  dwNewChannel=0;\r
  dwChannelOn=0;\r
+ dwChannelDead=0;\r
  for(i=0;i<MAXCHAN;i++)\r
   {\r
    load_channel(&s_chan[i],&pFO->s_chan[i],i);\r
@@ -341,6 +342,7 @@ void LoadStateUnknown(SPUFreeze_t * pF)
 \r
  dwNewChannel=0;\r
  dwChannelOn=0;\r
+ dwChannelDead=0;\r
  pSpuIrq=0;\r
 \r
  for(i=0;i<0xc0;i++)\r
index 83b9e43..f6c3058 100644 (file)
@@ -169,6 +169,7 @@ void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val)
        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
        break;\r
      //------------------------------------------------//\r
     }\r
@@ -429,6 +430,7 @@ void SoundOn(int start,int end,unsigned short val)     // SOUND ON PSX COMAND
 \r
      dwNewChannel|=(1<<ch);                            // bitfield for faster testing\r
      dwChannelOn|=1<<ch;\r
+     dwChannelDead&=~(1<<ch);\r
     }\r
   }\r
 }\r
index bea8414..b866cff 100644 (file)
@@ -108,9 +108,10 @@ int             bSPUIsOpen=0;
 
 static pthread_t thread = (pthread_t)-1;               // thread id (linux)
 
-unsigned long dwNewChannel=0;                          // flags for faster testing, if new channel starts
-unsigned long dwChannelOn=0;
-unsigned long dwPendingChanOff=0;
+unsigned int dwNewChannel=0;                           // flags for faster testing, if new channel starts
+unsigned int dwChannelOn=0;                            // not silent channels
+unsigned int dwPendingChanOff=0;
+unsigned int dwChannelDead=0;                          // silent+not useful channels
 
 void (CALLBACK *irqCallback)(void)=0;                  // func of main emu, called on spu irq
 void (CALLBACK *cddavCallback)(unsigned short,unsigned short)=0;
@@ -453,14 +454,12 @@ static int decode_block(int ch)
  int ret = 0;
 
  start=s_chan[ch].pCurr;                   // set up the current pos
- if(start == (unsigned char*)-1 ||         // special "stop" sign
-    (dwPendingChanOff&(1<<ch)))
+ if(dwPendingChanOff&(1<<ch))
  {
   dwChannelOn&=~(1<<ch);                   // -> turn everything off
   dwPendingChanOff&=~(1<<ch);
   s_chan[ch].bStop=1;
   s_chan[ch].ADSRX.EnvelopeVol=0;
-  return 0;                                // -> and done for this channel
  }
 
  //////////////////////////////////////////// irq check
@@ -495,8 +494,11 @@ static int decode_block(int ch)
   start = s_chan[ch].pLoop;
  }
 
- if (start - spuMemC >= 0x80000)
-  start = (unsigned char*)-1;
+ if (start - spuMemC >= 0x80000) {
+  // most likely wrong
+  start = spuMemC;
+  printf("ch%d oflow\n", ch);
+ }
 
  s_chan[ch].pCurr = start;                 // store values for next cycle
 
@@ -697,7 +699,7 @@ static void *MAINThread(void *arg)
 {
  int volmult = iVolume;
  int ns,ns_from,ns_to;
- int ch,d;
+ int ch,d,silentch;
  int bIRQReturn=0;
 
  while(!bEndThread)                                    // until we are shutting down
@@ -737,6 +739,8 @@ static void *MAINThread(void *arg)
      ch=lastch; ns_from=lastns; lastch=-1;             // -> setup all kind of vars to continue
     }
 
+   silentch=~(dwChannelOn|dwNewChannel);
+
    //--------------------------------------------------//
    //- main channel loop                              -// 
    //--------------------------------------------------//
@@ -782,9 +786,8 @@ static void *MAINThread(void *arg)
     if(!bIRQReturn && (spuCtrl&CTRL_IRQ))
      for(ch=0;ch<MAXCHAN;ch++)
       {
-       if(dwChannelOn&(1<<ch)) continue;               // already handled
-       if(s_chan[ch].pCurr == (unsigned char *)-1)
-        continue;
+       if(!(silentch&(1<<ch))) continue;               // already handled
+       if(dwChannelDead&(1<<ch)) continue;
        if(s_chan[ch].pCurr > pSpuIrq && s_chan[ch].pLoop > pSpuIrq)
         continue;
 
@@ -801,7 +804,7 @@ static void *MAINThread(void *arg)
          if(start == s_chan[ch].pCurr)
           {
            // looping on self
-           s_chan[ch].pCurr=(unsigned char *)-1;
+           dwChannelDead|=1<<ch;
            break;
           }
 
@@ -1187,9 +1190,9 @@ char * SPUgetLibInfos(void)
 */
 
 // debug
-void spu_get_debug_info(int *chans_out, int *fmod_chans_out, int *noise_chans_out)
+void spu_get_debug_info(int *chans_out, int *run_chans, int *fmod_chans_out, int *noise_chans_out)
 {
- int ch = 0, fmod_chans = 0, noise_chans = 0;
+ int ch = 0, fmod_chans = 0, noise_chans = 0, irq_chans = 0;
 
  for(;ch<MAXCHAN;ch++)
  {
@@ -1199,9 +1202,12 @@ void spu_get_debug_info(int *chans_out, int *fmod_chans_out, int *noise_chans_ou
    fmod_chans |= 1 << ch;
   if (s_chan[ch].bNoise)
    noise_chans |= 1 << ch;
+  if((spuCtrl&CTRL_IRQ) && s_chan[ch].pCurr <= pSpuIrq && s_chan[ch].pLoop <= pSpuIrq)
+   irq_chans |= 1 << ch;
  }
 
  *chans_out = dwChannelOn;
+ *run_chans = ~dwChannelOn & ~dwChannelDead & irq_chans;
  *fmod_chans_out = fmod_chans;
  *noise_chans_out = noise_chans;
 }