diff --git a/source/common/menu/messagebox.cpp b/source/common/menu/messagebox.cpp index 134358930..c66a185b9 100644 --- a/source/common/menu/messagebox.cpp +++ b/source/common/menu/messagebox.cpp @@ -108,7 +108,7 @@ void DMessageBoxMenu::Init(DMenu *parent, const char *message, int messagemode, if (playsound) { //S_StopSound (CHAN_VOICE); - //S_Sound (CHAN_VOICE | CHAN_UI, "menu/prompt", snd_menuvolume, ATTN_NONE); + //S_Sound (CHAN_VOICE | CHANF_UI, "menu/prompt", snd_menuvolume, ATTN_NONE); } } @@ -283,7 +283,7 @@ bool DMessageBoxMenu::MenuEvent(int mkey, bool fromcontroller) { if ((mkey == MKEY_Up || mkey == MKEY_Down) && m_generic_messagebox) { - //S_Sound (CHAN_VOICE | CHAN_UI, "menu/cursor", snd_menuvolume, ATTN_NONE); + //S_Sound (CHAN_VOICE | CHANF_UI, "menu/cursor", snd_menuvolume, ATTN_NONE); messageSelection = !messageSelection; return true; } diff --git a/source/common/sound/backend/i_soundinternal.h b/source/common/sound/backend/i_soundinternal.h index 1203012dd..aac498b00 100644 --- a/source/common/sound/backend/i_soundinternal.h +++ b/source/common/sound/backend/i_soundinternal.h @@ -8,6 +8,32 @@ #include "tarray.h" #include "zmusic/sounddecoder.h" #include "../../libraries/music_common/fileio.h" +#include "tflags.h" + +enum EChanFlag +{ + // modifier flags + CHANF_LISTENERZ = 8, + CHANF_MAYBE_LOCAL = 16, + CHANF_UI = 32, // Do not record sound in savegames. + CHANF_NOPAUSE = 64, // Do not pause this sound in menus. + CHANF_AREA = 128, // Sound plays from all around. Only valid with sector sounds. + CHANF_LOOP = 256, + + CHANF_PICKUP = CHANF_MAYBE_LOCAL, + + CHANF_IS3D = 1, // internal: Sound is 3D. + CHANF_EVICTED = 2, // internal: Sound was evicted. + CHANF_FORGETTABLE = 4, // internal: Forget channel data when sound stops. + CHANF_JUSTSTARTED = 512, // internal: Sound has not been updated yet. + CHANF_ABSTIME = 1024, // internal: Start time is absolute and does not depend on current time. + CHANF_VIRTUAL = 2048, // internal: Channel is currently virtual + CHANF_NOSTOP = 4096, // only for A_PlaySound. Does not start if channel is playing something. + CHANF_OVERLAP = 8192, // [MK] Does not stop any sounds in the channel and instead plays over them. +}; + +typedef TFlags EChanFlags; +DEFINE_TFLAGS_OPERATORS(EChanFlags) class FileReader; @@ -112,7 +138,7 @@ struct FISoundChannel float DistanceScale; float DistanceSqr; bool ManualRolloff; - int ChanFlags; + EChanFlags ChanFlags; }; @@ -122,4 +148,5 @@ class SoundStream; + #endif diff --git a/source/common/sound/backend/oalsound.cpp b/source/common/sound/backend/oalsound.cpp index aaeb0529a..2f8157efa 100644 --- a/source/common/sound/backend/oalsound.cpp +++ b/source/common/sound/backend/oalsound.cpp @@ -1672,7 +1672,7 @@ void OpenALSoundRenderer::ChannelPitch(FISoundChannel *chan, float pitch) alDeferUpdatesSOFT(); ALuint source = GET_PTRID(chan->SysChannel); - if (WasInWater && !(chan->ChanFlags & CHAN_UI)) + if (WasInWater && !(chan->ChanFlags & CHANF_UI)) alSourcef(source, AL_PITCH, std::max(pitch, 0.0001f)*PITCH_MULT); else alSourcef(source, AL_PITCH, std::max(pitch, 0.0001f)); @@ -1950,7 +1950,7 @@ void OpenALSoundRenderer::UpdateListener(SoundListener *listener) while (schan) { ALuint source = GET_PTRID(schan->SysChannel); - if (source && !(schan->ChanFlags & CHAN_UI)) + if (source && !(schan->ChanFlags & CHANF_UI)) { alSourcei(source, AL_DIRECT_FILTER, EnvFilters[0]); alSource3i(source, AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]); @@ -1963,7 +1963,7 @@ void OpenALSoundRenderer::UpdateListener(SoundListener *listener) while (schan) { ALuint source = GET_PTRID(schan->SysChannel); - if (source && !(schan->ChanFlags & CHAN_UI)) + if (source && !(schan->ChanFlags & CHANF_UI)) alSourcef(source, AL_PITCH, schan->Pitch / 128.0f * PITCH_MULT); schan = schan->NextChan; } @@ -1988,7 +1988,7 @@ void OpenALSoundRenderer::UpdateListener(SoundListener *listener) while (schan) { ALuint source = GET_PTRID(schan->SysChannel); - if (source && !(schan->ChanFlags & CHAN_UI)) + if (source && !(schan->ChanFlags & CHANF_UI)) { alSourcei(source, AL_DIRECT_FILTER, EnvFilters[0]); alSource3i(source, AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]); @@ -2001,7 +2001,7 @@ void OpenALSoundRenderer::UpdateListener(SoundListener *listener) while (schan) { ALuint source = GET_PTRID(schan->SysChannel); - if (source && !(schan->ChanFlags & CHAN_UI)) + if (source && !(schan->ChanFlags & CHANF_UI)) alSourcef(source, AL_PITCH, schan->Pitch / 128.0f); schan = schan->NextChan; } diff --git a/source/common/sound/s_sound.cpp b/source/common/sound/s_sound.cpp index 3b923a7f8..28fe3a6d0 100644 --- a/source/common/sound/s_sound.cpp +++ b/source/common/sound/s_sound.cpp @@ -285,7 +285,7 @@ TArray SoundEngine::AllActiveChannels() // If the sound is forgettable, this is as good a time as // any to forget about it. And if it's a UI sound, it shouldn't // be stored in the savegame. - if (!(chan->ChanFlags & (CHAN_FORGETTABLE | CHAN_UI))) + if (!(chan->ChanFlags & (CHANF_FORGETTABLE | CHANF_UI))) { chans.Push(chan); } @@ -306,7 +306,7 @@ FString SoundEngine::ListSoundChannels() int count = 0; for (chan = Channels; chan != nullptr; chan = chan->NextChan) { - if (!(chan->ChanFlags & CHAN_EVICTED)) + if (!(chan->ChanFlags & CHANF_EVICTED)) { FVector3 chanorigin; @@ -376,11 +376,11 @@ FSoundID SoundEngine::ResolveSound(const void *, int, FSoundID soundid, float &a //========================================================================== FSoundChan *SoundEngine::StartSound(int type, const void *source, - const FVector3 *pt, int channel, FSoundID sound_id, float volume, float attenuation, + const FVector3 *pt, int channel, EChanFlags flags, FSoundID sound_id, float volume, float attenuation, FRolloffInfo *forcedrolloff, float spitch) { sfxinfo_t *sfx; - int chanflags; + EChanFlags chanflags = flags; int basepriority; int org_id; int pitch; @@ -396,8 +396,6 @@ FSoundChan *SoundEngine::StartSound(int type, const void *source, if (type == SOURCE_Unattached && pt == nullptr) type = SOURCE_None; org_id = sound_id; - chanflags = channel & ~7; - channel &= 7; CalcPosVel(type, source, &pt->X, channel, chanflags, sound_id, &pos, &vel); @@ -461,7 +459,7 @@ FSoundChan *SoundEngine::StartSound(int type, const void *source, // If this is a singular sound, don't play it if it's already playing. if (sfx->bSingular && CheckSingular(sound_id)) { - chanflags |= CHAN_EVICTED; + chanflags |= CHANF_EVICTED; } // If the sound is unpositioned or comes from the listener, it is @@ -475,13 +473,13 @@ FSoundChan *SoundEngine::StartSound(int type, const void *source, // that's what would happen. (Does this really need the SOURCE_Actor restriction?) if (near_limit > 0 && CheckSoundLimit(sfx, pos, near_limit, limit_range, type, type == SOURCE_Actor? source : nullptr, channel)) { - chanflags |= CHAN_EVICTED; + chanflags |= CHANF_EVICTED; } // If the sound is blocked and not looped, return now. If the sound // is blocked and looped, pretend to play it so that it can // eventually play for real. - if ((chanflags & (CHAN_EVICTED | CHAN_LOOP)) == CHAN_EVICTED) + if ((chanflags & (CHANF_EVICTED | CHANF_LOOP)) == CHANF_EVICTED) { return NULL; } @@ -531,7 +529,7 @@ FSoundChan *SoundEngine::StartSound(int type, const void *source, } // If this actor is already playing something on the selected channel, stop it. - if (type != SOURCE_None && ((source == NULL && channel != CHAN_AUTO) || (source != NULL && IsChannelUsed(type, source, channel, &seen)))) + if (!(chanflags & CHANF_OVERLAP) && type != SOURCE_None && ((source == NULL && channel != CHAN_AUTO) || (source != NULL && IsChannelUsed(type, source, channel, &seen)))) { for (chan = Channels; chan != NULL; chan = chan->NextChan) { @@ -552,7 +550,7 @@ FSoundChan *SoundEngine::StartSound(int type, const void *source, // sound is paused and a non-looped sound is being started. // Such a sound would play right after unpausing which wouldn't sound right. - if (!(chanflags & CHAN_LOOP) && !(chanflags & (CHAN_UI|CHAN_NOPAUSE)) && SoundPaused) + if (!(chanflags & CHANF_LOOP) && !(chanflags & (CHANF_UI|CHANF_NOPAUSE)) && SoundPaused) { return NULL; } @@ -567,17 +565,17 @@ FSoundChan *SoundEngine::StartSound(int type, const void *source, pitch = DEFAULT_PITCH; } - if (chanflags & CHAN_EVICTED) + if (chanflags & CHANF_EVICTED) { chan = NULL; } else { int startflags = 0; - if (chanflags & CHAN_LOOP) startflags |= SNDF_LOOP; - if (chanflags & CHAN_AREA) startflags |= SNDF_AREA; - if (chanflags & (CHAN_UI|CHAN_NOPAUSE)) startflags |= SNDF_NOPAUSE; - if (chanflags & CHAN_UI) startflags |= SNDF_NOREVERB; + if (chanflags & CHANF_LOOP) startflags |= SNDF_LOOP; + if (chanflags & CHANF_AREA) startflags |= SNDF_AREA; + if (chanflags & (CHANF_UI|CHANF_NOPAUSE)) startflags |= SNDF_NOPAUSE; + if (chanflags & CHANF_UI) startflags |= SNDF_NOREVERB; if (attenuation > 0) { @@ -589,19 +587,19 @@ FSoundChan *SoundEngine::StartSound(int type, const void *source, chan = (FSoundChan*)GSnd->StartSound (sfx->data, float(volume), pitch, startflags, NULL); } } - if (chan == NULL && (chanflags & CHAN_LOOP)) + if (chan == NULL && (chanflags & CHANF_LOOP)) { chan = (FSoundChan*)GetChannel(NULL); GSnd->MarkStartTime(chan); - chanflags |= CHAN_EVICTED; + chanflags |= CHANF_EVICTED; } if (attenuation > 0) { - chanflags |= CHAN_IS3D | CHAN_JUSTSTARTED; + chanflags |= CHANF_IS3D | CHANF_JUSTSTARTED; } else { - chanflags |= CHAN_LISTENERZ | CHAN_JUSTSTARTED; + chanflags |= CHANF_LISTENERZ | CHANF_JUSTSTARTED; } if (chan != NULL) { @@ -642,7 +640,7 @@ FSoundChan *SoundEngine::StartSound(int type, const void *source, void SoundEngine::RestartChannel(FSoundChan *chan) { - assert(chan->ChanFlags & CHAN_EVICTED); + assert(chan->ChanFlags & CHANF_EVICTED); FSoundChan *ochan; sfxinfo_t *sfx = &S_sfx[chan->SoundID]; @@ -660,15 +658,15 @@ void SoundEngine::RestartChannel(FSoundChan *chan) return; } - int oldflags = chan->ChanFlags; + EChanFlags oldflags = chan->ChanFlags; int startflags = 0; - if (chan->ChanFlags & CHAN_LOOP) startflags |= SNDF_LOOP; - if (chan->ChanFlags & CHAN_AREA) startflags |= SNDF_AREA; - if (chan->ChanFlags & (CHAN_UI|CHAN_NOPAUSE)) startflags |= SNDF_NOPAUSE; - if (chan->ChanFlags & CHAN_ABSTIME) startflags |= SNDF_ABSTIME; + if (chan->ChanFlags & CHANF_LOOP) startflags |= SNDF_LOOP; + if (chan->ChanFlags & CHANF_AREA) startflags |= SNDF_AREA; + if (chan->ChanFlags & (CHANF_UI|CHANF_NOPAUSE)) startflags |= SNDF_NOPAUSE; + if (chan->ChanFlags & CHANF_ABSTIME) startflags |= SNDF_ABSTIME; - if (chan->ChanFlags & CHAN_IS3D) + if (chan->ChanFlags & CHANF_IS3D) { FVector3 pos, vel; @@ -687,13 +685,13 @@ void SoundEngine::RestartChannel(FSoundChan *chan) } LoadSound3D(sfx, &SoundBuffer); - chan->ChanFlags &= ~(CHAN_EVICTED|CHAN_ABSTIME); + chan->ChanFlags &= ~(CHANF_EVICTED|CHANF_ABSTIME); ochan = (FSoundChan*)GSnd->StartSound3D(sfx->data3d, &listener, chan->Volume, &chan->Rolloff, chan->DistanceScale, chan->Pitch, chan->Priority, pos, vel, chan->EntChannel, startflags, chan); } else { - chan->ChanFlags &= ~(CHAN_EVICTED|CHAN_ABSTIME); + chan->ChanFlags &= ~(CHANF_EVICTED|CHANF_ABSTIME); ochan = (FSoundChan*)GSnd->StartSound(sfx->data, chan->Volume, chan->Pitch, startflags, chan); } assert(ochan == NULL || ochan == chan); @@ -884,7 +882,7 @@ bool SoundEngine::CheckSoundLimit(sfxinfo_t *sfx, const FVector3 &pos, int near_ for (chan = Channels, count = 0; chan != NULL && count < near_limit; chan = chan->NextChan) { - if (!(chan->ChanFlags & CHAN_EVICTED) && &S_sfx[chan->SoundID] == sfx) + if (!(chan->ChanFlags & CHANF_EVICTED) && &S_sfx[chan->SoundID] == sfx) { FVector3 chanorigin; @@ -940,7 +938,7 @@ void SoundEngine::StopSound (int channel, int sound_id) while (chan != NULL) { FSoundChan *next = chan->NextChan; - if (chan->SourceType == SOURCE_None && (sound_id == -1 || sound_id == chan->OrgID)) + if ((chan->SourceType == SOURCE_None && (sound_id == -1 || sound_id == chan->OrgID)) && (channel == CHAN_AUTO || channel == chan->EntChannel)) { StopChannel(chan); } @@ -1015,7 +1013,7 @@ void SoundEngine::RelinkSound (int sourcetype, const void *from, const void *to, { chan->Source = to; } - else if (!(chan->ChanFlags & CHAN_LOOP) && optpos) + else if (!(chan->ChanFlags & CHANF_LOOP) && optpos) { chan->Source = NULL; chan->SourceType = SOURCE_Unattached; @@ -1183,15 +1181,15 @@ void SoundEngine::EvictAllChannels() { next = chan->NextChan; - if (!(chan->ChanFlags & CHAN_EVICTED)) + if (!(chan->ChanFlags & CHANF_EVICTED)) { - chan->ChanFlags |= CHAN_EVICTED; + chan->ChanFlags |= CHANF_EVICTED; if (chan->SysChannel != NULL) { - if (!(chan->ChanFlags & CHAN_ABSTIME)) + if (!(chan->ChanFlags & CHANF_ABSTIME)) { chan->StartTime = GSnd ? GSnd->GetPosition(chan) : 0; - chan->ChanFlags |= CHAN_ABSTIME; + chan->ChanFlags |= CHANF_ABSTIME; } StopChannel(chan); } @@ -1215,22 +1213,22 @@ void SoundEngine::RestoreEvictedChannel(FSoundChan *chan) return; } RestoreEvictedChannel(chan->NextChan); - if (chan->ChanFlags & CHAN_EVICTED) + if (chan->ChanFlags & CHANF_EVICTED) { RestartChannel(chan); - if (!(chan->ChanFlags & CHAN_LOOP)) + if (!(chan->ChanFlags & CHANF_LOOP)) { - if (chan->ChanFlags & CHAN_EVICTED) + if (chan->ChanFlags & CHANF_EVICTED) { // Still evicted and not looping? Forget about it. ReturnChannel(chan); } - else if (!(chan->ChanFlags & CHAN_JUSTSTARTED)) + else if (!(chan->ChanFlags & CHANF_JUSTSTARTED)) { // Should this sound become evicted again, it's okay to forget about it. - chan->ChanFlags |= CHAN_FORGETTABLE; + chan->ChanFlags |= CHANF_FORGETTABLE; } } } - else if (chan->SysChannel == NULL && (chan->ChanFlags & (CHAN_FORGETTABLE | CHAN_LOOP)) == CHAN_FORGETTABLE) + else if (chan->SysChannel == NULL && (chan->ChanFlags & (CHANF_FORGETTABLE | CHANF_LOOP)) == CHANF_FORGETTABLE) { ReturnChannel(chan); } @@ -1264,16 +1262,16 @@ void SoundEngine::UpdateSounds(int time) for (FSoundChan* chan = Channels; chan != NULL; chan = chan->NextChan) { - if ((chan->ChanFlags & (CHAN_EVICTED | CHAN_IS3D)) == CHAN_IS3D) + if ((chan->ChanFlags & (CHANF_EVICTED | CHANF_IS3D)) == CHANF_IS3D) { CalcPosVel(chan, &pos, &vel); if (ValidatePosVel(chan, pos, vel)) { - GSnd->UpdateSoundParams3D(&listener, chan, !!(chan->ChanFlags & CHAN_AREA), pos, vel); + GSnd->UpdateSoundParams3D(&listener, chan, !!(chan->ChanFlags & CHANF_AREA), pos, vel); } } - chan->ChanFlags &= ~CHAN_JUSTSTARTED; + chan->ChanFlags &= ~CHANF_JUSTSTARTED; } GSnd->UpdateListener(&listener); @@ -1342,11 +1340,11 @@ void SoundEngine::ChannelEnded(FISoundChannel *ichan) // it wasn't evicted. Otherwise, if it's looping, it must have // been evicted. If it's not looping, then it was evicted if it // didn't reach the end of its playback. - if (schan->ChanFlags & CHAN_FORGETTABLE) + if (schan->ChanFlags & CHANF_FORGETTABLE) { evicted = false; } - else if (schan->ChanFlags & (CHAN_LOOP | CHAN_EVICTED)) + else if (schan->ChanFlags & (CHANF_LOOP | CHANF_EVICTED)) { evicted = true; } @@ -1356,7 +1354,7 @@ void SoundEngine::ChannelEnded(FISoundChannel *ichan) unsigned int len = GSnd->GetSampleLength(S_sfx[schan->SoundID].data); if (pos == 0) { - evicted = !!(schan->ChanFlags & CHAN_JUSTSTARTED); + evicted = !!(schan->ChanFlags & CHANF_JUSTSTARTED); } else { @@ -1369,7 +1367,7 @@ void SoundEngine::ChannelEnded(FISoundChannel *ichan) } else { - schan->ChanFlags |= CHAN_EVICTED; + schan->ChanFlags |= CHANF_EVICTED; schan->SysChannel = NULL; } } @@ -1386,11 +1384,11 @@ void SoundEngine::ChannelVirtualChanged(FISoundChannel *ichan, bool is_virtual) FSoundChan *schan = static_cast(ichan); if (is_virtual) { - schan->ChanFlags |= CHAN_VIRTUAL; + schan->ChanFlags |= CHANF_VIRTUAL; } else { - schan->ChanFlags &= ~CHAN_VIRTUAL; + schan->ChanFlags &= ~CHANF_VIRTUAL; } } @@ -1409,9 +1407,9 @@ void SoundEngine::StopChannel(FSoundChan *chan) { // S_EvictAllChannels() will set the CHAN_EVICTED flag to indicate // that it wants to keep all the channel information around. - if (!(chan->ChanFlags & CHAN_EVICTED)) + if (!(chan->ChanFlags & CHANF_EVICTED)) { - chan->ChanFlags |= CHAN_FORGETTABLE; + chan->ChanFlags |= CHANF_FORGETTABLE; if (chan->SourceType == SOURCE_Actor) { chan->Source = NULL; @@ -1736,7 +1734,7 @@ FString SoundEngine::NoiseDebug() for (auto chan = Channels; chan; chan = chan->NextChan) { - if (!(chan->ChanFlags & CHAN_IS3D)) + if (!(chan->ChanFlags & CHANF_IS3D)) { out += "--- --- --- --- "; } @@ -1746,15 +1744,15 @@ FString SoundEngine::NoiseDebug() out.AppendFormat(TEXTCOLOR_GOLD "%5.0f | %5.0f | %5.0f | %5.0f ", origin.X, origin.Z, origin.Y, (origin - listener).Length()); } out.AppendFormat("%-.2g %-4d %-4d %s3%sZ%sU%sM%sN%sA%sL%sE%sV" TEXTCOLOR_GOLD " %-5.4f %-4u %d: %s\n", chan->Volume, chan->EntChannel, chan->Priority, - (chan->ChanFlags & CHAN_IS3D) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, - (chan->ChanFlags & CHAN_LISTENERZ) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, - (chan->ChanFlags & CHAN_UI) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, - (chan->ChanFlags & CHAN_MAYBE_LOCAL) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, - (chan->ChanFlags & CHAN_NOPAUSE) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, - (chan->ChanFlags & CHAN_AREA) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, - (chan->ChanFlags & CHAN_LOOP) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, - (chan->ChanFlags & CHAN_EVICTED) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, - (chan->ChanFlags & CHAN_VIRTUAL) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, + (chan->ChanFlags & CHANF_IS3D) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, + (chan->ChanFlags & CHANF_LISTENERZ) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, + (chan->ChanFlags & CHANF_UI) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, + (chan->ChanFlags & CHANF_MAYBE_LOCAL) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, + (chan->ChanFlags & CHANF_NOPAUSE) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, + (chan->ChanFlags & CHANF_AREA) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, + (chan->ChanFlags & CHANF_LOOP) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, + (chan->ChanFlags & CHANF_EVICTED) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, + (chan->ChanFlags & CHANF_VIRTUAL) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK, GSnd->GetAudibility(chan), GSnd->GetPosition(chan), ((int)chan->OrgID)-1, S_sfx[chan->SoundID].name.GetChars()); ch++; } diff --git a/source/common/sound/s_soundinternal.h b/source/common/sound/s_soundinternal.h index aa3ac98f1..fe8712d36 100644 --- a/source/common/sound/s_soundinternal.h +++ b/source/common/sound/s_soundinternal.h @@ -192,43 +192,20 @@ struct FSoundChan : public FISoundChannel // CHAN_BODY is for generic body sounds // CHAN_PICKUP can optionally be set as a local sound only for "compatibility" -enum +enum EChannel { - CHAN_AUTO = 0, - CHAN_WEAPON = 1, - CHAN_VOICE = 2, - CHAN_ITEM = 3, - CHAN_BODY = 4, - CHAN_5 = 5, - CHAN_6 = 6, - CHAN_7 = 7, - - // Channel alias for sector sounds. These define how listener height is - // used when calculating 3D sound volume. - CHAN_FLOOR = 1, // Sound comes from the floor. - CHAN_CEILING = 2, // Sound comes from the ceiling. - CHAN_FULLHEIGHT = 3, // Sound comes entire height of the sector. - CHAN_INTERIOR = 4, // Sound comes height between floor and ceiling. - - // modifier flags - CHAN_LISTENERZ = 8, - CHAN_MAYBE_LOCAL = 16, - CHAN_UI = 32, // Do not record sound in savegames. - CHAN_NOPAUSE = 64, // Do not pause this sound in menus. - CHAN_AREA = 128, // Sound plays from all around. Only valid with sector sounds. - CHAN_LOOP = 256, - - CHAN_PICKUP = (CHAN_ITEM|CHAN_MAYBE_LOCAL), - - CHAN_IS3D = 1, // internal: Sound is 3D. - CHAN_EVICTED = 2, // internal: Sound was evicted. - CHAN_FORGETTABLE = 4, // internal: Forget channel data when sound stops. - CHAN_JUSTSTARTED = 512, // internal: Sound has not been updated yet. - CHAN_ABSTIME = 1024, // internal: Start time is absolute and does not depend on current time. - CHAN_VIRTUAL = 2048, // internal: Channel is currently virtual - CHAN_NOSTOP = 4096, // only for A_PlaySound. Does not start if channel is playing something. + CHAN_AUTO = 0, + CHAN_WEAPON = 1, + CHAN_VOICE = 2, + CHAN_ITEM = 3, + CHAN_BODY = 4, + CHAN_5 = 5, + CHAN_6 = 6, + CHAN_7 = 7, }; + + // sound attenuation values #define ATTN_NONE 0.f // full volume the entire level #define ATTN_NORM 1.f @@ -327,7 +304,7 @@ public: void UpdateSounds(int time); FSoundChan* StartSound(int sourcetype, const void* source, - const FVector3* pt, int channel, FSoundID sound_id, float volume, float attenuation, FRolloffInfo* rolloff = nullptr, float spitch = 0.0f); + const FVector3* pt, int channel, EChanFlags flags, FSoundID sound_id, float volume, float attenuation, FRolloffInfo* rolloff = nullptr, float spitch = 0.0f); // Stops an origin-less sound from playing from this channel. void StopSoundID(int sound_id); diff --git a/source/common/utility/tflags.h b/source/common/utility/tflags.h new file mode 100644 index 000000000..98516fce8 --- /dev/null +++ b/source/common/utility/tflags.h @@ -0,0 +1,108 @@ +/* +** tflags.h +** +**--------------------------------------------------------------------------- +** Copyright 2015 Teemu Piippo +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +#pragma once + +/* + * TFlags + * + * A Qt-inspired type-safe flagset type. + * + * T is the enum type of individual flags, + * TT is the underlying integer type used (defaults to uint32_t) + */ +template +class TFlags +{ + struct ZeroDummy {}; + +public: + typedef TFlags Self; + typedef T EnumType; + typedef TT IntType; + + TFlags() = default; + TFlags(const Self& other) = default; + TFlags (T value) : Value (static_cast (value)) {} + + // This allows initializing the flagset with 0, as 0 implicitly converts into a null pointer. + TFlags (ZeroDummy*) : Value (0) {} + + // Relation operators + Self operator| (Self other) const { return Self::FromInt (Value | other.GetValue()); } + Self operator& (Self other) const { return Self::FromInt (Value & other.GetValue()); } + Self operator^ (Self other) const { return Self::FromInt (Value ^ other.GetValue()); } + Self operator| (T value) const { return Self::FromInt (Value | value); } + Self operator& (T value) const { return Self::FromInt (Value & value); } + Self operator^ (T value) const { return Self::FromInt (Value ^ value); } + Self operator~() const { return Self::FromInt (~Value); } + + // Assignment operators + Self& operator= (Self other) { Value = other.GetValue(); return *this; } + Self& operator|= (Self other) { Value |= other.GetValue(); return *this; } + Self& operator&= (Self other) { Value &= other.GetValue(); return *this; } + Self& operator^= (Self other) { Value ^= other.GetValue(); return *this; } + Self& operator= (T value) { Value = value; return *this; } + Self& operator|= (T value) { Value |= value; return *this; } + Self& operator&= (T value) { Value &= value; return *this; } + Self& operator^= (T value) { Value ^= value; return *this; } + + // Access the value of the flagset + TT GetValue() const { return Value; } + operator TT() const { return Value; } + + // Set the value of the flagset manually with an integer. + // Please think twice before using this. + static Self FromInt (TT value) { return Self (static_cast (value)); } + +private: + template Self operator| (X value) const { return Self::FromInt (Value | value); } + template Self operator& (X value) const { return Self::FromInt (Value & value); } + template Self operator^ (X value) const { return Self::FromInt (Value ^ value); } + +public: // to be removed. + TT Value; +}; + +/* + * Additional operators for TFlags types. + */ +#define DEFINE_TFLAGS_OPERATORS(T) \ +inline T operator| (T::EnumType a, T::EnumType b) { return T::FromInt (T::IntType (a) | T::IntType (b)); } \ +inline T operator& (T::EnumType a, T::EnumType b) { return T::FromInt (T::IntType (a) & T::IntType (b)); } \ +inline T operator^ (T::EnumType a, T::EnumType b) { return T::FromInt (T::IntType (a) ^ T::IntType (b)); } \ +inline T operator| (T::EnumType a, T b) { return T::FromInt (T::IntType (a) | T::IntType (b)); } \ +inline T operator& (T::EnumType a, T b) { return T::FromInt (T::IntType (a) & T::IntType (b)); } \ +inline T operator^ (T::EnumType a, T b) { return T::FromInt (T::IntType (a) ^ T::IntType (b)); } \ +inline T operator~ (T::EnumType a) { return T::FromInt (~T::IntType (a)); } + diff --git a/source/duke3d/src/actors.cpp b/source/duke3d/src/actors.cpp index 0c804b3f3..b298cdff5 100644 --- a/source/duke3d/src/actors.cpp +++ b/source/duke3d/src/actors.cpp @@ -1527,7 +1527,7 @@ ACTOR_STATIC void G_MoveFX(void) goto next_sprite; } #endif - A_PlaySound(pSprite->lotag,spriteNum, CHAN_LOOP); + A_PlaySound(pSprite->lotag,spriteNum, CHAN_AUTO, CHANF_LOOP); T1(spriteNum) = 1; // AMBIENT_SFX_PLAYING } else if (playerDist >= spriteHitag && T1(spriteNum) == 1) diff --git a/source/duke3d/src/anim.cpp b/source/duke3d/src/anim.cpp index f92bae3f6..76e74dd8e 100644 --- a/source/duke3d/src/anim.cpp +++ b/source/duke3d/src/anim.cpp @@ -364,7 +364,7 @@ int32_t Anim_Play(const char *fn) if (sound == -1) FX_StopAllSounds(); else - S_PlaySound(sound, CHAN_UI); + S_PlaySound(sound, CHAN_AUTO, CHANF_UI); soundidx++; } @@ -378,7 +378,7 @@ int32_t Anim_Play(const char *fn) if (sound == -1) FX_StopAllSounds(); else - S_PlaySound(sound, CHAN_UI); + S_PlaySound(sound, CHAN_AUTO, CHANF_UI); soundidx++; } @@ -536,7 +536,7 @@ int32_t Anim_Play(const char *fn) if (sound == -1) FX_StopAllSounds(); else - S_PlaySound(sound, CHAN_UI); + S_PlaySound(sound, CHAN_AUTO, CHANF_UI); soundidx++; } diff --git a/source/duke3d/src/d_menu.cpp b/source/duke3d/src/d_menu.cpp index 50d42d6af..d113a82e6 100644 --- a/source/duke3d/src/d_menu.cpp +++ b/source/duke3d/src/d_menu.cpp @@ -481,15 +481,15 @@ void GameInterface::MenuSound(EMenuSounds snd) switch (snd) { case CursorSound: - S_PlaySound(KICK_HIT, CHAN_UI); + S_PlaySound(KICK_HIT, CHAN_AUTO, CHANF_UI); break; case AdvanceSound: - S_PlaySound(PISTOL_BODYHIT, CHAN_UI); + S_PlaySound(PISTOL_BODYHIT, CHAN_AUTO, CHANF_UI); break; case CloseSound: - S_PlaySound(EXITMENUSOUND, CHAN_UI); + S_PlaySound(EXITMENUSOUND, CHAN_AUTO, CHANF_UI); break; default: @@ -570,7 +570,7 @@ void GameInterface::StartGame(FGameStartup& gs) ud.m_player_skill = gs.Skill + 1; if (menu_sounds && skillsound >= 0 && SoundEnabled()) { - S_PlaySound(skillsound, CHAN_UI); + S_PlaySound(skillsound, CHAN_AUTO, CHANF_UI); while (S_CheckSoundPlaying(skillsound)) { diff --git a/source/duke3d/src/game.cpp b/source/duke3d/src/game.cpp index 5c3385db2..b42bc44f4 100644 --- a/source/duke3d/src/game.cpp +++ b/source/duke3d/src/game.cpp @@ -4400,7 +4400,7 @@ int G_StartRTS(int lumpNum, int localPlayer) auto sid = RTS_GetSoundID(lumpNum - 1); if (sid != -1) { - S_PlaySound(sid, CHAN_UI); + S_PlaySound(sid, CHAN_AUTO, CHANF_UI); g_RTSPlaying = 7; return 1; } @@ -4490,7 +4490,7 @@ void G_HandleLocalKeys(void) { if (G_ChangeHudLayout(1)) { - S_PlaySound(THUD, CHAN_UI); + S_PlaySound(THUD, CHAN_AUTO, CHANF_UI); } } else @@ -4509,7 +4509,7 @@ void G_HandleLocalKeys(void) { if (G_ChangeHudLayout(-1)) { - S_PlaySound(THUD, CHAN_UI); + S_PlaySound(THUD, CHAN_AUTO, CHANF_UI); } } else diff --git a/source/duke3d/src/gameexec.cpp b/source/duke3d/src/gameexec.cpp index 3a4c49080..ac814d405 100644 --- a/source/duke3d/src/gameexec.cpp +++ b/source/duke3d/src/gameexec.cpp @@ -4125,7 +4125,7 @@ badindex: if (S_CheckSoundPlaying(soundNum)) S_StopSound((int16_t)soundNum); dispatch(); - case CON_SCREENSOUND: S_PlaySound(soundNum, CHAN_UI); dispatch(); + case CON_SCREENSOUND: S_PlaySound(soundNum, CHAN_AUTO, CHANF_UI); dispatch(); } } dispatch(); diff --git a/source/duke3d/src/sounds.cpp b/source/duke3d/src/sounds.cpp index c692cf335..4f4d2b7c8 100644 --- a/source/duke3d/src/sounds.cpp +++ b/source/duke3d/src/sounds.cpp @@ -299,7 +299,7 @@ void DukeSoundEngine::CalcPosVel(int type, const void* source, const float pt[3] */ } } - if ((chanflags & CHAN_LISTENERZ) && campos != nullptr && type != SOURCE_None) + if ((chanflags & CHANF_LISTENERZ) && campos != nullptr && type != SOURCE_None) { pos->Y = campos->z / 256.f; } @@ -354,7 +354,7 @@ void S_Update(void) // //========================================================================== -int S_PlaySound3D(int num, int spriteNum, const vec3_t* pos, int flags) +int S_PlaySound3D(int num, int spriteNum, const vec3_t* pos, int channel, EChanFlags flags) { int sndnum = VM_OnEventWithReturn(EVENT_SOUND, spriteNum, screenpeek, num); @@ -443,8 +443,8 @@ int S_PlaySound3D(int num, int spriteNum, const vec3_t* pos, int flags) if (explosionp) attenuation = 0.5f; else attenuation = (userflags & (SF_GLOBAL | SF_DTAG)) == SF_GLOBAL ? ATTN_NONE : ATTN_NORM; - if (userflags & SF_LOOP) flags |= CHAN_LOOP; - auto chan = soundEngine->StartSound(SOURCE_Actor, &sprite[spriteNum], &sndpos, flags, sndnum+1, attenuation == ATTN_NONE? 0.8f : 1.f, attenuation, nullptr, S_ConvertPitch(pitch)); + if (userflags & SF_LOOP) flags |= CHANF_LOOP; + auto chan = soundEngine->StartSound(SOURCE_Actor, &sprite[spriteNum], &sndpos, channel, flags, sndnum+1, attenuation == ATTN_NONE? 0.8f : 1.f, attenuation, nullptr, S_ConvertPitch(pitch)); return chan ? 0 : -1; } @@ -454,7 +454,7 @@ int S_PlaySound3D(int num, int spriteNum, const vec3_t* pos, int flags) // //========================================================================== -int S_PlaySound(int num, int flags) +int S_PlaySound(int num, int channel, EChanFlags flags) { int sndnum = VM_OnEventWithReturn(EVENT_SOUND, g_player[screenpeek].ps->i, screenpeek, num); @@ -466,8 +466,8 @@ int S_PlaySound(int num, int flags) int const pitch = S_GetPitch(sndnum); - if (userflags & SF_LOOP) flags |= CHAN_LOOP; - auto chan = soundEngine->StartSound(SOURCE_None, nullptr, nullptr, flags, sndnum + 1, 0.8f, ATTN_NONE, nullptr, S_ConvertPitch(pitch)); + if (userflags & SF_LOOP) flags |= CHANF_LOOP; + auto chan = soundEngine->StartSound(SOURCE_None, nullptr, nullptr, channel, flags, sndnum + 1, 0.8f, ATTN_NONE, nullptr, S_ConvertPitch(pitch)); return chan ? 0 : -1; } @@ -477,19 +477,19 @@ int S_PlaySound(int num, int flags) // //========================================================================== -int A_PlaySound(int soundNum, int spriteNum, int flags) +int A_PlaySound(int soundNum, int spriteNum, int channel, EChanFlags flags) { return (unsigned)spriteNum >= MAXSPRITES ? S_PlaySound(soundNum, flags) : S_PlaySound3D(soundNum, spriteNum, &sprite[spriteNum].pos, flags); } -void S_StopEnvSound(int sndNum, int sprNum, int flags) +void S_StopEnvSound(int sndNum, int sprNum, int channel) { if (sprNum < -1 || sprNum >= MAXSPRITES) return; if (sprNum == -1) soundEngine->StopSoundID(sndNum+1); - else if (flags == -1) soundEngine->StopSound(SOURCE_Actor, &sprite[sprNum], -1, sndNum+1); - else soundEngine->StopSound(SOURCE_Actor, &sprite[sprNum], flags, -1); + else if (channel == -1) soundEngine->StopSound(SOURCE_Actor, &sprite[sprNum], -1, sndNum+1); + else soundEngine->StopSound(SOURCE_Actor, &sprite[sprNum], channel, -1); } void S_ChangeSoundPitch(int soundNum, int spriteNum, int pitchoffset) @@ -512,11 +512,11 @@ void S_ChangeSoundPitch(int soundNum, int spriteNum, int pitchoffset) // //========================================================================== -int A_CheckSoundPlaying(int spriteNum, int soundNum, int flags) +int A_CheckSoundPlaying(int spriteNum, int soundNum, int channel) { if (spriteNum == -1) return soundEngine->GetSoundPlayingInfo(SOURCE_Any, nullptr, soundNum+1); if ((unsigned)spriteNum >= MAXSPRITES) return false; - return soundEngine->IsSourcePlayingSomething(SOURCE_Actor, &sprite[spriteNum], flags, soundNum+1); + return soundEngine->IsSourcePlayingSomething(SOURCE_Actor, &sprite[spriteNum], channel, soundNum+1); } // Check if actor is playing any sound. diff --git a/source/duke3d/src/sounds.h b/source/duke3d/src/sounds.h index ba7402f62..9693f031e 100644 --- a/source/duke3d/src/sounds.h +++ b/source/duke3d/src/sounds.h @@ -45,8 +45,8 @@ typedef struct int priority, flags; } sound_t; -int A_CheckSoundPlaying(int spriteNum, int soundNum, int flags = 0); -int A_PlaySound(int soundNum, int spriteNum, int flags = 0); +int A_CheckSoundPlaying(int spriteNum, int soundNum, int channel = 0); +int A_PlaySound(int soundNum, int spriteNum, int channel = CHAN_AUTO, EChanFlags flags = 0); void S_Callback(intptr_t num); int A_CheckAnySoundPlaying(int spriteNum); int S_CheckSoundPlaying(int soundNum); @@ -59,8 +59,8 @@ void S_PlayLevelMusicOrNothing(unsigned int); int S_TryPlaySpecialMusic(unsigned int); void S_PlaySpecialMusicOrNothing(unsigned int); void S_ContinueLevelMusic(void); -int S_PlaySound(int num, int flags = 0); -int S_PlaySound3D(int num, int spriteNum, const vec3_t *pos, int flags = 0); +int S_PlaySound(int num, int channel = CHAN_AUTO, EChanFlags flags = 0); +int S_PlaySound3D(int num, int spriteNum, const vec3_t *pos, int channel = CHAN_AUTO, EChanFlags flags = 0); void S_StopEnvSound(int sndNum,int sprNum, int flags = -1); void S_StopAllSounds(void); void S_Update(void); diff --git a/source/rr/src/actors.cpp b/source/rr/src/actors.cpp index ddb8d4697..0946c358a 100644 --- a/source/rr/src/actors.cpp +++ b/source/rr/src/actors.cpp @@ -1392,7 +1392,7 @@ ACTOR_STATIC void G_MoveFX(void) goto next_sprite; } #endif - A_PlaySound(pSprite->lotag, spriteNum, CHAN_LOOP); + A_PlaySound(pSprite->lotag, spriteNum, CHAN_AUTO, CHANF_LOOP); T1(spriteNum) = 1; // AMBIENT_SFX_PLAYING } else if (playerDist >= spriteHitag && T1(spriteNum) == 1) diff --git a/source/rr/src/anim.cpp b/source/rr/src/anim.cpp index f11a381f1..8053a7cb8 100644 --- a/source/rr/src/anim.cpp +++ b/source/rr/src/anim.cpp @@ -396,7 +396,7 @@ int32_t Anim_Play(const char *fn) if (sound == -1) FX_StopAllSounds(); else - S_PlaySound(sound, CHAN_UI); + S_PlaySound(sound, CHAN_AUTO, CHANF_UI); soundidx++; } @@ -410,7 +410,7 @@ int32_t Anim_Play(const char *fn) if (sound == -1) FX_StopAllSounds(); else - S_PlaySound(sound, CHAN_UI); + S_PlaySound(sound, CHAN_AUTO, CHANF_UI); soundidx++; } @@ -566,7 +566,7 @@ int32_t Anim_Play(const char *fn) if (sound == -1) FX_StopAllSounds(); else - S_PlaySound(sound, CHAN_UI); + S_PlaySound(sound, CHAN_AUTO, CHANF_UI); soundidx++; } diff --git a/source/rr/src/d_menu.cpp b/source/rr/src/d_menu.cpp index bf0097b91..d2af6d069 100644 --- a/source/rr/src/d_menu.cpp +++ b/source/rr/src/d_menu.cpp @@ -361,15 +361,15 @@ void GameInterface::MenuSound(EMenuSounds snd) switch (snd) { case CursorSound: - S_PlaySound(RR ? 335 : KICK_HIT, CHAN_UI); + S_PlaySound(RR ? 335 : KICK_HIT, CHAN_AUTO, CHANF_UI); break; case AdvanceSound: - S_PlaySound(RR? 341 : PISTOL_BODYHIT, CHAN_UI); + S_PlaySound(RR? 341 : PISTOL_BODYHIT, CHAN_AUTO, CHANF_UI); break; case CloseSound: - S_PlaySound(EXITMENUSOUND, CHAN_UI); + S_PlaySound(EXITMENUSOUND, CHAN_AUTO, CHANF_UI); break; default: @@ -445,7 +445,7 @@ void GameInterface::StartGame(FGameStartup& gs) ud.m_player_skill = gs.Skill + 1; if (menu_sounds && skillsound >= 0 && SoundEnabled()) { - S_PlaySound(skillsound, CHAN_UI); + S_PlaySound(skillsound, CHAN_AUTO, CHANF_UI); while (S_CheckSoundPlaying(skillsound)) { diff --git a/source/rr/src/game.cpp b/source/rr/src/game.cpp index 3dbc59528..f918fadf0 100644 --- a/source/rr/src/game.cpp +++ b/source/rr/src/game.cpp @@ -5954,7 +5954,7 @@ int G_StartRTS(int lumpNum, int localPlayer) auto sid = RTS_GetSoundID(lumpNum - 1); if (sid != -1) { - S_PlaySound(sid, CHAN_UI); + S_PlaySound(sid, CHAN_AUTO, CHANF_UI); g_RTSPlaying = 7; return 1; } @@ -6043,7 +6043,7 @@ void G_HandleLocalKeys(void) { if (G_ChangeHudLayout(1)) { - S_PlaySound(RR ? 341 : THUD, CHAN_UI); + S_PlaySound(RR ? 341 : THUD, CHAN_AUTO, CHANF_UI); } } else @@ -6062,7 +6062,7 @@ void G_HandleLocalKeys(void) { if (G_ChangeHudLayout(-1)) { - S_PlaySound(RR ? 341 : THUD, CHAN_UI); + S_PlaySound(RR ? 341 : THUD, CHAN_AUTO, CHANF_UI); } } else diff --git a/source/rr/src/sounds.cpp b/source/rr/src/sounds.cpp index bfac522ba..2d07b1acd 100644 --- a/source/rr/src/sounds.cpp +++ b/source/rr/src/sounds.cpp @@ -299,7 +299,7 @@ void DukeSoundEngine::CalcPosVel(int type, const void* source, const float pt[3] */ } } - if ((chanflags & CHAN_LISTENERZ) && campos != nullptr && type != SOURCE_None) + if ((chanflags & CHANF_LISTENERZ) && campos != nullptr && type != SOURCE_None) { pos->Y = campos->z / 256.f; } @@ -359,7 +359,7 @@ void S_Update(void) // //========================================================================== -int S_PlaySound3D(int sndnum, int spriteNum, const vec3_t* pos, int flags) +int S_PlaySound3D(int sndnum, int spriteNum, const vec3_t* pos, int channel, EChanFlags flags) { auto const pPlayer = g_player[myconnectindex].ps; if (!soundEngine->isValidSoundId(sndnum+1) || !SoundEnabled() || (unsigned)spriteNum >= MAXSPRITES || (pPlayer->gm & MODE_MENU) || @@ -446,8 +446,8 @@ int S_PlaySound3D(int sndnum, int spriteNum, const vec3_t* pos, int flags) if (explosionp) attenuation = 0.5f; else attenuation = (userflags & (SF_GLOBAL | SF_DTAG)) == SF_GLOBAL ? ATTN_NONE : ATTN_NORM; - if (userflags & SF_LOOP) flags |= CHAN_LOOP; - auto chan = soundEngine->StartSound(SOURCE_Actor, &sprite[spriteNum], &sndpos, flags, sndnum+1, attenuation == ATTN_NONE? 0.8f : 1.f, attenuation, nullptr, S_ConvertPitch(pitch)); + if (userflags & SF_LOOP) flags |= CHANF_LOOP; + auto chan = soundEngine->StartSound(SOURCE_Actor, &sprite[spriteNum], &sndpos, CHAN_AUTO, flags, sndnum+1, attenuation == ATTN_NONE? 0.8f : 1.f, attenuation, nullptr, S_ConvertPitch(pitch)); return chan ? 0 : -1; } @@ -457,7 +457,7 @@ int S_PlaySound3D(int sndnum, int spriteNum, const vec3_t* pos, int flags) // //========================================================================== -int S_PlaySound(int sndnum, int flags) +int S_PlaySound(int sndnum, int channel, EChanFlags flags) { if (!soundEngine->isValidSoundId(sndnum+1) || !SoundEnabled()) return -1; @@ -467,8 +467,8 @@ int S_PlaySound(int sndnum, int flags) int const pitch = S_GetPitch(sndnum); - if (userflags & SF_LOOP) flags |= CHAN_LOOP; - auto chan = soundEngine->StartSound(SOURCE_None, nullptr, nullptr, flags, sndnum + 1, 0.8f, ATTN_NONE, nullptr, S_ConvertPitch(pitch)); + if (userflags & SF_LOOP) flags |= CHANF_LOOP; + auto chan = soundEngine->StartSound(SOURCE_None, nullptr, nullptr, channel, flags, sndnum + 1, 0.8f, ATTN_NONE, nullptr, S_ConvertPitch(pitch)); return chan ? 0 : -1; } @@ -478,7 +478,7 @@ int S_PlaySound(int sndnum, int flags) // //========================================================================== -int A_PlaySound(int soundNum, int spriteNum, int flags) +int A_PlaySound(int soundNum, int spriteNum, int channel, EChanFlags flags) { return (unsigned)spriteNum >= MAXSPRITES ? S_PlaySound(soundNum, flags) : S_PlaySound3D(soundNum, spriteNum, &sprite[spriteNum].pos, flags); @@ -513,11 +513,11 @@ void S_ChangeSoundPitch(int soundNum, int spriteNum, int pitchoffset) // //========================================================================== -int A_CheckSoundPlaying(int spriteNum, int soundNum, int flags) +int A_CheckSoundPlaying(int spriteNum, int soundNum, int channel) { if (spriteNum == -1) return soundEngine->GetSoundPlayingInfo(SOURCE_Any, nullptr, soundNum+1); if ((unsigned)spriteNum >= MAXSPRITES) return false; - return soundEngine->IsSourcePlayingSomething(SOURCE_Actor, &sprite[spriteNum], flags, soundNum+1); + return soundEngine->IsSourcePlayingSomething(SOURCE_Actor, &sprite[spriteNum], channel, soundNum+1); } // Check if actor is playing any sound. diff --git a/source/rr/src/sounds.h b/source/rr/src/sounds.h index 20b58cdbe..b4ac69e41 100644 --- a/source/rr/src/sounds.h +++ b/source/rr/src/sounds.h @@ -45,9 +45,8 @@ typedef struct int priority, flags; } sound_t; -int A_CheckSoundPlaying(int spriteNum, int soundNum, int flags = 0); -int A_PlaySound(int soundNum, int spriteNum, int flags = 0); -void S_Callback(intptr_t num); +int A_CheckSoundPlaying(int spriteNum, int soundNum, int channel = 0); +int A_PlaySound(int soundNum, int spriteNum, int channel = CHAN_AUTO, EChanFlags flags = 0); int A_CheckAnySoundPlaying(int spriteNum); int S_CheckSoundPlaying(int soundNum); inline int S_CheckSoundPlaying(int sprnum, int soundNum) { return S_CheckSoundPlaying(soundNum); } @@ -60,8 +59,8 @@ void S_PlayLevelMusicOrNothing(unsigned int); int S_TryPlaySpecialMusic(unsigned int); void S_PlaySpecialMusicOrNothing(unsigned int); void S_ContinueLevelMusic(void); -int S_PlaySound(int num, int flags = 0); -int S_PlaySound3D(int num, int spriteNum, const vec3_t *pos, int flags = 0); +int S_PlaySound(int num, int channel = CHAN_AUTO, EChanFlags flags = 0); +int S_PlaySound3D(int num, int spriteNum, const vec3_t *pos, int channel = CHAN_AUTO, EChanFlags flags = 0); void S_StopEnvSound(int sndNum,int sprNum, int flags = -1); void S_StopAllSounds(void); void S_Update(void);