X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=snd_main.c;h=a6db955deaec6e733070436d5b93af411d8257c2;hb=b8d63f8b1a4a6d8cc880be5ff8ea83aa6fbba365;hp=9dc5df8ffe2f52b67b2e7967debf6e678a5c22fa;hpb=6f08dc91df02341e36d8f9169bbc9023a72673f3;p=xonotic%2Fdarkplaces.git diff --git a/snd_main.c b/snd_main.c index 9dc5df8f..a6db955d 100644 --- a/snd_main.c +++ b/snd_main.c @@ -60,8 +60,8 @@ channel_t channels[MAX_CHANNELS]; unsigned int total_channels; int snd_blocked = 0; -cvar_t snd_initialized = { CVAR_READONLY, "snd_initialized", "0"}; -cvar_t snd_streaming = { CVAR_SAVE, "snd_streaming", "1"}; +cvar_t snd_initialized = { CVAR_READONLY, "snd_initialized", "0", "indicates the sound subsystem is active"}; +cvar_t snd_streaming = { CVAR_SAVE, "snd_streaming", "1", "enables keeping compressed ogg sound files compressed, decompressing them only as needed, otherwise they will be decompressed completely at load (may use a lot of memory)"}; volatile dma_t *shm = 0; volatile dma_t sn; @@ -83,19 +83,19 @@ qboolean sound_spatialized = false; // isolating performance in the renderer. qboolean fakedma = false; -cvar_t bgmvolume = {CVAR_SAVE, "bgmvolume", "1"}; -cvar_t volume = {CVAR_SAVE, "volume", "0.7"}; -cvar_t snd_staticvolume = {CVAR_SAVE, "snd_staticvolume", "1"}; +cvar_t bgmvolume = {CVAR_SAVE, "bgmvolume", "1", "volume of background music (such as CD music or replacement files such as sound/cdtracks/track002.ogg)"}; +cvar_t volume = {CVAR_SAVE, "volume", "0.7", "volume of sound effects"}; +cvar_t snd_staticvolume = {CVAR_SAVE, "snd_staticvolume", "1", "volume of ambient sound effects (such as swampy sounds at the start of e1m2)"}; -cvar_t nosound = {0, "nosound", "0"}; -cvar_t snd_precache = {0, "snd_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"}; +cvar_t nosound = {0, "nosound", "0", "disables sound"}; +cvar_t snd_precache = {0, "snd_precache", "1", "loads sounds before they are used"}; +//cvar_t bgmbuffer = {0, "bgmbuffer", "4096", "unused quake cvar"}; +cvar_t ambient_level = {0, "ambient_level", "0.3", "volume of environment noises (water and wind)"}; +cvar_t ambient_fade = {0, "ambient_fade", "100", "rate of volume fading when moving from one environment to another"}; +cvar_t snd_noextraupdate = {0, "snd_noextraupdate", "0", "disables extra sound mixer calls that are meant to reduce the chance of sound breakup at very low framerates"}; +cvar_t snd_show = {0, "snd_show", "0", "shows some statistics about sound mixing"}; +cvar_t _snd_mixahead = {CVAR_SAVE, "_snd_mixahead", "0.1", "how much sound to mix ahead of time"}; +cvar_t snd_swapstereo = {CVAR_SAVE, "snd_swapstereo", "0", "swaps left/right speakers for old ISA soundblaster cards"}; // Ambient sounds sfx_t* ambient_sfxs [2] = { NULL, NULL }; @@ -205,19 +205,19 @@ void S_Init(void) if (COM_CheckParm("-simsound")) fakedma = true; - Cmd_AddCommand("play", S_Play); - Cmd_AddCommand("play2", S_Play2); - Cmd_AddCommand("playvol", S_PlayVol); - Cmd_AddCommand("stopsound", S_StopAllSounds); - Cmd_AddCommand("soundlist", S_SoundList); - Cmd_AddCommand("soundinfo", S_SoundInfo_f); - Cmd_AddCommand("snd_restart", S_Restart_f); + Cmd_AddCommand("play", S_Play, "play a sound at your current location (not heard by anyone else)"); + Cmd_AddCommand("play2", S_Play2, "play a sound globally throughout the level (not heard by anyone else)"); + Cmd_AddCommand("playvol", S_PlayVol, "play a sound at the specified volume level at your current location (not heard by anyone else)"); + Cmd_AddCommand("stopsound", S_StopAllSounds, "silence"); + Cmd_AddCommand("soundlist", S_SoundList, "list loaded sounds"); + Cmd_AddCommand("soundinfo", S_SoundInfo_f, "print sound system information (such as channels and speed)"); + Cmd_AddCommand("snd_restart", S_Restart_f, "restart sound system"); Cvar_RegisterVariable(&nosound); Cvar_RegisterVariable(&snd_precache); Cvar_RegisterVariable(&snd_initialized); Cvar_RegisterVariable(&snd_streaming); - Cvar_RegisterVariable(&bgmbuffer); + //Cvar_RegisterVariable(&bgmbuffer); Cvar_RegisterVariable(&ambient_level); Cvar_RegisterVariable(&ambient_fade); Cvar_RegisterVariable(&snd_noextraupdate); @@ -416,6 +416,9 @@ sfx_t *S_PrecacheSound (const char *name, qboolean complain, qboolean lock) if (!snd_initialized.integer) return NULL; + if (name == NULL || name[0] == 0) + return NULL; + sfx = S_FindName (name); if (sfx == NULL) return NULL; @@ -429,6 +432,16 @@ sfx_t *S_PrecacheSound (const char *name, qboolean complain, qboolean lock) return sfx; } +/* +================== +S_IsSoundPrecached +================== +*/ +qboolean S_IsSoundPrecached (const sfx_t *sfx) +{ + return (sfx != NULL && sfx->fetcher != NULL); +} + /* ================== S_LockSfx @@ -536,12 +549,12 @@ void SND_Spatialize(channel_t *ch, qboolean isstatic) vec3_t source_vec; // update sound origin if we know about the entity - if (ch->entnum > 0 && cls.state == ca_connected && cl_entities[ch->entnum].state_current.active) + if (ch->entnum > 0 && cls.state == ca_connected && cl.entities[ch->entnum].state_current.active) { - //Con_Printf("-- entnum %i origin %f %f %f neworigin %f %f %f\n", ch->entnum, ch->origin[0], ch->origin[1], ch->origin[2], cl_entities[ch->entnum].state_current.origin[0], cl_entities[ch->entnum].state_current.origin[1], cl_entities[ch->entnum].state_current.origin[2]); - VectorCopy(cl_entities[ch->entnum].state_current.origin, ch->origin); - if (cl_entities[ch->entnum].state_current.modelindex && cl.model_precache[cl_entities[ch->entnum].state_current.modelindex] && cl.model_precache[cl_entities[ch->entnum].state_current.modelindex]->soundfromcenter) - VectorMAMAM(1.0f, ch->origin, 0.5f, cl.model_precache[cl_entities[ch->entnum].state_current.modelindex]->normalmins, 0.5f, cl.model_precache[cl_entities[ch->entnum].state_current.modelindex]->normalmaxs, ch->origin); + //Con_Printf("-- entnum %i origin %f %f %f neworigin %f %f %f\n", ch->entnum, ch->origin[0], ch->origin[1], ch->origin[2], cl.entities[ch->entnum].state_current.origin[0], cl.entities[ch->entnum].state_current.origin[1], cl.entities[ch->entnum].state_current.origin[2]); + VectorCopy(cl.entities[ch->entnum].state_current.origin, ch->origin); + if (cl.entities[ch->entnum].state_current.modelindex && cl.model_precache[cl.entities[ch->entnum].state_current.modelindex] && cl.model_precache[cl.entities[ch->entnum].state_current.modelindex]->soundfromcenter) + VectorMAMAM(1.0f, ch->origin, 0.5f, cl.model_precache[cl.entities[ch->entnum].state_current.modelindex]->normalmins, 0.5f, cl.model_precache[cl.entities[ch->entnum].state_current.modelindex]->normalmaxs, ch->origin); } mastervol = ch->master_vol; @@ -626,7 +639,7 @@ int S_StartSound (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f return -1; } - if (entnum && entnum >= cl_max_entities) + if (entnum && entnum >= cl.max_entities) CL_ExpandEntities(entnum); // Pick a channel to play on @@ -956,8 +969,18 @@ void S_Update(const matrix4x4_t *listenermatrix) // calculate the current matrices for (j = 0;j < SND_LISTENERS;j++) { - Matrix4x4_CreateFromQuakeEntity(&rotatematrix, 0, 0, 0, 0, snd_speakerlayout.listeners[j].yawangle, 0, 1); - Matrix4x4_Concat(&listener_matrix[j], &basematrix, &rotatematrix); + Matrix4x4_CreateFromQuakeEntity(&rotatematrix, 0, 0, 0, 0, -snd_speakerlayout.listeners[j].yawangle, 0, 1); + Matrix4x4_Concat(&listener_matrix[j], &rotatematrix, &basematrix); + // I think this should now do this: + // 1. create a rotation matrix for rotating by e.g. -90 degrees CCW + // (note: the matrix will rotate the OBJECT, not the VIEWER, so its + // angle has to be taken negative) + // 2. create a transform which first rotates and moves its argument + // into the player's view coordinates (using basematrix which is + // an inverted "absolute" listener matrix), then applies the + // rotation matrix for the ear + // Isn't Matrix4x4_CreateFromQuakeEntity a bit misleading because this + // does not actually refer to an entity? } // update general area ambient sound sources