Steam Audio

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.