aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--servers/spatial_sound/spatial_sound_server_sw.cpp15
-rw-r--r--servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp15
2 files changed, 24 insertions, 6 deletions
diff --git a/servers/spatial_sound/spatial_sound_server_sw.cpp b/servers/spatial_sound/spatial_sound_server_sw.cpp
index 6a10b175e..b6021d896 100644
--- a/servers/spatial_sound/spatial_sound_server_sw.cpp
+++ b/servers/spatial_sound/spatial_sound_server_sw.cpp
@@ -398,9 +398,18 @@ SpatialSoundServer::SourceVoiceID SpatialSoundServerSW::source_play_sample(RID p
int to_play = 0;
if (p_voice == SOURCE_NEXT_VOICE) {
- to_play = source->last_voice + 1;
- if (to_play >= source->voices.size())
- to_play = 0;
+ const int num_voices = source->voices.size();
+ bool free_found = false;
+ for (int i = 0; i < num_voices; i++) {
+ const int candidate = (source->last_voice + 1 + i) % num_voices;
+ if (!source->voices[candidate].active && !source->voices[candidate].restart) {
+ free_found = true;
+ to_play = candidate;
+ break;
+ }
+ }
+ if (!free_found)
+ to_play = (source->last_voice + 1) % num_voices;
} else
to_play = p_voice;
diff --git a/servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp b/servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp
index 2c6614da8..f9ec253c0 100644
--- a/servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp
+++ b/servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp
@@ -395,9 +395,18 @@ SpatialSound2DServer::SourceVoiceID SpatialSound2DServerSW::source_play_sample(R
int to_play = 0;
if (p_voice == SOURCE_NEXT_VOICE) {
- to_play = source->last_voice + 1;
- if (to_play >= source->voices.size())
- to_play = 0;
+ const int num_voices = source->voices.size();
+ bool free_found = false;
+ for (int i = 0; i < num_voices; i++) {
+ const int candidate = (source->last_voice + 1 + i) % num_voices;
+ if (!source->voices[candidate].active && !source->voices[candidate].restart) {
+ free_found = true;
+ to_play = candidate;
+ break;
+ }
+ }
+ if (!free_found)
+ to_play = (source->last_voice + 1) % num_voices;
} else
to_play = p_voice;