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