Unreal Engine SimpleITD Audio 3D malfunction in 5.6.1

We are currently trying to implement a 3D Audio Option in our Game and we have encountered this problem with the current “SimpleITD” Audio Plugin for the Sound Spatialization. The problem is that the positioning and binaural output appears to be malfunctioning. We are using a custom UE 5.5 solution, so we tried to test it in a proper UE 5.6.1 standalone ThirdPerson project and it also happens.

I have attatched a video evidence of the problem were you can listen that the sound is making a “ping pong” effect and positioning really bad. We have tried to use a ITD curve to minimize the effect, but there is no solution. In this example we are using a generic grenade sound extracted from Lyra and the Attenuation settings are shown in the atatched screenshots. In our project we have tested also with metasounds and there is the same problem.

Please, Could you provide us some advice on implementing a 3D Audio alternative for our game?

Many thanks in advance!

Steps to Reproduce
In any project since UE 5.5 with any sound using spatialization attenuation and the “plugin-spatilizated” as Spatialization Method. With the “SimpleITD” Plugin as Spatialization Plugin. Place this sound in a map or make ir spawn looped in a map location. Observe how it starts to play with a notable delay making like a “ping pong” effect in regard. Also, with the cheat “au.DisableBinauralSpatialization 1” this effect is mitigated.

Hi Gonzalo, thanks for reaching out. We’ll check it out.

After looking into it this is a bug with the internal delay line read and write indices.

The fix (going into 5.7) is to add the following to Delay.cpp

void FDelay::SetEasedDelayMsec(const float InDelayMsec, const bool bIsInit)
	{
		const float DesiredDelayInSamples = InDelayMsec * SampleRate * 0.001f;
		const float TargetDelayInSamples = FMath::Min(DesiredDelayInSamples, MaxBufferLengthSamples - 1);
 
		// -- begin fix -- // 
		if (FMath::IsNearlyEqual(TargetDelayInSamples, DesiredDelayInSamples))
		{
			SetDelaySamples(TargetDelayInSamples);
			return;
		}
		// -- end fix -- //
		
		ResizeIfNeeded(TargetDelayInSamples);
 
		EaseDelayMsec.SetValue(InDelayMsec, bIsInit);
		if (bIsInit)
		{
			const float NewDelayInSamples = InDelayMsec * SampleRate * 0.001f;
			DelayInSamples = TargetDelayInSamples;
		}
		Update(bIsInit);
	}

This bypasses internal easing when it isn’t needed, and avoids the index overtake.

Thank you for the callout and detailed repro steps! :slight_smile:

Hello Max!

Thank you for your response and Fix. We implemented the fix in the Delay.cpp code and it worked! Now the system appears to play the sounds spatialized in 3D.

Once again, thank you for the early response including the proper fix.