From 0501f3a901ab000b6e02e95ee56369be9513a3bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20J=2E=20Est=C3=A9banez?= Date: Thu, 6 Apr 2017 19:00:19 +0200 Subject: [PATCH] Make spatial AudioServers prefer inactive voices instead of unconditionally playing on the next voice slot; that will be the fallback if no inactive voice is found --- servers/spatial_sound/spatial_sound_server_sw.cpp | 15 ++++++++++++--- .../spatial_sound_2d_server_sw.cpp | 15 ++++++++++++--- 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 6a10b175e63..b6021d8964a 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 2c6614da840..f9ec253c0c6 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;