Diff for /np2/sound/sound.c between versions 1.10 and 1.13

version 1.10, 2003/12/08 00:55:33 version 1.13, 2004/02/18 18:29:29
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
   #include        "dosio.h"
 #include        "soundmng.h"  #include        "soundmng.h"
 #include        "cpucore.h"  #include        "cpucore.h"
 #include        "pccore.h"  #include        "pccore.h"
Line 6 Line 7
 #include        "sound.h"  #include        "sound.h"
 #include        "sndcsec.h"  #include        "sndcsec.h"
 #include        "beep.h"  #include        "beep.h"
   #include        "getsnd.h"
   
   
         SOUNDCFG        soundcfg;          SOUNDCFG        soundcfg;
Line 142  void sound_changeclock(void) { Line 144  void sound_changeclock(void) {
         }          }
   
         // とりあえず 25で割り切れる。          // とりあえず 25で割り切れる。
         clock = pc.realclock / 25;          clock = pccore.realclock / 25;
         hz = soundcfg.rate / 25;          hz = soundcfg.rate / 25;
   
         // で、クロック数に合せて調整。(64bit演算しろよな的)          // で、クロック数に合せて調整。(64bit演算しろよな的)
Line 246  void sound_pcmunlock(const SINT32 *hdl)  Line 248  void sound_pcmunlock(const SINT32 *hdl) 
         }          }
 }  }
   
   
   // ----
   
   BOOL pcmmix_regist(PMIXTRK *trk, void *datptr, UINT datsize, UINT rate) {
   
           GETSND  gs;
           BYTE    tmp[256];
           UINT    size;
           UINT    r;
           SINT16  *buf;
   
           gs = getsnd_create(datptr, datsize);
           if (gs == NULL) {
                   goto pmr_err1;
           }
           if (getsnd_setmixproc(gs, rate, 1) != SUCCESS) {
                   goto pmr_err2;
           }
           size = 0;
           do {
                   r = getsnd_getpcmbyleng(gs, tmp, sizeof(tmp));
                   size += r;
           } while(r);
           getsnd_destroy(gs);
           if (size == 0) {
                   goto pmr_err1;
           }
   
           buf = (SINT16 *)_MALLOC(size, "PCM DATA");
           if (buf == NULL) {
                   goto pmr_err1;
           }
           gs = getsnd_create(datptr, datsize);
           if (gs == NULL) {
                   goto pmr_err1;
           }
           if (getsnd_setmixproc(gs, rate, 1) != SUCCESS) {
                   goto pmr_err2;
           }
           r = getsnd_getpcmbyleng(gs, buf, size);
           getsnd_destroy(gs);
           trk->sample = buf;
           trk->samples = r / 2;
           return(SUCCESS);
   
   pmr_err2:
           getsnd_destroy(gs);
   
   pmr_err1:
           return(FAILURE);
   }
   
   BOOL pcmmix_regfile(PMIXTRK *trk, const char *fname, UINT rate) {
   
           FILEH   fh;
           UINT    size;
           BYTE    *ptr;
           BOOL    r;
   
           r = FAILURE;
           fh = file_open_rb(fname);
           if (fh == FILEH_INVALID) {
                   goto pmrf_err1;
           }
           size = file_getsize(fh);
           if (size == 0) {
                   goto pmrf_err2;
           }
           ptr = (BYTE *)_MALLOC(size, fname);
           if (ptr == NULL) {
                   goto pmrf_err2;
           }
           file_read(fh, ptr, size);
           file_close(fh);
           r = pcmmix_regist(trk, ptr, size, rate);
           _MFREE(ptr);
           return(r);
   
   pmrf_err2:
           file_close(fh);
   
   pmrf_err1:
           return(FAILURE);
   }
   
   void SOUNDCALL pcmmix_getpcm(PCMMIX hdl, SINT32 *pcm, UINT count) {
   
           UINT32          bitmap;
           PMIXTRK         *t;
   const SINT16    *s;
           UINT            srem;
           SINT32          *d;
           UINT            drem;
           UINT            r;
           UINT            j;
           UINT            flag;
           SINT32          vol;
           SINT32          samp;
   
           if ((hdl->hdr.playing == 0) || (count == 0))  {
                   return;
           }
           t = hdl->trk;
           bitmap = 1;
           do {
                   if (hdl->hdr.playing & bitmap) {
                           s = t->pcm;
                           srem = t->remain;
                           d = pcm;
                           drem = count;
                           flag = t->flag;
                           vol = t->volume;
                           do {
                                   r = min(srem, drem);
                                   switch(flag & (PMIXFLAG_L | PMIXFLAG_R)) {
                                           case PMIXFLAG_L:
                                                   for (j=0; j<r; j++) {
                                                           d[j*2+0] += (s[j] * vol) >> 12;
                                                   }
                                                   break;
   
                                           case PMIXFLAG_R:
                                                   for (j=0; j<r; j++) {
                                                           d[j*2+1] += (s[j] * vol) >> 12;
                                                   }
                                                   break;
   
                                           case PMIXFLAG_L | PMIXFLAG_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;
                                   d += r*2;
                                   srem -= r;
                                   if (srem == 0) {
                                           if (flag & PMIXFLAG_LOOP) {
                                                   s = t->sample;
                                                   srem = t->samples;
                                           }
                                           else {
                                                   hdl->hdr.playing &= ~bitmap;
                                                   break;
                                           }
                                   }
                                   drem -= r;
                           } while(drem);
                           t->pcm = s;
                           t->remain = srem;
                   }
                   t++;
                   bitmap <<= 1;
           } while(bitmap < hdl->hdr.enable);
   }
   

Removed from v.1.10  
changed lines
  Added in v.1.13


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