--- np2/sound/sound.c 2004/02/18 18:29:29 1.13 +++ np2/sound/sound.c 2004/03/24 06:07:57 1.15 @@ -1,4 +1,5 @@ #include "compiler.h" +#include "wavefile.h" #include "dosio.h" #include "soundmng.h" #include "cpucore.h" @@ -26,6 +27,9 @@ typedef struct { UINT samples; UINT reserve; UINT remain; +#if defined(SUPPORT_WAVEREC) + WAVEWR rec; +#endif CBTBL *cbreg; CBTBL cb[STREAM_CBMAX]; } SNDSTREAM; @@ -61,6 +65,70 @@ static void streamprepare(UINT samples) } +#if defined(SUPPORT_WAVEREC) +// ---- wave rec + +BOOL sound_recstart(const char *filename) { + + WAVEWR rec; + + sound_recstop(); + if (sndstream.buffer == NULL) { + return(FAILURE); + } + rec = wavewr_open(filename, soundcfg.rate, 16, 2); + sndstream.rec = rec; + if (rec) { + return(SUCCESS); + } + return(FAILURE); +} + +void sound_recstop(void) { + + WAVEWR rec; + + rec = sndstream.rec; + sndstream.rec = NULL; + wavewr_close(rec); +} + +static void streamfilewrite(UINT samples) { + + CBTBL *cb; + UINT count; + SINT32 buf32[2*512]; + BYTE buf[2*2*512]; + UINT i; + SINT32 samp; + + while(samples) { + count = min(samples, 512); + ZeroMemory(buf32, count * 2 * sizeof(SINT32)); + cb = sndstream.cb; + while(cb < sndstream.cbreg) { + cb->cbfn(cb->hdl, buf32, count); + cb++; + } + for (i=0; i 32767) { + samp = 32767; + } + else if (samp < -32768) { + samp = -32768; + } + // little endianなので satuation_s16は使えない + buf[i*2+0] = (BYTE)samp; + buf[i*2+1] = (BYTE)(samp >> 8); + } + wavewr_write(sndstream.rec, buf, count * 4); + samples -= count; + } +} +#endif + + // ---- BOOL sound_create(UINT rate, UINT ms) { @@ -114,6 +182,9 @@ scre_err1: void sound_destroy(void) { if (sndstream.buffer) { +#if defined(SUPPORT_WAVEREC) + sound_recstop(); +#endif soundmng_stop(); streamreset(); soundmng_destroy(); @@ -190,6 +261,14 @@ void sound_sync(void) { if (length == 0) { return; } +#if defined(SUPPORT_WAVEREC) + if (sndstream.rec) { + streamfilewrite(length); + soundcfg.lastclock += length * soundcfg.clockbase / soundcfg.hzbase; + beep_eventreset(); + return; + } +#endif SNDCSEC_ENTER; streamprepare(length); soundcfg.lastclock += length * soundcfg.clockbase / soundcfg.hzbase; @@ -209,6 +288,11 @@ const SINT32 *sound_pcmlock(void) { const SINT32 *ret; +#if defined(SUPPORT_WAVEREC) + if (sndstream.rec) { + return(NULL); + } +#endif if (locks) { TRACEOUT(("sound pcm lock: already locked")); return(NULL); @@ -249,9 +333,9 @@ void sound_pcmunlock(const SINT32 *hdl) } -// ---- +// ---- pcmmix -BOOL pcmmix_regist(PMIXTRK *trk, void *datptr, UINT datsize, UINT rate) { +BOOL pcmmix_regist(PMIXDAT *dat, void *datptr, UINT datsize, UINT rate) { GETSND gs; BYTE tmp[256]; @@ -289,8 +373,8 @@ BOOL pcmmix_regist(PMIXTRK *trk, void *d } r = getsnd_getpcmbyleng(gs, buf, size); getsnd_destroy(gs); - trk->sample = buf; - trk->samples = r / 2; + dat->sample = buf; + dat->samples = r / 2; return(SUCCESS); pmr_err2: @@ -300,7 +384,7 @@ pmr_err1: return(FAILURE); } -BOOL pcmmix_regfile(PMIXTRK *trk, const char *fname, UINT rate) { +BOOL pcmmix_regfile(PMIXDAT *dat, const char *fname, UINT rate) { FILEH fh; UINT size; @@ -322,7 +406,7 @@ BOOL pcmmix_regfile(PMIXTRK *trk, const } file_read(fh, ptr, size); file_close(fh); - r = pcmmix_regist(trk, ptr, size, rate); + r = pcmmix_regist(dat, ptr, size, rate); _MFREE(ptr); return(r); @@ -388,8 +472,8 @@ const SINT16 *s; srem -= r; if (srem == 0) { if (flag & PMIXFLAG_LOOP) { - s = t->sample; - srem = t->samples; + s = t->data.sample; + srem = t->data.samples; } else { hdl->hdr.playing &= ~bitmap;