--- np2/macosx/soundmng.cpp 2003/11/06 01:58:36 1.4 +++ np2/macosx/soundmng.cpp 2003/11/14 07:37:29 1.7 @@ -10,6 +10,7 @@ #endif #include "soundrecording.h" +#include "np2opening.h" #define SOUNDBUFFERS 2 @@ -19,6 +20,10 @@ typedef struct { UINT rate; UINT samples; UINT buffersize; +#if !defined(SOUND_CRITICAL) + SINT16 *indata; + SINT16 *extendbuffer; +#endif ExtSoundHeader *buf[SOUNDBUFFERS]; SndCommand cmd[SOUNDBUFFERS]; SndCommand cbcmd[SOUNDBUFFERS]; @@ -41,12 +46,20 @@ static pascal void QSoundCallback(SndCha QSOUND qs; int nextbuf; void *dst; +#if defined(SOUND_CRITICAL) const SINT32 *src; +#endif if (QS_Avail) { qs = &QSound; nextbuf = inCommand->param1; dst = qs->buf[nextbuf]->sampleArea; +#if !defined(SOUND_CRITICAL) + if (qs->indata) { + CopyMemory((SINT16 *)dst, qs->indata, qs->buffersize); + qs->indata = NULL; + } +#else src = NULL; if (QSound_Playing) { src = sound_pcmlock(); @@ -58,6 +71,7 @@ const SINT32 *src; } sound_pcmunlock(src); } +#endif else { ZeroMemory(dst, qs->buffersize); } @@ -123,6 +137,14 @@ static BOOL SoundBuffer_Init(UINT rate, qs->buffersize = buffersize; drate = rate; dtox80(&drate, &extFreq); + +#if !defined(SOUND_CRITICAL) + 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 +217,13 @@ UINT soundmng_create(UINT rate, UINT ms) if (SoundChannel_Init()) { goto qsinit_err; } - samples = rate * ms / 1000; +#if !defined(SOUND_CRITICAL) + 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 +244,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 +274,26 @@ void soundmng_setreverse(BOOL reverse) { } } +#if !defined(SOUND_CRITICAL) +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" @@ -253,12 +307,15 @@ static Movie setupWAV(const char* name) short resID = 0; Movie wav = NULL; - char path[MAX_PATH]; - Str255 fname; + if (!getResourceFile(name, &fs)) { + char path[MAX_PATH]; + Str255 fname; + + file_cpyname(path, file_getcd(name), MAX_PATH); + mkstr255(fname, path); + FSMakeFSSpec(0, 0, fname, &fs); + } - file_cpyname(path, file_getcd(name), MAX_PATH); - mkstr255(fname, path); - FSMakeFSSpec(0, 0, fname, &fs); if (OpenMovieFile( &fs, &movieRefNum, fsRdPerm ) == noErr) { if (NewMovieFromFile(&wav,movieRefNum, &resID, NULL, newMovieActive, NULL) != noErr) { return NULL; @@ -277,8 +334,8 @@ void soundmng_deinitialize(void) { BOOL soundmng_initialize(void) { EnterMovies(); - seekWAV[0] = setupWAV("Fddseek.wav"); - seekWAV[1] = setupWAV("Fddseek1.wav"); + seekWAV[0] = setupWAV("fddseek.wav"); + seekWAV[1] = setupWAV("fddseek1.wav"); if (seekWAV[0] == NULL || seekWAV[1] == NULL) { return false; }