|
|
| 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); |
| } | } |