@@ -58,6 +58,7 @@ namespace Audio {
5858 // in a frame, it means it sould be destroyed.
5959 struct entityLoop_t {
6060 bool addedThisFrame;
61+ bool persistent;
6162 std::shared_ptr<LoopingSound> sound;
6263 sfxHandle_t newSfx;
6364 sfxHandle_t oldSfx;
@@ -148,7 +149,7 @@ namespace Audio {
148149 UpdateListenerGain ();
149150
150151 for (auto &loop : entityLoops) {
151- loop = {false , nullptr , -1 , -1 };
152+ loop = {false , false , nullptr , -1 , -1 };
152153 }
153154
154155 return true ;
@@ -164,7 +165,7 @@ namespace Audio {
164165 if (loop.sound ) {
165166 loop.sound ->Stop ();
166167 }
167- loop = {false , nullptr , -1 , -1 };
168+ loop = {false , false , nullptr , -1 , -1 };
168169 }
169170
170171 StopMusic ();
@@ -196,17 +197,23 @@ namespace Audio {
196197 for (int i = 0 ; i < MAX_GENTITIES; i++) {
197198 entityLoop_t& loop = entityLoops[i];
198199 if (loop.sound and not loop.addedThisFrame ) {
199- // The loop wasn't added this frame, that means it has to be removed.
200- loop.sound ->soundGain = 0 ;
200+ if ( loop.persistent ) {
201+ loop.sound ->soundGain = 0 ;
202+ } else {
203+ // The loop wasn't added this frame, that means it has to be removed.
204+ loop.sound ->FadeOutAndDie ();
205+ loop = { false , false , nullptr , -1 , -1 };
206+ }
201207 } else if (loop.oldSfx != loop.newSfx ) {
202208 // The last sfx added in the frame is not the current one being played
203209 // To mimic the previous sound system's behavior we sart playing the new one.
204210 loop.sound ->FadeOutAndDie ();
205211
206212 int newSfx = loop.newSfx ;
207- loop = {false , nullptr , -1 , -1 };
213+ bool persistent = loop.persistent ;
214+ loop = {false , false , nullptr , -1 , -1 };
208215
209- AddEntityLoopingSound (i, newSfx);
216+ AddEntityLoopingSound (i, newSfx, persistent );
210217 }
211218 }
212219
@@ -221,7 +228,7 @@ namespace Audio {
221228 loop.addedThisFrame = false ;
222229 // if we are the unique owner of a loop pointer, then it means it was stopped, free it.
223230 if (loop.sound .use_count () == 1 ) {
224- loop = {false , nullptr , -1 , -1 };
231+ loop = {false , false , nullptr , -1 , -1 };
225232 }
226233 }
227234
@@ -286,7 +293,7 @@ namespace Audio {
286293 AddSound (GetLocalEmitter (), std::make_shared<OneShotSound>(Sample::FromHandle (sfx)), 1 );
287294 }
288295
289- void AddEntityLoopingSound (int entityNum, sfxHandle_t sfx) {
296+ void AddEntityLoopingSound (int entityNum, sfxHandle_t sfx, bool persistent ) {
290297 if (not initialized or not Sample::IsValidHandle (sfx) or not IsValidEntity (entityNum)) {
291298 return ;
292299 }
@@ -300,6 +307,7 @@ namespace Audio {
300307 AddSound (GetEmitterForEntity (entityNum), loop.sound , 1 );
301308 }
302309 loop.addedThisFrame = true ;
310+ loop.persistent = persistent;
303311
304312 // We remember what is the last sfx asked because cgame expects the sfx added last in the frame to be played
305313 loop.newSfx = sfx;
0 commit comments