From: divverent Date: Thu, 28 Feb 2013 11:39:47 +0000 (+0000) Subject: sound7(): properly support channel flags on client; reassign sound flags so FORCELOOP... X-Git-Tag: xonotic-v0.7.0~32 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=59c97fef1d587930b89a05445af93db05aecb93c;p=xonotic%2Fdarkplaces.git sound7(): properly support channel flags on client; reassign sound flags so FORCELOOP is now 2 (and FULLVOLUME is 16); note that these flags only work on csqc for now git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@11919 d7cf8633-e32d-0410-b094-e92efae38249 ::stable-branch::merge=f6731f724cf445af58130d4d586ba87d85c9f411 --- diff --git a/clvm_cmds.c b/clvm_cmds.c index e1c6ff0d..7cde1d91 100644 --- a/clvm_cmds.c +++ b/clvm_cmds.c @@ -225,10 +225,6 @@ static void VM_CL_sound (prvm_prog_t *prog) return; } - // TODO currently the only flag defined in the interface is - // SOUNDFLAG_RELIABLE. This one makes no sense at all from CSQC. - // We want to, in a later extension, expose more flags. - CL_VM_GetEntitySoundOrigin(MAX_EDICTS + PRVM_NUM_FOR_EDICT(entity), org); S_StartSound_StartPosition_Flags(MAX_EDICTS + PRVM_NUM_FOR_EDICT(entity), channel, S_FindName(sample), org, volume, attenuation, startposition, flags, pitchchange > 0.0f ? pitchchange * 0.01f : 1.0f); } diff --git a/snd_main.c b/snd_main.c index 1fb7cd54..7788a774 100644 --- a/snd_main.c +++ b/snd_main.c @@ -1677,7 +1677,7 @@ static void S_PlaySfxOnChannel (sfx_t *sfx, channel_t *target_chan, unsigned int int S_StartSound_StartPosition_Flags (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float fvol, float attenuation, float startposition, int flags, float fspeed) { channel_t *target_chan, *check, *ch; - int ch_idx, startpos; + int ch_idx, startpos, i; if (snd_renderbuffer == NULL || sfx == NULL || nosound.integer) return -1; @@ -1693,6 +1693,9 @@ int S_StartSound_StartPosition_Flags (int entnum, int entchannel, sfx_t *sfx, ve { S_SetChannelVolume(ch_idx, fvol); S_SetChannelSpeed(ch_idx, fspeed); + for(i = 1; i > 0 && (i <= flags || i <= (int) channels[ch_idx].flags); i <<= 1) + if((flags ^ channels[ch_idx].flags) & i) + S_SetChannelFlag(ch_idx, i, flags & i); ch->distfade = attenuation / snd_soundradius.value; SND_Spatialize(ch, false); return ch_idx; diff --git a/sound.h b/sound.h index 28b0f0a0..512ae9cf 100644 --- a/sound.h +++ b/sound.h @@ -32,12 +32,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define DEFAULT_SOUND_PACKET_ATTENUATION 1.0 // Channel flags -#define CHANNELFLAG_NONE 0 -#define CHANNELFLAG_FORCELOOP (1 << 0) // force looping even if the sound is not looped -#define CHANNELFLAG_LOCALSOUND (1 << 1) // INTERNAL USE. Not settable by S_SetChannelFlag -#define CHANNELFLAG_PAUSED (1 << 2) -#define CHANNELFLAG_FULLVOLUME (1 << 3) // isn't affected by the general volume - +// These channel flags can be used for sound() builtins, with SOUNDFLAG_* names +#define CHANNELFLAG_NONE 0 +#define CHANNELFLAG_RELIABLE (1 << 0) // send as reliable message (only used on server) +#define CHANNELFLAG_FORCELOOP (1 << 1) // force looping even if the sound is not looped +#define CHANNELFLAG_LOCALSOUND (1 << 2) // INTERNAL USE. Not settable by S_SetChannelFlag +#define CHANNELFLAG_PAUSED (1 << 3) // pause status +#define CHANNELFLAG_FULLVOLUME (1 << 4) // isn't affected by the general volume // ==================================================================== // Types and variables @@ -74,9 +75,6 @@ void S_PurgeUnused (void); qboolean S_IsSoundPrecached (const sfx_t *sfx); sfx_t *S_FindName(const char *name); -// for sound() builtins -#define SOUNDFLAG_RELIABLE 1 - // these define the "engine" channel namespace #define CHAN_MIN_AUTO -128 #define CHAN_MAX_AUTO 0 diff --git a/svvm_cmds.c b/svvm_cmds.c index 053ae44a..ec7eac41 100644 --- a/svvm_cmds.c +++ b/svvm_cmds.c @@ -549,7 +549,7 @@ static void VM_SV_sound(prvm_prog_t *prog) flags = 0; if(channel >= 8 && channel <= 15) // weird QW feature { - flags |= SOUNDFLAG_RELIABLE; + flags |= CHANNELFLAG_RELIABLE; channel -= 8; } } @@ -576,7 +576,7 @@ static void VM_SV_sound(prvm_prog_t *prog) return; } - SV_StartSound (entity, channel, sample, volume, attenuation, flags & SOUNDFLAG_RELIABLE, pitchchange); + SV_StartSound (entity, channel, sample, volume, attenuation, flags & CHANNELFLAG_RELIABLE, pitchchange); } /*