spu: clean up unneeded code
authornotaz <notasas@gmail.com>
Thu, 22 Sep 2011 17:26:34 +0000 (20:26 +0300)
committernotaz <notasas@gmail.com>
Thu, 22 Sep 2011 18:56:18 +0000 (21:56 +0300)
plugins/dfsound/externals.h
plugins/dfsound/freeze.c
plugins/dfsound/registers.c
plugins/dfsound/registers.h
plugins/dfsound/regs.h [deleted file]
plugins/dfsound/spu.c

index 0ddf406..4ce39bb 100644 (file)
@@ -107,19 +107,15 @@ typedef struct
  int               spos;\r
  int               sinc;\r
 \r
  int               spos;\r
  int               sinc;\r
 \r
- unsigned char *   pStart;                             // start ptr into sound mem\r
  unsigned char *   pCurr;                              // current pos in sound mem\r
  unsigned char *   pLoop;                              // loop ptr in sound mem\r
 \r
  unsigned int      bStop:1;                            // is channel stopped (sample _can_ still be playing, ADSR Release phase)\r
  unsigned int      bReverb:1;                          // can we do reverb on this channel? must have ctrl register bit, to get active\r
  unsigned char *   pCurr;                              // current pos in sound mem\r
  unsigned char *   pLoop;                              // loop ptr in sound mem\r
 \r
  unsigned int      bStop:1;                            // is channel stopped (sample _can_ still be playing, ADSR Release phase)\r
  unsigned int      bReverb:1;                          // can we do reverb on this channel? must have ctrl register bit, to get active\r
- unsigned int      bIgnoreLoop:1;                      // ignore loop bit, if an external loop address is used\r
  unsigned int      bRVBActive:1;                       // reverb active flag\r
  unsigned int      bNoise:1;                           // noise active flag\r
  unsigned int      bFMod:2;                            // freq mod (0=off, 1=sound channel, 2=freq channel)\r
 \r
  unsigned int      bRVBActive:1;                       // reverb active flag\r
  unsigned int      bNoise:1;                           // noise active flag\r
  unsigned int      bFMod:2;                            // freq mod (0=off, 1=sound channel, 2=freq channel)\r
 \r
- int               iActFreq;                           // current psx pitch\r
- int               iUsedFreq;                          // current pc pitch\r
  int               iLeftVolume;                        // left volume\r
  int               iRightVolume;                       // right volume\r
  ADSRInfoEx        ADSRX;\r
  int               iLeftVolume;                        // left volume\r
  int               iRightVolume;                       // right volume\r
  ADSRInfoEx        ADSRX;\r
index d09a9b0..6caa6bf 100644 (file)
@@ -22,7 +22,6 @@
 #include "externals.h"\r
 #include "registers.h"\r
 #include "spu.h"\r
 #include "externals.h"\r
 #include "registers.h"\r
 #include "spu.h"\r
-#include "regs.h"\r
 \r
 ////////////////////////////////////////////////////////////////////////\r
 // freeze structs\r
 \r
 ////////////////////////////////////////////////////////////////////////\r
 // freeze structs\r
@@ -129,16 +128,16 @@ static void save_channel(SPUCHAN_orig *d, const SPUCHAN *s, int ch)
  d->spos = s->spos;\r
  d->sinc = s->sinc;\r
  memcpy(d->SB, s->SB, sizeof(d->SB));\r
  d->spos = s->spos;\r
  d->sinc = s->sinc;\r
  memcpy(d->SB, s->SB, sizeof(d->SB));\r
- d->pStart = s->pStart;\r
+ d->pStart = (unsigned char *)((regAreaGet(ch,6)&~1)<<3);\r
  d->pCurr = s->pCurr;\r
  d->pLoop = s->pLoop;\r
  d->bOn = !!(dwChannelOn & (1<<ch));\r
  d->bStop = s->bStop;\r
  d->bReverb = s->bReverb;\r
  d->pCurr = s->pCurr;\r
  d->pLoop = s->pLoop;\r
  d->bOn = !!(dwChannelOn & (1<<ch));\r
  d->bStop = s->bStop;\r
  d->bReverb = s->bReverb;\r
