So, I figured out how to update environment without changing engine’s core. FAudioDevice::InitializePluginListeners() function is private, but it just updates PluginListener array, which is public.
void FSteamAudioModule::StartupModule()
{
...
hWorldPostInit = FWorldDelegates::OnPostWorldCreation.AddRaw(this, &FSteamAudioModule::OnWorld_PostCreation);
}
void FSteamAudioModule::ShutdownModule()
{
FWorldDelegates::OnPostWorldInitialization.Remove(hWorldPostInit);
...
}
void FSteamAudioModule::OnWorld_PostCreation(UWorld* World)
{
if (FAudioDevice* AudioDevice = GEngine->GetActiveAudioDevice())
{
for (TAudioPluginListenerPtr PluginListener : AudioDevice->PluginListeners)
{
PluginListener->OnListenerShutdown(AudioDevice);
PluginListener->OnListenerInitialize(AudioDevice, World);
}
UE_LOG(LogSteamAudio, Log, TEXT("OnWorld_PostCreation: Audio Device updated for world %s"), *World->GetName());
}
else
{
UE_LOG(LogSteamAudio, Error, TEXT("OnWorld_PostCreation: Can't get valid Audio Device"));
}
}
UPD. Also, need to filter out sublevels.