Diff for /np2/sound/opngeng.c between versions 1.1 and 1.2

version 1.1, 2003/10/16 17:58:04 version 1.2, 2003/10/18 07:28:50
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
   #include        "pccore.h"
   #include        "iocore.h"
 #include        "sound.h"  #include        "sound.h"
 #include        "opngen.h"  #include        "fmboard.h"
   
   
   extern  OPNCFG  opncfg;
   
 extern  SINT32  env_curve[];                            // ver0.27  extern  SINT32  env_curve[];                            // ver0.27
 extern  SINT32  envtable[];  extern  SINT32  envtable[];
 extern  SINT32  sintable[];                                     // ver0.27  extern  SINT32  sintable[];                                     // ver0.27
   
 // opn work  
 extern  UINT    playchannels;  
 extern  SINT32  feedback2;  
 extern  SINT32  feedback3;  
 extern  SINT32  feedback4;  
 extern  SINT32  outdl;  
 extern  SINT32  outdc;  
 extern  SINT32  outdr;  
 extern  SINT32  calc1024;  
 extern  SINT32  calcremain;  
 extern  SINT32  fmvolforasm;  
 extern  SINT32  fmvolforc;  
   
   
 #define SLOTOUT(s, e, c)                                                                                                        \  #define SLOTOUT(s, e, c)                                                                                                        \
                 ((sintable[(((s).freq_cnt + (c)) >> (FREQ_BITS - SIN_BITS)) &           \                  ((sintable[(((s).freq_cnt + (c)) >> (FREQ_BITS - SIN_BITS)) &           \
Line 65  static void calcratechannel(OPNCH *ch) { Line 56  static void calcratechannel(OPNCH *ch) {
         SINT32  envout;          SINT32  envout;
         SINT32  opout;          SINT32  opout;
   
         feedback2 = 0;          opngen.feedback2 = 0;
         feedback3 = 0;          opngen.feedback3 = 0;
         feedback4 = 0;          opngen.feedback4 = 0;
   
         /* SLOT 1 */          /* SLOT 1 */
         envout = calcrateenvlope(ch->slot + 0);          envout = calcrateenvlope(ch->slot + 0);
Line 85  static void calcratechannel(OPNCH *ch) { Line 76  static void calcratechannel(OPNCH *ch) {
                 }                  }
                 /* output slot1 */                  /* output slot1 */
                 if (!ch->connect1) {                  if (!ch->connect1) {
                         feedback2 = feedback3 = feedback4 = opout;                          opngen.feedback2 = opngen.feedback3 = opngen.feedback4 = opout;
                 }                  }
                 else {                  else {
                         *ch->connect1 += opout;                          *ch->connect1 += opout;
Line 94  static void calcratechannel(OPNCH *ch) { Line 85  static void calcratechannel(OPNCH *ch) {
         /* SLOT 2 */          /* SLOT 2 */
         envout = calcrateenvlope(ch->slot + 1);          envout = calcrateenvlope(ch->slot + 1);
         if (envout > 0) {          if (envout > 0) {
                 *ch->connect2 += SLOTOUT(ch->slot[1], envout, feedback2);                  *ch->connect2 += SLOTOUT(ch->slot[1], envout, opngen.feedback2);
         }          }
         /* SLOT 3 */          /* SLOT 3 */
         envout = calcrateenvlope(ch->slot + 2);          envout = calcrateenvlope(ch->slot + 2);
         if (envout > 0) {          if (envout > 0) {
                 *ch->connect3 += SLOTOUT(ch->slot[2], envout, feedback3);                  *ch->connect3 += SLOTOUT(ch->slot[2], envout, opngen.feedback3);
         }          }
         /* SLOT 4 */          /* SLOT 4 */
         envout = calcrateenvlope(ch->slot + 3);          envout = calcrateenvlope(ch->slot + 3);
         if (envout > 0) {          if (envout > 0) {
                 *ch->connect4 += SLOTOUT(ch->slot[3], envout, feedback4);                  *ch->connect4 += SLOTOUT(ch->slot[3], envout, opngen.feedback4);
         }          }
 }  }
   
 void SOUNDCALL opngen_getpcm(void *hdl, SINT32 *pcm, UINT count) {  void SOUNDCALL opngen_getpcm(void *hdl, SINT32 *pcm, UINT count) {
   
         OPNCH   *opn;          OPNCH   *fm;
         UINT    i;          UINT    i;
         SINT32  samp_l;          SINT32  samp_l;
         SINT32  samp_r;          SINT32  samp_r;
   
         opn = opnch;          fm = opnch;
         while(count--) {          while(count--) {
                 samp_l = outdl * (calcremain * -1);                  samp_l = opngen.outdl * (opngen.calcremain * -1);
                 samp_r = outdr * (calcremain * -1);                  samp_r = opngen.outdr * (opngen.calcremain * -1);
                 calcremain += FMDIV_ENT;                  opngen.calcremain += FMDIV_ENT;
                 while(1) {                  while(1) {
                         outdc = 0;                          opngen.outdc = 0;
                         outdl = 0;                          opngen.outdl = 0;
                         outdr = 0;                          opngen.outdr = 0;
                         for (i=0; i<playchannels; i++) {                          for (i=0; i<opngen.playchannels; i++) {
                                 calcratechannel(opn + i);                                  calcratechannel(fm + i);
                         }                          }
                         outdl += outdc;                          opngen.outdl += opngen.outdc;
                         outdr += outdc;                          opngen.outdr += opngen.outdc;
                         outdl >>= FMVOL_SFTBIT;                          opngen.outdl >>= FMVOL_SFTBIT;
                         outdr >>= FMVOL_SFTBIT;                          opngen.outdr >>= FMVOL_SFTBIT;
                         if (calcremain > calc1024) {                          if (opngen.calcremain > opncfg.calc1024) {
                                 samp_l += outdl * calc1024;                                  samp_l += opngen.outdl * opncfg.calc1024;
                                 samp_r += outdr * calc1024;                                  samp_r += opngen.outdr * opncfg.calc1024;
                                 calcremain -= calc1024;                                  opngen.calcremain -= opncfg.calc1024;
                         }                          }
                         else {                          else {
                                 break;                                  break;
                         }                          }
                 }                  }
                 samp_l += outdl * calcremain;                  samp_l += opngen.outdl * opngen.calcremain;
                 samp_l >>= 8;                  samp_l >>= 8;
                 samp_l *= fmvolforc;                  samp_l *= opncfg.fmvol;
                 samp_l >>= (OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8);                  samp_l >>= (OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8);
                 pcm[0] += samp_l;                  pcm[0] += samp_l;
                 samp_r += outdr * calcremain;                  samp_r += opngen.outdr * opngen.calcremain;
                 samp_r >>= FMDIV_BITS;                  samp_r >>= FMDIV_BITS;
                 samp_r *= fmvolforc;                  samp_r *= opncfg.fmvol;
                 samp_r >>= (OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8);                  samp_r >>= (OPM_OUTSB + FMDIV_BITS + 1 + 6 - FMVOL_SFTBIT - 8);
                 pcm[1] += samp_r;                  pcm[1] += samp_r;
                 calcremain -= calc1024;                  opngen.calcremain -= opncfg.calc1024;
                 pcm += 2;                  pcm += 2;
         }          }
         (void)hdl;          (void)hdl;

Removed from v.1.1  
changed lines
  Added in v.1.2


RetroPC.NET-CVS <cvs@retropc.net>