- d->iActFreq = s->iActFreq;\r
- d->iUsedFreq = s->iUsedFreq;\r
+ d->iActFreq = 1;\r
+ d->iUsedFreq = 2;\r
  d->iLeftVolume = s->iLeftVolume;\r
  d->iLeftVolume = s->iLeftVolume;\r
- d->bIgnoreLoop = s->bIgnoreLoop;\r
+ d->bIgnoreLoop = 0;\r
  d->iRightVolume = s->iRightVolume;\r
  d->iRawPitch = s->iRawPitch;\r
  d->s_1 = s->SB[27]; // yes it's reversed\r
  d->iRightVolume = s->iRightVolume;\r
  d->iRawPitch = s->iRawPitch;\r
  d->s_1 = s->SB[27]; // yes it's reversed\r
@@ -168,16 +167,12 @@ static void load_channel(SPUCHAN *d, const SPUCHAN_orig *s, int ch)
  d->spos = s->spos;\r
  d->sinc = s->sinc;\r
  memcpy(d->SB, s->SB, sizeof(d->SB));\r
  d->spos = s->spos;\r
  d->sinc = s->sinc;\r
  memcpy(d->SB, s->SB, sizeof(d->SB));\r
- d->pStart = (void *)((long)s->pStart & 0x7fff0);\r
  d->pCurr = (void *)((long)s->pCurr & 0x7fff0);\r
  d->pLoop = (void *)((long)s->pLoop & 0x7fff0);\r
  if (s->bOn) dwChannelOn |= 1<<ch;\r
  d->bStop = s->bStop;\r
  d->bReverb = s->bReverb;\r
  d->pCurr = (void *)((long)s->pCurr & 0x7fff0);\r
  d->pLoop = (void *)((long)s->pLoop & 0x7fff0);\r
  if (s->bOn) dwChannelOn |= 1<<ch;\r
  d->bStop = s->bStop;\r
  d->bReverb = s->bReverb;\r
- d->iActFreq = s->iActFreq;\r
- d->iUsedFreq = s->iUsedFreq;\r
  d->iLeftVolume = s->iLeftVolume;\r
  d->iLeftVolume = s->iLeftVolume;\r
- d->bIgnoreLoop = s->bIgnoreLoop;\r
  d->iRightVolume = s->iRightVolume;\r
  d->iRawPitch = s->iRawPitch;\r
  d->bRVBActive = s->bRVBActive;\r
  d->iRightVolume = s->iRightVolume;\r
  d->iRawPitch = s->iRawPitch;\r
  d->bRVBActive = s->bRVBActive;\r
