/* ================== S_ClearSoundBuffer If we are about to perform file access, clear the buffer so sound doesn't stutter. ================== */ void S_ClearSoundBuffer( void ) { int clear; if (!s_soundStarted) return; // stop looping sounds Com_Memset(loopSounds, 0, MAX_GENTITIES*sizeof(loopSound_t)); Com_Memset(loop_channels, 0, MAX_CHANNELS*sizeof(channel_t)); numLoopChannels = 0; S_ChannelSetup(); s_rawend = 0; if (dma.samplebits == 8) clear = 0x80; else clear = 0; SNDDMA_BeginPainting (); if (dma.buffer) // TTimo: due to a particular bug workaround in linux sound code, // have to optionally use a custom C implementation of Com_Memset // not affecting win32, we have #define Snd_Memset Com_Memset // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=371 Snd_Memset(dma.buffer, clear, dma.samples * dma.samplebits/8); SNDDMA_Submit (); }
/* ================== S_ClearSoundBuffer If we are about to perform file access, clear the buffer so sound doesn't stutter. ================== */ void S_Base_ClearSoundBuffer( void ) { int clear; if (!s_soundStarted) return; // stop looping sounds Com_Memset(loopSounds, 0, MAX_GENTITIES*sizeof(loopSound_t)); Com_Memset(loop_channels, 0, MAX_CHANNELS*sizeof(channel_t)); numLoopChannels = 0; S_ChannelSetup(); Com_Memset(s_rawend, '\0', sizeof (s_rawend)); if (dma.samplebits == 8) clear = 0x80; else clear = 0; SNDDMA_BeginPainting (); if (dma.buffer) Com_Memset(dma.buffer, clear, dma.samples * dma.samplebits/8); SNDDMA_Submit (); }
void S_Base_ClearSounds(qboolean clearStreaming, qboolean clearMusic) { if (!s_soundStarted) { return; } // stop looping sounds Com_Memset(loopSounds, 0, MAX_LOOP_SOUNDS * sizeof(loopSound_t)); Com_Memset(loop_channels, 0, MAX_CHANNELS * sizeof(channel_t)); numLoopChannels = 0; numLoopSounds = 0; // moved this up so streaming sounds dont get updated with the music, below, // and leave us with a snippet off streaming sounds after we reload if (clearStreaming) { int i; streamingSound_t *ss; channel_t *ch; for (i = 0, ss = streamingSounds; i < MAX_STREAMING_SOUNDS; i++, ss++) { if (i > 0 || clearMusic) { S_StopStreamingSound(i); } } // we should also kill all channels, since we are killing streaming sounds anyway // (fixes siren in forest playing after a map_restart/loadgame ch = s_channels; for (i = 0; i < MAX_CHANNELS; i++, ch++) { if (ch->thesfx) { S_ChannelFree(ch); } } } if (!clearMusic) { S_UpdateStreamingSounds(); } if (clearStreaming && clearMusic) { int clear; if (dma.samplebits == 8) { clear = 0x80; } else { clear = 0; } SNDDMA_BeginPainting(); if (dma.buffer) { Com_Memset(dma.buffer, clear, dma.samples * dma.samplebits / 8); } SNDDMA_Submit(); // clear out channels so they don't finish playing when audio restarts S_ChannelSetup(); } }