--- np2/macosx/soundmng.cpp 2003/11/06 01:58:36 1.4 +++ np2/macosx/soundmng.cpp 2003/11/06 03:22:41 1.5 @@ -19,6 +19,10 @@ typedef struct { UINT rate; UINT samples; UINT buffersize; +#if defined(SOUNDMNG_USEBUFFERING) + SINT16 *indata; + SINT16 *extendbuffer; +#endif ExtSoundHeader *buf[SOUNDBUFFERS]; SndCommand cmd[SOUNDBUFFERS]; SndCommand cbcmd[SOUNDBUFFERS]; @@ -41,12 +45,20 @@ static pascal void QSoundCallback(SndCha QSOUND qs; int nextbuf; void *dst; +#if !defined(SOUNDMNG_USEBUFFERING) const SINT32 *src; +#endif if (QS_Avail) { qs = &QSound; nextbuf = inCommand->param1; dst = qs->buf[nextbuf]->sampleArea; +#if defined(SOUNDMNG_USEBUFFERING) + if (qs->indata) { + CopyMemory((SINT16 *)dst, qs->indata, qs->buffersize); + qs->indata = NULL; + } +#else src = NULL; if (QSound_Playing) { src = sound_pcmlock(); @@ -58,6 +70,7 @@ const SINT32 *src; } sound_pcmunlock(src); } +#endif else { ZeroMemory(dst, qs->buffersize); } @@ -123,6 +136,14 @@ static BOOL SoundBuffer_Init(UINT rate, qs->buffersize = buffersize; drate = rate; dtox80(&drate, &extFreq); + +#if defined(SOUNDMNG_USEBUFFERING) + qs->extendbuffer = (SINT16 *)_MALLOC(buffersize, "Extend buffer"); + if (qs->extendbuffer == NULL) { + goto sbinit_err; + } +#endif + buffersize += sizeof(ExtSoundHeader); for (i=0; iindata = NULL; + if (qs->extendbuffer) { + _MFREE(qs->extendbuffer); + qs->extendbuffer = NULL; + } +#endif } UINT soundmng_create(UINT rate, UINT ms) { @@ -188,8 +216,13 @@ UINT soundmng_create(UINT rate, UINT ms) if (SoundChannel_Init()) { goto qsinit_err; } - samples = rate * ms / 1000; +#if defined(SOUNDMNG_USEBUFFERING) + samples = rate * ms / (SOUNDBUFFERS * 1000); samples = (samples + 3) & (~3); +#else + samples = rate * ms / 1000; + samples = (samples + 255) & (~255); +#endif if (SoundBuffer_Init(rate, samples)) { goto qsinit_err; } @@ -210,13 +243,13 @@ qsinit_err: void soundmng_destroy(void) { if (QS_Avail) { + QS_Avail = FALSE; + SoundBuffer_Term(); + SoundChannel_Term(); #if defined(VERMOUTH_LIB) midimod_destroy(vermouth_module); vermouth_module = NULL; #endif - QS_Avail = FALSE; - SoundBuffer_Term(); - SoundChannel_Term(); } } @@ -240,6 +273,26 @@ void soundmng_setreverse(BOOL reverse) { } } +#if defined(SOUNDMNG_USEBUFFERING) +void soundmng_sync(void) { + + QSOUND qs; +const SINT32 *src; + + qs = &QSound; + + if ((QSound_Playing) && (qs->indata == NULL)) { + src = sound_pcmlock(); + if (src) { + (*fnmix)(qs->extendbuffer, src, qs->buffersize); + recOPM((BYTE *)qs->extendbuffer, qs->buffersize); + sound_pcmunlock(src); + qs->indata = qs->extendbuffer; + } + } +} +#endif + // -------------------------------------------------------------------------- #include #include "np2.h"