@@ -243,8 +238,6 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode,SPUFreeze_t * pF)
    for(i=0;i<MAXCHAN;i++)\r
     {\r
      save_channel(&pFO->s_chan[i],&s_chan[i],i);\r
    for(i=0;i<MAXCHAN;i++)\r
     {\r
      save_channel(&pFO->s_chan[i],&s_chan[i],i);\r
-     if(pFO->s_chan[i].pStart)\r
-      pFO->s_chan[i].pStart-=(unsigned long)spuMemC;\r
      if(pFO->s_chan[i].pCurr)\r
       pFO->s_chan[i].pCurr-=(unsigned long)spuMemC;\r
      if(pFO->s_chan[i].pLoop)\r
      if(pFO->s_chan[i].pCurr)\r
       pFO->s_chan[i].pCurr-=(unsigned long)spuMemC;\r
      if(pFO->s_chan[i].pLoop)\r
@@ -320,7 +313,6 @@ void LoadStateV5(SPUFreeze_t * pF)
   {\r
    load_channel(&s_chan[i],&pFO->s_chan[i],i);\r
 \r
   {\r
    load_channel(&s_chan[i],&pFO->s_chan[i],i);\r
 \r
-   s_chan[i].pStart+=(unsigned long)spuMemC;\r
    s_chan[i].pCurr+=(unsigned long)spuMemC;\r
    s_chan[i].pLoop+=(unsigned long)spuMemC;\r
   }\r
    s_chan[i].pCurr+=(unsigned long)spuMemC;\r
    s_chan[i].pLoop+=(unsigned long)spuMemC;\r
   }\r
@@ -336,8 +328,6 @@ void LoadStateUnknown(SPUFreeze_t * pF)
   {\r
    s_chan[i].bStop=0;\r
    s_chan[i].pLoop=spuMemC;\r
   {\r
    s_chan[i].bStop=0;\r
    s_chan[i].pLoop=spuMemC;\r
-   s_chan[i].pStart=spuMemC;\r
-   s_chan[i].pLoop=spuMemC;\r
   }\r
 \r
  dwNewChannel=0;\r
   }\r
 \r
  dwNewChannel=0;\r
index 983af8c..2493a1e 100644 (file)
@@ -21,7 +21,6 @@
 \r
 #include "externals.h"\r
 #include "registers.h"\r
 \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
 \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
 #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
 ////////////////////////////////////////////////////////////////////////\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
        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
        break;\r
      //------------------------------------------------// level with pre-calcs\r
      case 8:\r
@@ -165,11 +172,7 @@ void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val)
        break;\r
      //------------------------------------------------//\r
      case 14:                                          // loop?\r
        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
        break;\r
      //------------------------------------------------//\r
     }\r
        break;\r
      //------------------------------------------------//\r
     }\r
