====== FMOD integration ====== User //Kubstoff// kindly tracked down an issue in FMOD (method [[https://github.com/fmod/fmod-for-unreal/blob/9e138d4512fa3f227a79278083ee9fccbc65bf68/FMODStudio/Source/FMODStudio/Private/FMODStudioModule.cpp#L884|FFMODStudioModule::UpdateWorldListeners()]]), where played sounds are not reproduced when multiple UWorld instances are active. Thanks //Kubstoff//! Source: https://discord.com/channels/898503629655408660/898527948901089283/1108753001046347836 ---- I finally had some time to investigate this ancient bug in the project and I managed to solve the issue, the gist of it was that in ''FFMODStudioModule::UpdateWorldListeners'' the Iterator is gotten from ''Iterator = GEngine->GetLocalPlayerIterator(World)'', this is the part where it conflicts with the plugin, it needs to update all player controller listeners for a given world, thus it should use ''Iterator = World->GetPlayerControllerIterator()'' what's mind boggling is that the functions name suggests that it wants to update the World listeners, dunno why they did it that way. anyways, if anyone is curious, getting this to work basically means that in the FMOD integration you need to swap the definition for ''FFMODStudioModule::UpdateWorldListeners'' to void FFMODStudioModule::UpdateWorldListeners(UWorld *World, int *ListenerIndex) { if (!World) { return; } float DeltaSeconds = World->GetDeltaSeconds(); for (auto Iterator = World->GetPlayerControllerIterator(); Iterator; ++Iterator) { TWeakObjectPtr LocalPlayer = *Iterator; if (LocalPlayer.IsValid()) { APlayerController* PlayerController = LocalPlayer.Get(); FVector Location; FVector ProjFront; FVector ProjRight; PlayerController->GetAudioListenerPosition(Location, ProjFront, ProjRight); FVector ProjUp = FVector::CrossProduct(ProjFront, ProjRight); FTransform ListenerTransform(FRotationMatrix::MakeFromXY(ProjFront, ProjRight)); ListenerTransform.SetTranslation(Location); ListenerTransform.NormalizeRotation(); SetListenerPosition(*ListenerIndex, World, ListenerTransform, DeltaSeconds); (*ListenerIndex)++; } } }