X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=snd_dma.c;h=37881b507a6c7c6602479890d64a4f04b85be8c7;hb=cca6f0cbe16bbb8d62d264bed54da2e6e6a7ed75;hp=d8001f4f39e6cddfc44f3760a9f1f54f82a7c874;hpb=d7035ef4229a2462ad59a67160494593fbd8f2e0;p=xonotic%2Fdarkplaces.git diff --git a/snd_dma.c b/snd_dma.c index d8001f4f..37881b50 100644 --- a/snd_dma.c +++ b/snd_dma.c @@ -64,21 +64,20 @@ int num_sfx; sfx_t *ambient_sfx[NUM_AMBIENTS]; -int sound_started=0; +int sound_started = 0; -cvar_t bgmvolume = {"bgmvolume", "1", true}; -cvar_t volume = {"volume", "0.7", true}; +cvar_t bgmvolume = {CVAR_SAVE, "bgmvolume", "1"}; +cvar_t volume = {CVAR_SAVE, "volume", "0.7"}; -cvar_t nosound = {"nosound", "0"}; -cvar_t precache = {"precache", "1"}; -//cvar_t loadas8bit = {"loadas8bit", "0"}; -cvar_t bgmbuffer = {"bgmbuffer", "4096"}; -cvar_t ambient_level = {"ambient_level", "0.3"}; -cvar_t ambient_fade = {"ambient_fade", "100"}; -cvar_t snd_noextraupdate = {"snd_noextraupdate", "0"}; -cvar_t snd_show = {"snd_show", "0"}; -cvar_t _snd_mixahead = {"_snd_mixahead", "0.1", true}; -cvar_t snd_swapstereo = {"snd_swapstereo", "0", true}; +cvar_t nosound = {0, "nosound", "0"}; +cvar_t precache = {0, "precache", "1"}; +cvar_t bgmbuffer = {0, "bgmbuffer", "4096"}; +cvar_t ambient_level = {0, "ambient_level", "0.3"}; +cvar_t ambient_fade = {0, "ambient_fade", "100"}; +cvar_t snd_noextraupdate = {0, "snd_noextraupdate", "0"}; +cvar_t snd_show = {0, "snd_show", "0"}; +cvar_t _snd_mixahead = {CVAR_SAVE, "_snd_mixahead", "0.1"}; +cvar_t snd_swapstereo = {CVAR_SAVE, "snd_swapstereo", "0"}; // ==================================================================== @@ -146,9 +145,7 @@ void S_Startup (void) if (!rc) { -#ifndef _WIN32 Con_Printf("S_Startup: SNDDMA_Init failed.\n"); -#endif sound_started = 0; return; } @@ -160,6 +157,8 @@ void S_Startup (void) void S_Play2(void); +mempool_t *snd_mempool; + /* ================ S_Init @@ -167,12 +166,16 @@ S_Init */ void S_Init (void) { - Con_Printf("\nSound Initialization\n"); + Cvar_RegisterVariable(&volume); + Cvar_RegisterVariable(&bgmvolume); + if (COM_CheckParm("-nosound")) return; + snd_mempool = Mem_AllocPool("sound"); + if (COM_CheckParm("-simsound")) fakedma = true; @@ -184,10 +187,7 @@ void S_Init (void) Cmd_AddCommand("soundinfo", S_SoundInfo_f); Cvar_RegisterVariable(&nosound); - Cvar_RegisterVariable(&volume); Cvar_RegisterVariable(&precache); -// Cvar_RegisterVariable(&loadas8bit); - Cvar_RegisterVariable(&bgmvolume); Cvar_RegisterVariable(&bgmbuffer); Cvar_RegisterVariable(&ambient_level); Cvar_RegisterVariable(&ambient_fade); @@ -196,30 +196,20 @@ void S_Init (void) Cvar_RegisterVariable(&_snd_mixahead); Cvar_RegisterVariable(&snd_swapstereo); // LordHavoc: for people with backwards sound wiring - /* - if (host_parms.memsize < 0x800000) - { - Cvar_Set ("loadas8bit", "1"); - Con_Printf ("loading all sounds as 8bit\n"); - } - */ - - - snd_initialized = true; + known_sfx = Mem_Alloc(snd_mempool, MAX_SFX*sizeof(sfx_t)); + num_sfx = 0; + S_Startup (); SND_InitScaletable (); - known_sfx = Hunk_AllocName (MAX_SFX*sizeof(sfx_t), "sfx_t"); - num_sfx = 0; - // create a piece of DMA memory if (fakedma) { - shm = (void *) Hunk_AllocName(sizeof(*shm), "shm"); + shm = (void *) Mem_Alloc(snd_mempool, sizeof(*shm)); shm->splitbuffer = 0; shm->samplebits = 16; shm->speed = 22050; @@ -229,7 +219,7 @@ void S_Init (void) shm->soundalive = true; shm->gamealive = true; shm->submission_chunk = 1; - shm->buffer = Hunk_AllocName(1<<16, "shmbuf"); + shm->buffer = Mem_Alloc(snd_mempool, shm->channels * shm->samples * (shm->samplebits / 8)); } if (!sound_started) @@ -239,11 +229,8 @@ void S_Init (void) // provides a tick sound until washed clean -// if (shm->buffer) -// shm->buffer[4] = shm->buffer[5] = 0x7f; // force a pop for debugging - - ambient_sfx[AMBIENT_WATER] = S_PrecacheSound ("ambience/water1.wav"); - ambient_sfx[AMBIENT_SKY] = S_PrecacheSound ("ambience/wind2.wav"); + ambient_sfx[AMBIENT_WATER] = S_PrecacheSound ("ambience/water1.wav", false); + ambient_sfx[AMBIENT_SKY] = S_PrecacheSound ("ambience/wind2.wav", false); S_StopAllSounds (true); } @@ -255,7 +242,6 @@ void S_Init (void) void S_Shutdown(void) { - if (!sound_started) return; @@ -266,9 +252,7 @@ void S_Shutdown(void) sound_started = 0; if (!fakedma) - { SNDDMA_Shutdown(); - } } @@ -284,8 +268,8 @@ S_FindName */ sfx_t *S_FindName (char *name) { - int i; - sfx_t *sfx; + int i; + sfx_t *sfx; if (!name) Host_Error ("S_FindName: NULL\n"); @@ -294,20 +278,18 @@ sfx_t *S_FindName (char *name) Host_Error ("Sound name too long: %s", name); // see if already loaded - for (i=0 ; i < num_sfx ; i++) + for (i = 0;i < num_sfx;i++) if (!strcmp(known_sfx[i].name, name)) - { return &known_sfx[i]; - } if (num_sfx == MAX_SFX) Sys_Error ("S_FindName: out of sfx_t"); - + sfx = &known_sfx[i]; strcpy (sfx->name, name); num_sfx++; - + return sfx; } @@ -326,7 +308,6 @@ void S_TouchSound (char *name) return; sfx = S_FindName (name); - Cache_Check (&sfx->cache); } /* @@ -335,19 +316,19 @@ S_PrecacheSound ================== */ -sfx_t *S_PrecacheSound (char *name) +sfx_t *S_PrecacheSound (char *name, int complain) { - sfx_t *sfx; + sfx_t *sfx; - if (!sound_started || nosound.value) + if (!sound_started || nosound.integer) return NULL; sfx = S_FindName (name); - + // cache it in - if (precache.value) - S_LoadSound (sfx); - + if (precache.integer) + S_LoadSound (sfx, complain); + return sfx; } @@ -395,8 +376,8 @@ channel_t *SND_PickChannel(int entnum, int entchannel) if (channels[first_to_die].sfx) channels[first_to_die].sfx = NULL; - return &channels[first_to_die]; -} + return &channels[first_to_die]; +} /* ================= @@ -424,9 +405,9 @@ void SND_Spatialize(channel_t *ch) snd = ch->sfx; VectorSubtract(ch->origin, listener_origin, source_vec); - + dist = VectorNormalizeLength(source_vec) * ch->dist_mult; - + dot = DotProduct(listener_right, source_vec); if (shm->channels == 1) @@ -450,7 +431,7 @@ void SND_Spatialize(channel_t *ch) ch->leftvol = (int) (ch->master_vol * scale); if (ch->leftvol < 0) ch->leftvol = 0; -} +} // ======================================================================= @@ -471,7 +452,7 @@ void S_StartSound(int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f if (!sfx) return; - if (nosound.value) + if (nosound.integer) return; vol = fvol*255; @@ -480,7 +461,7 @@ void S_StartSound(int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f target_chan = SND_PickChannel(entnum, entchannel); if (!target_chan) return; - + // spatialize memset (target_chan, 0, sizeof(*target_chan)); VectorCopy(origin, target_chan->origin); @@ -494,7 +475,7 @@ void S_StartSound(int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f return; // not audible at all // new channel - sc = S_LoadSound (sfx); + sc = S_LoadSound (sfx, true); if (!sc) { target_chan->sfx = NULL; @@ -503,7 +484,7 @@ void S_StartSound(int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f target_chan->sfx = sfx; target_chan->pos = 0.0; - target_chan->end = paintedtime + sc->length; + target_chan->end = paintedtime + sc->length; // if an identical sound has also been started this frame, offset the pos // a bit to keep it from just making the first one louder @@ -524,7 +505,7 @@ void S_StartSound(int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f target_chan->end -= skip; break; } - + } } @@ -571,7 +552,7 @@ void S_StopAllSoundsC (void) void S_ClearBuffer (void) { int clear; - + #ifdef _WIN32 if (!sound_started || !shm || (!shm->buffer && !pDSBuf)) #else @@ -614,12 +595,21 @@ void S_ClearBuffer (void) memset(pData, clear, shm->samples * shm->samplebits/8); pDSBuf->lpVtbl->Unlock(pDSBuf, pData, dwSize, NULL, 0); - + } else #endif { - memset(shm->buffer, clear, shm->samples * shm->samplebits/8); + int setsize = shm->samples * shm->samplebits / 8; + char *buf = shm->buffer; + + while (setsize--) + *buf++ = 0; + +// on i586/i686 optimized versions of glibc, glibc *wrongly* IMO, +// reads the memory area before writing to it causing a seg fault +// since the memory is PROT_WRITE only and not PROT_READ|PROT_WRITE +// memset(shm->buffer, clear, shm->samples * shm->samplebits/8); } } @@ -646,7 +636,7 @@ void S_StaticSound (sfx_t *sfx, vec3_t origin, float vol, float attenuation) ss = &channels[total_channels]; total_channels++; - sc = S_LoadSound (sfx); + sc = S_LoadSound (sfx, true); if (!sc) return; @@ -655,13 +645,13 @@ void S_StaticSound (sfx_t *sfx, vec3_t origin, float vol, float attenuation) Con_Printf ("Sound %s not looped\n", sfx->name); return; } - + ss->sfx = sfx; VectorCopy (origin, ss->origin); ss->master_vol = vol; ss->dist_mult = (attenuation/64) / sound_nominal_clip_dist; - ss->end = paintedtime + sc->length; - + ss->end = paintedtime + sc->length; + SND_Spatialize (ss); } @@ -694,7 +684,7 @@ void S_UpdateAmbientSounds (void) // calc ambient sound levels for (ambient_channel = 0 ; ambient_channel< NUM_AMBIENTS ; ambient_channel++) { - chan = &channels[ambient_channel]; + chan = &channels[ambient_channel]; chan->sfx = ambient_sfx[ambient_channel]; vol = ambient_level.value * l->ambient_sound_level[ambient_channel]; @@ -714,7 +704,7 @@ void S_UpdateAmbientSounds (void) if (chan->master_vol < vol) chan->master_vol = vol; } - + chan->leftvol = chan->rightvol = chan->master_vol; } } @@ -741,13 +731,13 @@ void S_Update(vec3_t origin, vec3_t forward, vec3_t right, vec3_t up) VectorCopy(forward, listener_forward); VectorCopy(right, listener_right); VectorCopy(up, listener_up); - + // update general area ambient sound sources S_UpdateAmbientSounds (); combine = NULL; -// update spatialization for static and dynamic sounds +// update spatialization for static and dynamic sounds ch = channels+NUM_AMBIENTS; for (i=NUM_AMBIENTS ; i MAX_DYNAMIC_CHANNELS + NUM_AMBIENTS) { // see if it can just use the last one @@ -775,7 +765,7 @@ void S_Update(vec3_t origin, vec3_t forward, vec3_t right, vec3_t up) for (j=MAX_DYNAMIC_CHANNELS + NUM_AMBIENTS ; jsfx == ch->sfx) break; - + if (j == total_channels) { combine = NULL; @@ -791,24 +781,19 @@ void S_Update(vec3_t origin, vec3_t forward, vec3_t right, vec3_t up) continue; } } - - } // // debugging output // - if (snd_show.value) + if (snd_show.integer) { total = 0; ch = channels; for (i=0 ; isfx && (ch->leftvol || ch->rightvol) ) - { - //Con_Printf ("%3i %3i %s\n", ch->leftvol, ch->rightvol, ch->sfx->name); total++; - } - + Con_Printf ("----(%i)----\n", total); } @@ -822,7 +807,7 @@ void GetSoundtime(void) static int buffers; static int oldsamplepos; int fullsamples; - + fullsamples = shm->samples / shm->channels; // it is possible to miscount buffers if it has wrapped twice between @@ -836,7 +821,7 @@ void GetSoundtime(void) if (samplepos < oldsamplepos) { buffers++; // buffer wrapped - + if (paintedtime > 0x40000000) { // time to chop things off to avoid 32 bit limits buffers = 0; @@ -859,7 +844,7 @@ void S_ExtraUpdate (void) IN_Accumulate (); #endif - if (snd_noextraupdate.value) + if (snd_noextraupdate.integer) return; // don't pollute timings S_Update_(); } @@ -868,7 +853,7 @@ void S_Update_(void) { unsigned endtime; int samps; - + if (!sound_started || (snd_blocked > 0)) return; @@ -877,10 +862,7 @@ void S_Update_(void) // check to make sure that we haven't overshot if (paintedtime < soundtime) - { - //Con_Printf ("S_Update_ : overflow\n"); paintedtime = soundtime; - } // mix ahead of current position endtime = soundtime + _snd_mixahead.value * shm->speed; @@ -897,10 +879,10 @@ void S_Update_(void) { if (pDSBuf->lpVtbl->GetStatus (pDSBuf, &dwStatus) != DD_OK) Con_Printf ("Couldn't get sound buffer status\n"); - + if (dwStatus & DSBSTATUS_BUFFERLOST) pDSBuf->lpVtbl->Restore (pDSBuf); - + if (!(dwStatus & DSBSTATUS_PLAYING)) pDSBuf->lpVtbl->Play(pDSBuf, 0, 0, DSBPLAY_LOOPING); } @@ -926,7 +908,7 @@ void S_Play(void) int i; char name[256]; sfx_t *sfx; - + i = 1; while (icache); + sc = sfx->sfxcache; if (!sc) continue; size = sc->length*sc->width*(sc->stereo+1); @@ -1020,15 +1002,15 @@ void S_LocalSound (char *sound) { sfx_t *sfx; - if (nosound.value) + if (nosound.integer) return; if (!sound_started) return; - - sfx = S_PrecacheSound (sound); + + sfx = S_PrecacheSound (sound, true); if (!sfx) { - Con_Printf ("S_LocalSound: can't cache %s\n", sound); + Con_Printf ("S_LocalSound: can't precache %s\n", sound); return; } S_StartSound (cl.viewentity, -1, sfx, vec3_origin, 1, 1);