@@ -413,7 +416,7 @@ unsigned short CALLBACK SPUreadRegister(unsigned long reg)
 // SOUND ON register write\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
 // 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
 {\r
  int ch;\r
 \r
@@ -421,8 +424,6 @@ void SoundOn(int start,int end,unsigned short val)     // SOUND ON PSX COMAND
   {\r
    if((val&1) && regAreaGet(ch,6))                     // mmm... start has to be set before key on !?!\r
     {\r
   {\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
      // do this here, not in StartSound\r
      // - fixes fussy timing issues\r
      s_chan[ch].bStop=0;\r
@@ -440,7 +441,7 @@ void SoundOn(int start,int end,unsigned short val)     // SOUND ON PSX COMAND
 // SOUND OFF register write\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
 // 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
 {\r
  int ch;\r
  for(ch=start;ch<end;ch++,val>>=1)                     // loop channels\r
@@ -460,7 +461,7 @@ void SoundOff(int start,int end,unsigned short val)    // SOUND OFF PSX COMMAND
 // FMOD register write\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
 // 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
 {\r
  int ch;\r
 \r
@@ -487,7 +488,7 @@ void FModOn(int start,int end,unsigned short val)      // FMOD ON PSX COMMAND
 // NOISE register write\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
 // 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
 {\r
  int ch;\r
 \r
@@ -504,7 +505,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
 // 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
 {\r
  if(vol&0x8000)                                        // sweep?\r
   {\r
@@ -530,7 +531,7 @@ void SetVolumeL(unsigned char ch,short vol)            // LEFT VOLUME
 // RIGHT VOLUME register write\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
 // 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
 {\r
  if(vol&0x8000)                                        // comments... see above :)\r
   {\r
@@ -556,24 +557,22 @@ void SetVolumeR(unsigned char ch,short vol)            // RIGHT VOLUME
 // PITCH register write\r
 ////////////////////////////////////////////////////////////////////////\r
 \r
 // 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
  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
 }\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
 {\r
  int ch;\r
 \r
index 204a669..cb95bc1 100644 (file)
 \r
 #define STAT_IRQ                0x40\r
 \r
 \r
 #define STAT_IRQ                0x40\r
 \r
+///////////////////////////////////////////////////////////\r
+\r
+void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val);\r
+\r
diff --git a/plugins/dfsound/regs.h b/plugins/dfsound/regs.h
deleted file mode 100644 (file)
index 3d2689b..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/***************************************************************************\r
-                           regs.h  -  description\r
-                             -------------------\r
-    begin                : Wed May 15 2002\r
-    copyright            : (C) 2002 by Pete Bernert\r
-    email                : BlackDove@addcom.de\r
- ***************************************************************************/\r
-/***************************************************************************\r
- *                                                                         *\r
- *   This program is free software; you can redistribute it and/or modify  *\r
- *   it under the terms of the GNU General Public License as published by  *\r
- *   the Free Software Foundation; either version 2 of the License, or     *\r
- *   (at your option) any later version. See also the license.txt file for *\r
- *   additional informations.                                              *\r
- *                                                                         *\r
- ***************************************************************************/\r
-\r
-void SoundOn(int start,int end,unsigned short val);\r
-void SoundOff(int start,int end,unsigned short val);\r
-void FModOn(int start,int end,unsigned short val);\r
-void NoiseOn(int start,int end,unsigned short val);\r
-void SetVolumeL(unsigned char ch,short vol);\r
-void SetVolumeR(unsigned char ch,short vol);\r
-void SetPitch(int ch,unsigned short val);\r
-void ReverbOn(int start,int end,unsigned short val);\r
-void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val);\r
-\r
index b866cff..8c6f7d2 100644 (file)
@@ -26,7 +26,6 @@
 #include "registers.h"
 #include "cfg.h"
 #include "dsoundoss.h"
 #include "registers.h"
 #include "cfg.h"
 #include "dsoundoss.h"
-#include "regs.h"
 
 #ifdef ENABLE_NLS
 #include <libintl.h>
 
 #ifdef ENABLE_NLS
 #include <libintl.h>
@@ -287,19 +286,9 @@ INLINE void StartSound(int ch)
 // ALL KIND OF HELPERS
 ////////////////////////////////////////////////////////////////////////
 
 // ALL KIND OF HELPERS
 ////////////////////////////////////////////////////////////////////////
 
-INLINE void VoiceChangeFrequency(int ch)
-{
- s_chan[ch].iUsedFreq=s_chan[ch].iActFreq;             // -> take it and calc steps
- s_chan[ch].sinc=s_chan[ch].iRawPitch<<4;
- if(!s_chan[ch].sinc) s_chan[ch].sinc=1;
- if(iUseInterpolation==1) s_chan[ch].SB[32]=1;         // -> freq change in simle imterpolation mode: set flag
-}
-
-////////////////////////////////////////////////////////////////////////
-
 INLINE int FModChangeFrequency(int ch,int ns)
 {
 INLINE int FModChangeFrequency(int ch,int ns)
 {
- int NP=s_chan[ch].iRawPitch;
unsigned int NP=s_chan[ch].iRawPitch;
  int sinc;
 
  NP=((32768L+iFMod[ns])*NP)/32768L;
  int sinc;
 
  NP=((32768L+iFMod[ns])*NP)/32768L;
@@ -307,12 +296,7 @@ INLINE int FModChangeFrequency(int ch,int ns)
  if(NP>0x3fff) NP=0x3fff;
  if(NP<0x1)    NP=0x1;
 
  if(NP>0x3fff) NP=0x3fff;
  if(NP<0x1)    NP=0x1;
 
- NP=(44100L*NP)/(4096L);                               // calc frequency
-
- s_chan[ch].iActFreq=NP;
- s_chan[ch].iUsedFreq=NP;
- sinc=(((NP/10)<<16)/4410);
- if(!sinc) sinc=1;
+ sinc=NP<<4;                                           // calc frequency
  if(iUseInterpolation==1)                              // freq change in simple interpolation mode
   s_chan[ch].SB[32]=1;
  iFMod[ns]=0;
  if(iUseInterpolation==1)                              // freq change in simple interpolation mode
   s_chan[ch].SB[32]=1;
  iFMod[ns]=0;
@@ -512,9 +496,6 @@ static int skip_block(int ch)
  int flags = start[1];
  int ret = 0;
 
  int flags = start[1];
  int ret = 0;
 
- // Tron Bonne hack, probably wrong (could be wrong memory contents..)
- if(flags & ~7) flags = 0;
-
  if(start == pSpuIrq)
  {
   do_irq();
  if(start == pSpuIrq)
  {
   do_irq();
@@ -750,9 +731,6 @@ static void *MAINThread(void *arg)
        if(dwNewChannel&(1<<ch)) StartSound(ch);        // start new sound
        if(!(dwChannelOn&(1<<ch))) continue;            // channel not playing? next
 
        if(dwNewChannel&(1<<ch)) StartSound(ch);        // start new sound
        if(!(dwChannelOn&(1<<ch))) continue;            // channel not playing? next
 
-       if(s_chan[ch].iActFreq!=s_chan[ch].iUsedFreq)   // new psx frequency?
-        VoiceChangeFrequency(ch);
-
        if(s_chan[ch].bNoise)
         d=do_samples_noise(ch, ns_from, ns_to);
        else if(s_chan[ch].bFMod==2 || (s_chan[ch].bFMod==0 && iUseInterpolation==0))
        if(s_chan[ch].bNoise)
         d=do_samples_noise(ch, ns_from, ns_to);
        else if(s_chan[ch].bFMod==2 || (s_chan[ch].bFMod==0 && iUseInterpolation==0))
@@ -791,20 +769,18 @@ static void *MAINThread(void *arg)
        if(s_chan[ch].pCurr > pSpuIrq && s_chan[ch].pLoop > pSpuIrq)
         continue;
 
        if(s_chan[ch].pCurr > pSpuIrq && s_chan[ch].pLoop > pSpuIrq)
         continue;
 
-       if(s_chan[ch].iActFreq!=s_chan[ch].iUsedFreq)   // new psx frequency?
-         VoiceChangeFrequency(ch);
-
        s_chan[ch].spos += s_chan[ch].sinc * NSSIZE;
        while(s_chan[ch].spos >= 28 * 0x10000)
         {
        s_chan[ch].spos += s_chan[ch].sinc * NSSIZE;
        while(s_chan[ch].spos >= 28 * 0x10000)
         {
-         unsigned char *start=s_chan[ch].pCurr;
+         unsigned char *start = s_chan[ch].pCurr;
 
          // no need for bIRQReturn since the channel is silent
          iSpuAsyncWait |= skip_block(ch);
          if(start == s_chan[ch].pCurr)
           {
            // looping on self
 
          // no need for bIRQReturn since the channel is silent
          iSpuAsyncWait |= skip_block(ch);
          if(start == s_chan[ch].pCurr)
           {
            // looping on self
-           dwChannelDead|=1<<ch;
+           dwChannelDead |= 1<<ch;
+           s_chan[ch].spos = 0;
            break;
           }
 
            break;
           }
 
@@ -1045,7 +1021,6 @@ void SetupStreams(void)
 //   s_chan[i].hMutex=CreateMutex(NULL,FALSE,NULL);
    s_chan[i].ADSRX.SustainLevel = 0xf;                 // -> init sustain
    s_chan[i].pLoop=spuMemC;
 //   s_chan[i].hMutex=CreateMutex(NULL,FALSE,NULL);
    s_chan[i].ADSRX.SustainLevel = 0xf;                 // -> init sustain
    s_chan[i].pLoop=spuMemC;
-   s_chan[i].pStart=spuMemC;
    s_chan[i].pCurr=spuMemC;
   }
 
    s_chan[i].pCurr=spuMemC;
   }