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

version 1.1, 2004/01/08 16:29:56 version 1.2, 2004/01/09 04:36:02
Line 2 Line 2
   
 #if defined(SUPPORT_WAVEMIX)  #if defined(SUPPORT_WAVEMIX)
   
   #include        "pccore.h"
 #include        "sound.h"  #include        "sound.h"
 #include        "getsnd.h"  #include        "getsnd.h"
 #include        "wavemix.res"  #include        "wavemix.res"
Line 11  const SINT16 *pcm; Line 12  const SINT16 *pcm;
         UINT            remain;          UINT            remain;
         SINT16          *sample;          SINT16          *sample;
         UINT            samples;          UINT            samples;
         BOOL            loop;          UINT            flag;
 } _WMCH, *WMCH;          SINT32          volume;
   } _WMTRK, *WMTRK;
   
 typedef struct {  typedef struct {
         UINT32  playing;          UINT32  playing;
         int             vol;          _WMTRK  trk[WAVEMIX_MAXTRACK];
         _WMCH   ch[WAVEMIX_CHANNELS];  
 } _WAVEMIX, *WAVEMIX;  } _WAVEMIX, *WAVEMIX;
   
 static  _WAVEMIX        wavemix;  static  _WAVEMIX        wavemix;
Line 76  gpd_err1: Line 77  gpd_err1:
   
 static void SOUNDCALL wavemix_getpcm(WAVEMIX hdl, SINT32 *pcm, UINT count) {  static void SOUNDCALL wavemix_getpcm(WAVEMIX hdl, SINT32 *pcm, UINT count) {
   
         UINT            i;          UINT32          bitmap;
         WMCH            c;          WMTRK           t;
 const SINT16    *s;  const SINT16    *s;
         UINT            srem;          UINT            srem;
         SINT32          *d;          SINT32          *d;
         UINT            drem;          UINT            drem;
         UINT            r;          UINT            r;
         UINT            j;          UINT            j;
           UINT            flag;
           SINT32          vol;
           SINT32          samp;
   
         if ((hdl->playing == 0) || (count == 0))  {          if ((hdl->playing == 0) || (count == 0))  {
                 return;                  return;
         }          }
         c = hdl->ch;          t = hdl->trk;
         for (i=0; i<WAVEMIX_CHANNELS; i++, c++) {          bitmap = 1;
                 if (hdl->playing & (1 << i)) {          do {
                         s = c->pcm;                  if (hdl->playing & bitmap) {
                         srem = c->remain;                          s = t->pcm;
                           srem = t->remain;
                         d = pcm;                          d = pcm;
                         drem = count;                          drem = count;
                           flag = t->flag;
                           vol = t->volume;
                         do {                          do {
                                 r = min(srem, drem);                                  r = min(srem, drem);
                                 for (j=0; j<r; j++) {                                  switch(flag & (WMFLAG_L | WMFLAG_R)) {
                                         d[j*2+0] += s[j];                                          case WMFLAG_L:
                                         d[j*2+1] += s[j];                                                  for (j=0; j<r; j++) {
                                                           d[j*2+0] += (s[j] * vol) >> 12;
                                                   }
                                                   break;
   
                                           case WMFLAG_R:
                                                   for (j=0; j<r; j++) {
                                                           d[j*2+1] += (s[j] * vol) >> 12;
                                                   }
                                                   break;
   
                                           case WMFLAG_L | WMFLAG_R:
                                                   for (j=0; j<r; j++) {
                                                           samp = (s[j] * vol) >> 12;
                                                           d[j*2+0] += samp;
                                                           d[j*2+1] += samp;
                                                   }
                                                   break;
                                 }                                  }
                                 s += r;                                  s += r;
                                 d += r*2;                                  d += r*2;
                                 srem -= r;                                  srem -= r;
                                 if (srem == 0) {                                  if (srem == 0) {
                                         if (c->loop) {                                          if (flag & WMFLAG_LOOP) {
                                                 s = c->sample;                                                  s = t->sample;
                                                 srem = c->samples;                                                  srem = t->samples;
                                         }                                          }
                                         else {                                          else {
                                                 hdl->playing &= ~(1 << i);                                                  hdl->playing &= ~bitmap;
                                                 break;                                                  break;
                                         }                                          }
                                 }                                  }
                                 drem -= r;                                  drem -= r;
                         } while(drem);                          } while(drem);
                         c->pcm = s;                          t->pcm = s;
                         c->remain = srem;                          t->remain = srem;
                 }                  }
         }                  t++;
                   bitmap <<= 1;
           } while(bitmap < (1 << WAVEMIX_MAXTRACK));
 }  }
   
   
