static void streamwrite(DWORD pos) { const SINT32 *pcm; HRESULT hr; LPBYTE blockptr1; LPBYTE blockptr2; DWORD blocksize1; DWORD blocksize2; pcm = sound_pcmlock(); if ((hr = pDSData3->Lock(pos, dsstreambytes, (LPVOID *)&blockptr1, &blocksize1, (LPVOID *)&blockptr2, &blocksize2, 0)) == DSERR_BUFFERLOST) { pDSData3->Restore(); hr = pDSData3->Lock(pos, dsstreambytes, (LPVOID *)&blockptr1, &blocksize1, (LPVOID *)&blockptr2, &blocksize2, 0); } if (SUCCEEDED(hr)) { if (pcm) { (*fnmix)((SINT16 *)blockptr1, pcm, blocksize1); } else { ZeroMemory(blockptr1, blocksize1); } pDSData3->Unlock(blockptr1, blocksize1, blockptr2, blocksize2); } sound_pcmunlock(pcm); }
void soundmng_sync(void) { QSOUND qs; const SINT32 *src; qs = &QSound; if ((QSound_Playing) && (qs->indata == NULL)) { src = sound_pcmlock(); if (src) { satuation_s16(qs->extendbuffer, src, qs->buffersize); sound_pcmunlock(src); qs->indata = qs->extendbuffer; } } }
static void sound_play_cb(void *userdata, BYTE *stream, int len) { int length; SINT16 *dst; const SINT32 *src; length = min(len, (int)(soundmng.samples * 2 * sizeof(SINT16))); dst = soundmng.buf[soundmng.nsndbuf]; src = sound_pcmlock(); if (src) { satuation_s16(dst, src, length); sound_pcmunlock(src); } else { ZeroMemory(dst, length); } SDL_MixAudio(stream, (BYTE *)dst, length, SDL_MIX_MAXVOLUME); soundmng.nsndbuf = (soundmng.nsndbuf + 1) % NSNDBUF; (void)userdata; }
static pascal void QSoundCallback(SndChannelPtr inCh, SndCommand *inCmd) { QSOUND qs; int nextbuf; void *dst; #if defined(SOUND_CRITICAL) const SINT32 *src; #endif if (QS_Avail) { qs = &QSound; nextbuf = inCmd->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(); } if (src) { satuation_s16((SINT16 *)dst, src, qs->buffersize); sound_pcmunlock(src); } #endif else { ZeroMemory(dst, qs->buffersize); } SndDoCommand(qs->hdl, &qs->cmd[nextbuf], TRUE); SndDoCommand(qs->hdl, &qs->cbcmd[nextbuf], TRUE); } (void)inCh; }