From 4cc71152de1b87cfa1919ab6f9853b4e3f0e3db0 Mon Sep 17 00:00:00 2001 From: cypress Date: Thu, 5 Sep 2024 18:15:10 -0700 Subject: [PATCH] Match sound between 3DS and PSP --- source/snd_dma.c | 281 ++++++++++++++++++----------------------------- source/sound.h | 3 + 2 files changed, 112 insertions(+), 172 deletions(-) diff --git a/source/snd_dma.c b/source/snd_dma.c index 740ae09..2fb0151 100644 --- a/source/snd_dma.c +++ b/source/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. @@ -21,12 +21,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" -void S_Play(void); -void S_PlayVol(void); -void S_SoundList(void); + + +void S_Play_f(void); +void S_PlayVol_f(void); +void S_SoundList_f(void); void S_Update_(); void S_StopAllSounds(qboolean clear); -void S_StopAllSoundsC(void); +void S_StopAllSoundsC_f(void); +void S_VolumeDown_f (void); // Baker 3.60 - from JoeQuake 0.15 +void S_VolumeUp_f (void); // Baker 3.60 - from JoeQuake 0.15 // ======================================================================= // Internal sound data & structures @@ -47,13 +51,12 @@ vec3_t listener_origin; vec3_t listener_forward; vec3_t listener_right; vec3_t listener_up; -vec_t sound_nominal_clip_dist=1000.0; +vec_t sound_nominal_clip_dist=1500.0; // JPG - changed this from 1000 to 15000 (I'm 99% sure that's what it was in 1.06) int soundtime; // sample PAIRS int paintedtime; // sample PAIRS -#define MAX_SFX 512 sfx_t *known_sfx; // hunk allocated [MAX_SFX] int num_sfx; @@ -65,29 +68,26 @@ int desired_bits = 16; int sound_started=0; cvar_t bgmvolume = {"bgmvolume", "1", true}; +cvar_t bgmtype = {"bgmtype", "cd", true}; // cd or none cvar_t volume = {"volume", "0.7", true}; 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_level = {"ambient_level", "0.3", true}; // Baker 3.60 - Save to config 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}; - // ==================================================================== // User-setable variables // ==================================================================== - -// // Fake dma is a synchronous faking of the DMA progress used for // isolating performance in the renderer. The fakedma_updates is // number of times S_Update() is called per second. -// qboolean fakedma = false; int fakedma_updates = 15; @@ -112,7 +112,7 @@ 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); @@ -139,13 +139,9 @@ void S_Startup (void) if (!fakedma) { - rc = SNDDMA_Init(); - - if (!rc) + if (!(rc = SNDDMA_Init())) { -#ifndef _WIN32 Con_Printf("S_Startup: SNDDMA_Init failed.\n"); -#endif sound_started = 0; return; } @@ -160,22 +156,24 @@ void S_Startup (void) S_Init ================ */ +void CDAudioSetVolume (void); void S_Init (void) { - - Con_Printf("\nSound Initialization\n"); - if (COM_CheckParm("-nosound")) return; + Con_Printf("\nSound Initialization\n"); + if (COM_CheckParm("-simsound")) fakedma = true; - Cmd_AddCommand("play", S_Play); - Cmd_AddCommand("playvol", S_PlayVol); - Cmd_AddCommand("stopsound", S_StopAllSoundsC); - Cmd_AddCommand("soundlist", S_SoundList); + Cmd_AddCommand("play", S_Play_f); + Cmd_AddCommand("playvol", S_PlayVol_f); + Cmd_AddCommand("stopsound", S_StopAllSoundsC_f); + Cmd_AddCommand("soundlist", S_SoundList_f); Cmd_AddCommand("soundinfo", S_SoundInfo_f); + Cmd_AddCommand ("volumedown", S_VolumeDown_f); // Baker 3.60 - from JoeQuake 0.15 + Cmd_AddCommand ("volumeup", S_VolumeUp_f); // Baker 3.60 - from JoeQuake 0.15 Cvar_RegisterVariable(&nosound); Cvar_RegisterVariable(&volume); @@ -189,14 +187,13 @@ void S_Init (void) Cvar_RegisterVariable(&snd_show); Cvar_RegisterVariable(&_snd_mixahead); - if (host_parms.memsize < 0x800000) + //if (host_parms.memsize < 0x800000) { Cvar_Set ("loadas8bit", "1"); Con_Printf ("loading all sounds as 8bit\n"); } - snd_initialized = true; S_Startup (); @@ -223,16 +220,13 @@ void S_Init (void) shm->buffer = Hunk_AllocName(1<<16, "shmbuf"); } - Con_Printf ("Sound sampling rate: %i\n", shm->speed); + Con_Printf ("Sound sampling rate: %i Hz\n", shm->speed); // 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"); - S_StopAllSounds (true); } @@ -243,7 +237,6 @@ void S_Init (void) void S_Shutdown(void) { - if (!sound_started) return; @@ -254,9 +247,7 @@ void S_Shutdown(void) sound_started = 0; if (!fakedma) - { SNDDMA_Shutdown(); - } } @@ -278,24 +269,22 @@ sfx_t *S_FindName (char *name) if (!name) Sys_Error ("S_FindName: NULL\n"); - if (Q_strlen(name) >= MAX_QPATH) + if (strlen(name) >= MAX_QPATH) Sys_Error ("Sound name too long: %s", name); // see if already loaded 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; } @@ -309,7 +298,7 @@ S_TouchSound void S_TouchSound (char *name) { sfx_t *sfx; - + if (!sound_started) return; @@ -331,11 +320,11 @@ sfx_t *S_PrecacheSound (char *name) return NULL; sfx = S_FindName (name); - + // cache it in if (precache.value) S_LoadSound (sfx); - + return sfx; } @@ -361,7 +350,7 @@ channel_t *SND_PickChannel(int entnum, int entchannel) if (entchannel != 0 // channel 0 never overrides && channels[ch_idx].entnum == entnum && (channels[ch_idx].entchannel == entchannel || entchannel == -1) ) - { // allways override sound from same entity + { // always override sound from same entity first_to_die = ch_idx; break; } @@ -383,8 +372,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]; +} /* ================= @@ -426,9 +415,7 @@ float SND_InverseSpatializationRScaleLUT[126] = { 1.2961481396815726f, 1.301921656629154f, 1.3076696830622025f, 1.3133925536563702f, 1.3190905958272925f, 1.3247641299491775f, 1.3304134695650076f, 1.3360389215887394f, 1.3416407864998743f, 1.3472193585307484f, 1.3527749258468689f, 1.358307770720613f, - 1.363818169698586f, 1.3693063937629157f, 1.3747727084867525f, 1.3802173741842267f, - 1.3856406460551023f, 1.391042774324356f, 1.3964240043768947f, 1.4017845768876191f, - 1.4071247279470294f, 1.412444689182554f + 1.363818169698586f, 1.3693063937629157f }; float SND_InverseSpatializationLScaleLUT[126] = { @@ -463,15 +450,13 @@ float SND_InverseSpatializationLScaleLUT[126] = { 0.5656854249492369f, 0.5522680508593619f, 0.5385164807134492f, 0.5244044240850745f, 0.5099019513592772f, 0.4949747468305819f, 0.4795831523312705f, 0.46368092477478373f, 0.4472135954999564f, 0.4301162633521297f, 0.41231056256176435f, 0.39370039370058874f, - 0.3741657386773922f, 0.35355339059327173f, 0.3316624790355378f, 0.30822070014844644f, - 0.2828427124746164f, 0.2549509756796363f, 0.2236067977499756f, 0.187082869338693f, - 0.14142135623730406f, 0.07071067811864379f + 0.3741657386773922f, 0.35355339059327173f }; void SND_Spatialize(channel_t *ch) { vec_t dot; - vec_t ldist, rdist, dist; + vec_t dist; vec_t lscale, rscale, scale; vec3_t source_vec; sfx_t *snd; @@ -489,9 +474,9 @@ void SND_Spatialize(channel_t *ch) snd = ch->sfx; VectorSubtract(ch->origin, listener_origin, source_vec); - + dist = VectorNormalize(source_vec) * ch->dist_mult; - + dot = DotProduct(listener_right, source_vec); int dot_index = (dot + 1) * 63; @@ -508,7 +493,7 @@ void SND_Spatialize(channel_t *ch) ch->leftvol = (int) (ch->master_vol * scale); if (ch->leftvol < 0) ch->leftvol = 0; -} +} // ======================================================================= @@ -538,7 +523,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); @@ -552,8 +537,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); - if (!sc) + if (!(sc = S_LoadSound (sfx))) { target_chan->sfx = NULL; return; // couldn't load the sound's data @@ -561,7 +545,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 @@ -579,7 +563,6 @@ void S_StartSound(int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f target_chan->end -= skip; break; } - } } @@ -589,8 +572,7 @@ void S_StopSound(int entnum, int entchannel) for (i=0 ; ibuffer && !pDSBuf)) -#else + if (!sound_started || !shm || !shm->buffer) -#endif return; if (shm->samplebits == 8) @@ -639,42 +617,8 @@ void S_ClearBuffer (void) else clear = 0; -#ifdef _WIN32 - if (pDSBuf) { - DWORD dwSize; - DWORD *pData; - int reps; - HRESULT hresult; - - reps = 0; - - while ((hresult = pDSBuf->lpVtbl->Lock(pDSBuf, 0, gSndBufSize, &pData, &dwSize, NULL, NULL, 0)) != DS_OK) - { - if (hresult != DSERR_BUFFERLOST) - { - Con_Printf ("S_ClearBuffer: DS::Lock Sound Buffer Failed\n"); - S_Shutdown (); - return; - } - - if (++reps > 10000) - { - Con_Printf ("S_ClearBuffer: DS: couldn't restore buffer\n"); - S_Shutdown (); - return; - } - } - - Q_memset(pData, clear, shm->samples * shm->samplebits/8); - - pDSBuf->lpVtbl->Unlock(pDSBuf, pData, dwSize, NULL, 0); - - } - else -#endif - { - Q_memset(shm->buffer, clear, shm->samples * shm->samplebits/8); + memset(shm->buffer, clear, shm->samples * shm->samplebits/8); } } @@ -701,8 +645,7 @@ void S_StaticSound (sfx_t *sfx, vec3_t origin, float vol, float attenuation) ss = &channels[total_channels]; total_channels++; - sc = S_LoadSound (sfx); - if (!sc) + if (!(sc = S_LoadSound (sfx))) return; if (sc->loopstart == -1) @@ -710,13 +653,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); } @@ -752,9 +695,9 @@ void S_UpdateAmbientSounds (void) 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]; if (vol < 8) vol = 0; @@ -772,7 +715,7 @@ void S_UpdateAmbientSounds (void) if (chan->master_vol < vol) chan->master_vol = vol; } - + chan->leftvol = chan->rightvol = chan->master_vol; } } @@ -799,13 +742,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 @@ -833,7 +776,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; @@ -849,13 +792,9 @@ void S_Update(vec3_t origin, vec3_t forward, vec3_t right, vec3_t up) continue; } } - - } -// // debugging output -// if (snd_show.value) { total = 0; @@ -866,7 +805,7 @@ void S_Update(vec3_t origin, vec3_t forward, vec3_t right, vec3_t up) //Con_Printf ("%3i %3i %s\n", ch->leftvol, ch->rightvol, ch->sfx->name); total++; } - + Con_Printf ("----(%i)----\n", total); } @@ -880,21 +819,18 @@ 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 // calls to S_Update. Oh well. -#ifdef __sun__ - soundtime = SNDDMA_GetSamples(); -#else samplepos = SNDDMA_GetDMAPos(); - if (samplepos < oldsamplepos) { buffers++; // buffer wrapped - + if (paintedtime > 0x40000000) { // time to chop things off to avoid 32 bit limits buffers = 0; @@ -905,18 +841,13 @@ void GetSoundtime(void) oldsamplepos = samplepos; soundtime = buffers*fullsamples + samplepos/shm->channels; -#endif } void S_ExtraUpdate (void) { - -#ifdef _WIN32 - IN_Accumulate (); -#endif - if (snd_noextraupdate.value) return; // don't pollute timings + S_Update_(); } @@ -924,7 +855,7 @@ void S_Update_(void) { unsigned endtime; int samps; - + if (!sound_started || (snd_blocked > 0)) return; @@ -938,31 +869,14 @@ void S_Update_(void) paintedtime = soundtime; } + //OutputDebugString(va("paintedtime: %i, soundtime: %i\n", paintedtime, soundtime)); + // mix ahead of current position endtime = soundtime + _snd_mixahead.value * shm->speed; samps = shm->samples >> (shm->channels-1); if (endtime - soundtime > samps) endtime = soundtime + samps; -#ifdef _WIN32 -// if the buffer was lost or stopped, restore it and/or restart it - { - DWORD dwStatus; - - if (pDSBuf) - { - 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); - } - } -#endif - S_PaintChannels (endtime); SNDDMA_Submit (); @@ -976,55 +890,61 @@ console functions =============================================================================== */ -void S_Play(void) +void S_Play_f(void) { static int hash=345; int i; char name[256]; sfx_t *sfx; - + i = 1; while (i\n"); + return; + } + i = 1; while (icache); - if (!sc) + if (!(sc = Cache_Check (&sfx->cache))) continue; size = sc->length*sc->width*(sc->stereo+1); total += size; @@ -1048,6 +967,25 @@ void S_SoundList(void) Con_Printf ("Total resident: %i\n", total); } +qboolean volume_changed; + +void S_VolumeDown_f (void) +{ + //S_LocalSound ("misc/menu3.wav"); + volume.value -= 0.1; + volume.value = bound(0, volume.value, 1); + //Cvar_SetValueByRef (&volume, volume.value); + volume_changed = true; +} + +void S_VolumeUp_f (void) +{ + //S_LocalSound ("misc/menu3.wav"); + volume.value += 0.1; + volume.value = bound(0, volume.value, 1); + //Cvar_SetValueByRef (&volume, volume.value); + volume_changed = true; +} void S_LocalSound (char *sound) { @@ -1057,9 +995,8 @@ void S_LocalSound (char *sound) return; if (!sound_started) return; - - sfx = S_PrecacheSound (sound); - if (!sfx) + + if (!(sfx = S_PrecacheSound (sound))) { Con_Printf ("S_LocalSound: can't cache %s\n", sound); return; diff --git a/source/sound.h b/source/sound.h index 8f88a35..8980f02 100644 --- a/source/sound.h +++ b/source/sound.h @@ -127,6 +127,8 @@ void SNDDMA_Shutdown(void); #define MAX_CHANNELS 128 #define MAX_DYNAMIC_CHANNELS 8 +#define MAX_SFX 512 + extern channel_t channels[MAX_CHANNELS]; // 0 to MAX_DYNAMIC_CHANNELS-1 = normal entity sounds @@ -154,6 +156,7 @@ extern vec_t sound_nominal_clip_dist; extern cvar_t loadas8bit; extern cvar_t bgmvolume; +extern cvar_t bgmtype; extern cvar_t volume; extern qboolean snd_initialized;