X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=snd_main.c;h=a73a5181da260d8e294fab751dc6a94a6144f047;hb=e25ec73b388ad038b3999b26d70c03c4a1b9c482;hp=57ed4786521096ddc3f5a496ae7a29c266c64cc9;hpb=c9224df6b5391897c23a5f1ca33714b9390e8c87;p=xonotic%2Fdarkplaces.git diff --git a/snd_main.c b/snd_main.c index 57ed4786..a73a5181 100644 --- a/snd_main.c +++ b/snd_main.c @@ -171,6 +171,7 @@ cvar_t snd_spatialization_occlusion = {CVAR_SAVE, "snd_spatialization_occlusion" // Cvars declared in snd_main.h (shared with other snd_*.c files) cvar_t _snd_mixahead = {CVAR_SAVE, "_snd_mixahead", "0.15", "how much sound to mix ahead of time"}; +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)"}; cvar_t snd_swapstereo = {CVAR_SAVE, "snd_swapstereo", "0", "swaps left/right speakers for old ISA soundblaster cards"}; extern cvar_t v_flipped; cvar_t snd_channellayout = {0, "snd_channellayout", "0", "channel layout. Can be 0 (auto - snd_restart needed), 1 (standard layout), or 2 (ALSA layout)"}; @@ -261,7 +262,7 @@ static void S_Play_Common (float fvol, float attenuation) ch_ind = S_StartSound (-1, 0, sfx, listener_origin, fvol, attenuation); // Free the sfx if the file didn't exist - if (ch_ind < 0) + if (!sfx->fetcher) S_FreeSfx (sfx, false); else channels[ch_ind].flags |= CHANNELFLAG_LOCALSOUND; @@ -844,6 +845,7 @@ void S_Init(void) Cvar_RegisterVariable(&nosound); Cvar_RegisterVariable(&snd_precache); Cvar_RegisterVariable(&snd_initialized); + Cvar_RegisterVariable(&snd_streaming); Cvar_RegisterVariable(&ambient_level); Cvar_RegisterVariable(&ambient_fade); Cvar_RegisterVariable(&snd_noextraupdate); @@ -1451,11 +1453,10 @@ void S_PlaySfxOnChannel (sfx_t *sfx, channel_t *target_chan, unsigned int flags, // finally, set the sfx pointer, so the channel becomes valid for playback // and will be noticed by the mixer target_chan->sfx = sfx; - SND_Spatialize (target_chan, isstatic); } -int S_StartSound (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float fvol, float attenuation) +int S_StartSound_StartPosition (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float fvol, float attenuation, float startposition) { channel_t *target_chan, *check, *ch; int ch_idx, startpos; @@ -1492,16 +1493,19 @@ int S_StartSound (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f // 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 check = &channels[NUM_AMBIENTS]; - startpos = 0; - for (ch_idx=NUM_AMBIENTS ; ch_idx < NUM_AMBIENTS + MAX_DYNAMIC_CHANNELS ; ch_idx++, check++) + startpos = (int)(startposition * S_GetSoundRate()); + if (startpos == 0) { - if (check == target_chan) - continue; - if (check->sfx == sfx && check->pos == 0) + for (ch_idx=NUM_AMBIENTS ; ch_idx < NUM_AMBIENTS + MAX_DYNAMIC_CHANNELS ; ch_idx++, check++) { - // use negative pos offset to delay this sound effect - startpos = (int)lhrandom(0, -0.1 * snd_renderbuffer->format.speed); - break; + if (check == target_chan) + continue; + if (check->sfx == sfx && check->pos == 0) + { + // use negative pos offset to delay this sound effect + startpos = (int)lhrandom(0, -0.1 * snd_renderbuffer->format.speed); + break; + } } } @@ -1510,6 +1514,11 @@ int S_StartSound (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f return (target_chan - channels); } +int S_StartSound (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float fvol, float attenuation) +{ + return S_StartSound_StartPosition(entnum, entchannel, sfx, origin, fvol, attenuation, 0); +} + void S_StopChannel (unsigned int channel_ind, qboolean lockmutex) { channel_t *ch; @@ -1651,6 +1660,8 @@ float S_GetChannelPosition (unsigned int ch_ind) int s; channel_t *ch = &channels[ch_ind]; sfx_t *sfx = ch->sfx; + if (!sfx) + return -1; s = ch->pos; /*