From: havoc Date: Thu, 25 Jul 2002 02:43:33 +0000 (+0000) Subject: added S_RawSamples_Enqueue, S_RawSamples_Dequeue, and S_RawSamples_ClearQueue functio... X-Git-Tag: RELEASE_0_2_0_RC1~428 X-Git-Url: https://git.xonotic.org/?a=commitdiff_plain;ds=sidebyside;h=edfcde7fdd922dfdd65d5eaa93e1ec9cca33bab0;p=xonotic%2Fdarkplaces.git added S_RawSamples_Enqueue, S_RawSamples_Dequeue, and S_RawSamples_ClearQueue functions to allow background music/video support, these are now used to clear the paintbuffer git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@2080 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/snd_dma.c b/snd_dma.c index 37881b50..836227e0 100644 --- a/snd_dma.c +++ b/snd_dma.c @@ -8,7 +8,7 @@ of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -27,6 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. void S_Play(void); void S_PlayVol(void); +void S_Play2(void); void S_SoundList(void); void S_Update_(); void S_StopAllSounds(qboolean clear); @@ -36,33 +37,35 @@ void S_StopAllSoundsC(void); // Internal sound data & structures // ======================================================================= -channel_t channels[MAX_CHANNELS]; -int total_channels; +channel_t channels[MAX_CHANNELS]; +int total_channels; -int snd_blocked = 0; -static qboolean snd_ambient = 1; -qboolean snd_initialized = false; +int snd_blocked = 0; +static qboolean snd_ambient = 1; +qboolean snd_initialized = false; // pointer should go away -volatile dma_t *shm = 0; +volatile dma_t *shm = 0; volatile dma_t sn; -vec3_t listener_origin; -vec3_t listener_forward; -vec3_t listener_right; -vec3_t listener_up; -vec_t sound_nominal_clip_dist=1000.0; +vec3_t listener_origin; +vec3_t listener_forward; +vec3_t listener_right; +vec3_t listener_up; +vec_t sound_nominal_clip_dist=1000.0; +mempool_t *snd_mempool; -int soundtime; // sample PAIRS -int paintedtime; // sample PAIRS +// sample PAIRS +int soundtime; +int paintedtime; //LordHavoc: increased the client sound limit from 512 to 4096 for the Nehahra movie -#define MAX_SFX 4096 -sfx_t *known_sfx; // hunk allocated [MAX_SFX] -int num_sfx; +#define MAX_SFX 4096 +sfx_t *known_sfx; // allocated [MAX_SFX] +int num_sfx; -sfx_t *ambient_sfx[NUM_AMBIENTS]; +sfx_t *ambient_sfx[NUM_AMBIENTS]; int sound_started = 0; @@ -114,14 +117,14 @@ void S_SoundInfo_f(void) Con_Printf ("sound system not started\n"); return; } - - Con_Printf("%5d stereo\n", shm->channels - 1); - Con_Printf("%5d samples\n", shm->samples); - Con_Printf("%5d samplepos\n", shm->samplepos); - Con_Printf("%5d samplebits\n", shm->samplebits); - Con_Printf("%5d submission_chunk\n", shm->submission_chunk); - Con_Printf("%5d speed\n", shm->speed); - Con_Printf("0x%x dma buffer\n", shm->buffer); + + Con_Printf("%5d stereo\n", shm->channels - 1); + Con_Printf("%5d samples\n", shm->samples); + Con_Printf("%5d samplepos\n", shm->samplepos); + Con_Printf("%5d samplebits\n", shm->samplebits); + Con_Printf("%5d submission_chunk\n", shm->submission_chunk); + Con_Printf("%5d speed\n", shm->speed); + Con_Printf("0x%x dma buffer\n", shm->buffer); Con_Printf("%5d total_channels\n", total_channels); } @@ -131,10 +134,9 @@ void S_SoundInfo_f(void) S_Startup ================ */ - void S_Startup (void) { - int rc; + int rc; if (!snd_initialized) return; @@ -154,11 +156,6 @@ void S_Startup (void) sound_started = 1; } - -void S_Play2(void); - -mempool_t *snd_mempool; - /* ================ S_Init @@ -168,6 +165,8 @@ void S_Init (void) { Con_Printf("\nSound Initialization\n"); + S_RawSamples_ClearQueue(); + Cvar_RegisterVariable(&volume); Cvar_RegisterVariable(&bgmvolume); @@ -1031,3 +1030,71 @@ void S_EndPrecaching (void) { } + +#define RAWSAMPLESBUFFER 32768 +short s_rawsamplesbuffer[RAWSAMPLESBUFFER * 2]; +int s_rawsamplesbuffer_start; +int s_rawsamplesbuffer_count; + +void S_RawSamples_Enqueue(short *samples, unsigned int length) +{ + int b2, b3; + //Con_Printf("S_RawSamples_Enqueue: %i samples\n", length); + if (s_rawsamplesbuffer_count + length > RAWSAMPLESBUFFER) + return; + b2 = (s_rawsamplesbuffer_start + s_rawsamplesbuffer_count) % RAWSAMPLESBUFFER; + b3 = (s_rawsamplesbuffer_start + s_rawsamplesbuffer_count + length) % RAWSAMPLESBUFFER; + if (b3 < b2) + { + memcpy(s_rawsamplesbuffer + b2 * 2, samples, (RAWSAMPLESBUFFER - b2) * sizeof(short[2])); + memcpy(s_rawsamplesbuffer, samples + (RAWSAMPLESBUFFER - b2) * 2, b3 * sizeof(short[2])); + } + else + memcpy(s_rawsamplesbuffer + b2 * 2, samples, length * sizeof(short[2])); + s_rawsamplesbuffer_count += length; +} + +void S_RawSamples_Dequeue(int *samples, unsigned int length) +{ + int b1, b2, l; + int i; + short *in; + int *out; + int count; + l = length; + if (l > s_rawsamplesbuffer_count) + l = s_rawsamplesbuffer_count; + b1 = (s_rawsamplesbuffer_start) % RAWSAMPLESBUFFER; + b2 = (s_rawsamplesbuffer_start + l) % RAWSAMPLESBUFFER; + if (b2 < b1) + { + //memcpy(samples, s_rawsamplesbuffer + b1 * 2, (RAWSAMPLESBUFFER - b1) * sizeof(short[2])); + //memcpy(samples + (RAWSAMPLESBUFFER - b1) * 2, s_rawsamplesbuffer, b2 * sizeof(short[2])); + for (out = samples, in = s_rawsamplesbuffer + b1 * 2, count = (RAWSAMPLESBUFFER - b1) * 2, i = 0;i < count;i++) + out[i] = in[i]; + for (out = samples + (RAWSAMPLESBUFFER - b1) * 2, in = s_rawsamplesbuffer, count = b2 * 2, i = 0;i < count;i++) + out[i] = in[i]; + //Con_Printf("S_RawSamples_Dequeue: buffer wrap %i %i\n", (RAWSAMPLESBUFFER - b1), b2); + } + else + { + //memcpy(samples, s_rawsamplesbuffer + b1 * 2, l * sizeof(short[2])); + for (out = samples, in = s_rawsamplesbuffer + b1 * 2, count = l * 2, i = 0;i < count;i++) + out[i] = in[i]; + //Con_Printf("S_RawSamples_Dequeue: normal %i\n", l); + } + if (l < length) + { + memset(samples + l * 2, 0, (length - l) * sizeof(int[2])); + //Con_Printf("S_RawSamples_Dequeue: padding with %i\n", length - l); + } + s_rawsamplesbuffer_start = (s_rawsamplesbuffer_start + l) % RAWSAMPLESBUFFER; + s_rawsamplesbuffer_count -= l; +} + +void S_RawSamples_ClearQueue(void) +{ + s_rawsamplesbuffer_count = 0; + s_rawsamplesbuffer_start = 0; +} + diff --git a/snd_mix.c b/snd_mix.c index d4dadbae..96f20236 100644 --- a/snd_mix.c +++ b/snd_mix.c @@ -267,11 +267,11 @@ void SND_PaintChannelFrom16 (channel_t *ch, sfxcache_t *sc, int endtime); void S_PaintChannels(int endtime) { - int i; - int end; + int i; + int end; channel_t *ch; - sfxcache_t *sc; - int ltime, count; + sfxcache_t *sc; + int ltime, count; while (paintedtime < endtime) { @@ -280,8 +280,8 @@ void S_PaintChannels(int endtime) if (endtime - paintedtime > PAINTBUFFER_SIZE) end = paintedtime + PAINTBUFFER_SIZE; - // clear the paint buffer - memset(paintbuffer, 0, (end - paintedtime) * sizeof(portable_samplepair_t)); + // clear the paint buffer, filling it with data from rawsamples (music/video/whatever) + S_RawSamples_Dequeue(&paintbuffer->left, end - paintedtime); // paint in the channels. ch = channels; @@ -331,7 +331,6 @@ void S_PaintChannels(int endtime) } } } - } // transfer out according to DMA format diff --git a/sound.h b/sound.h index f50b5800..5ab1c4d8 100644 --- a/sound.h +++ b/sound.h @@ -180,5 +180,12 @@ void S_AmbientOn (void); void *S_LockBuffer(void); void S_UnlockBuffer(void); +// add some data to the tail of the rawsamples queue +void S_RawSamples_Enqueue(short *samples, unsigned int length); +// read and remove some data from the head of the rawsamples queue +void S_RawSamples_Dequeue(int *samples, unsigned int length); +// empty the rawsamples queue +void S_RawSamples_ClearQueue(void); + #endif