Line 134  void wavemix_initialize(UINT rate) { Line 160  void wavemix_initialize(UINT rate) {
   
         sample = getpcmdata((void *)fddseek, sizeof(fddseek), rate, &samples);          sample = getpcmdata((void *)fddseek, sizeof(fddseek), rate, &samples);
         if (sample) {          if (sample) {
                 wavemix.ch[0].sample = sample;                  wavemix.trk[0].sample = sample;
                 wavemix.ch[0].samples = samples;                  wavemix.trk[0].samples = samples;
                   wavemix.trk[0].flag = WMFLAG_L | WMFLAG_R;
                   wavemix.trk[0].volume = (np2cfg.MOTORVOL << 12) / 100;
         }          }
         sample = getpcmdata((void *)fddseek1, sizeof(fddseek1), rate, &samples);          sample = getpcmdata((void *)fddseek1, sizeof(fddseek1), rate, &samples);
         if (sample) {          if (sample) {
                 wavemix.ch[1].sample = sample;                  wavemix.trk[1].sample = sample;
                 wavemix.ch[1].samples = samples;                  wavemix.trk[1].samples = samples;
                   wavemix.trk[1].flag = WMFLAG_L | WMFLAG_R;
                   wavemix.trk[1].volume = (np2cfg.MOTORVOL << 12) / 100;
         }          }
 }  }
   
 void wavemix_deinitialize(void) {  void wavemix_deinitialize(void) {
   
         WMCH    c;          WMTRK   t;
         WMCH    cterm;          WMTRK   tterm;
   
         c = wavemix.ch;          t = wavemix.trk;
         cterm = c + WAVEMIX_CHANNELS;          tterm = t + WAVEMIX_MAXTRACK;
         while(c < cterm) {          while(t < tterm) {
                 if (c->sample) {                  if (t->sample) {
                         _MFREE(c->sample);                          _MFREE(t->sample);
                 }                  }
                 c++;                  t++;
         }          }
         ZeroMemory(&wavemix, sizeof(wavemix));          ZeroMemory(&wavemix, sizeof(wavemix));
 }  }
   
 void wavemix_play(UINT num, BOOL loop) {  void wavemix_play(UINT num, BOOL loop) {
   
         WMCH    c;          WMTRK   t;
   
         if (num < WAVEMIX_CHANNELS) {          if (num < WAVEMIX_MAXTRACK) {
                 c = wavemix.ch + num;                  t = wavemix.trk + num;
                 if ((c->sample) && (c->samples)) {                  if ((t->sample) && (t->samples)) {
                         sound_sync();                          sound_sync();
                         c->pcm = c->sample;                          t->pcm = t->sample;
                         c->remain = c->samples;                          t->remain = t->samples;
                         c->loop = loop;                          if (loop) {
                                   t->flag |= WMFLAG_LOOP;
                           }
                           else {
                                   t->flag &= ~WMFLAG_LOOP;
                           }
                         wavemix.playing |= (1 << num);                          wavemix.playing |= (1 << num);
                 }                  }
         }          }
Line 178  void wavemix_play(UINT num, BOOL loop) { Line 213  void wavemix_play(UINT num, BOOL loop) {
   
 void wavemix_stop(UINT num) {  void wavemix_stop(UINT num) {
   
         if (num < WAVEMIX_CHANNELS) {          if (num < WAVEMIX_MAXTRACK) {
                 sound_sync();                  sound_sync();
                 wavemix.playing &= ~(1 << num);                  wavemix.playing &= ~(1 << num);
         }          }

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


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