using System.Collections.Generic; using Wwise.Wooduan.Core; using Wwise.Wooduan.Tools; public partial class AkBankManager { public static Dictionary LoadedBankList { get { Dictionary data = new Dictionary(); if (m_BankHandles == null) return null; lock (m_BankHandles) { foreach (var handles in m_BankHandles) { data[handles.Key] = handles.Value.RefCount; } return data; } } } public static void LoadInitBank(bool doReset = true) { if (doReset) { Reset(); } // load pck first PCKManager.LoadPackage("Init"); uint BankID; var result = AkSoundEngine.LoadBank("Init.bnk", out BankID); if (result != AKRESULT.AK_Success) { UnityEngine.Debug.LogError("WwiseUnity: Failed load Init.bnk with result: " + result); } } public static void ReloadLocalizedVoiceBanks() { foreach (var bank in LoadedBankList) { var bankName = bank.Key; if ((bankName.StartsWith("VO_") || bankName.EndsWith("_VO")) && !bankName.Contains("_NL_")) { AkSoundEngine.UnloadBank(bankName, System.IntPtr.Zero); //PCKManager.ReloadPackage(bankName); AkSoundEngine.LoadBank(bankName, out uint bankID); } } } private partial class BankHandle { internal AudioTriggerSource triggerSource; public AKRESULT LoadBank() { #if UNITY_EDITOR if (!AkSoundEngine.EditorIsSoundEngineLoaded) return AKRESULT.AK_Fail; #endif AKRESULT result = AKRESULT.AK_Fail; if (RefCount == 0 && !BanksToUnload.Remove(this)) { result = DoLoadBank(); AkWooduanHelper.DebugToConsole(result == AKRESULT.AK_Success ? AudioLogVerbosity.Notification : AudioLogVerbosity.Error, AudioObjectType.SoundBank, triggerSource, AudioAction.Load, bankName); } if (result == AKRESULT.AK_Success) IncRef(); return result; } public void IncRef() { if (RefCount == 0) BanksToUnload.Remove(this); else AkWooduanHelper.DebugToConsole(AudioLogVerbosity.Notification, AudioObjectType.SoundBank, triggerSource, AudioAction.Load, bankName, null, "Ref Count = " + RefCount); RefCount++; } public void DecRef(bool ignoreRefCount) { if (ignoreRefCount) { RefCount = 0; BanksToUnload.Add(this); } else { RefCount--; if (RefCount == 0) BanksToUnload.Add(this); else AkWooduanHelper.DebugToConsole(AudioLogVerbosity.Notification, AudioObjectType.SoundBank, triggerSource, AudioAction.Unload, bankName, null, "Ref Count = " + RefCount); } } public virtual void UnloadBank() { var result = AkSoundEngine.UnloadBank(m_BankID, System.IntPtr.Zero, null, null); if (result == AKRESULT.AK_Success) { lock (m_BankHandles) m_BankHandles.Remove(bankName); AkWooduanHelper.DebugToConsole(AudioLogVerbosity.Notification, AudioObjectType.SoundBank, triggerSource, AudioAction.Unload, bankName); } else AkWooduanHelper.DebugToConsole(AudioLogVerbosity.Error, AudioObjectType.SoundBank, triggerSource, AudioAction.Unload, bankName, null, result.ToString()); } } public static AKRESULT LoadBank(string name, bool decodeBank, bool saveDecodedBank, AudioTriggerSource trigger = AudioTriggerSource.Code) { BankHandle handle = null; lock (m_BankHandles) { if (m_BankHandles.TryGetValue(name, out handle)) { // Bank already loaded, increment its ref count. handle.IncRef(); return AKRESULT.AK_BankAlreadyLoaded; } #if UNITY_SWITCH // No bank decoding on Nintendo switch handle = new BankHandle(name); #else handle = decodeBank ? new DecodableBankHandle(name, saveDecodedBank) : new BankHandle(name); #endif handle.triggerSource = trigger; m_BankHandles.Add(name, handle); } return handle.LoadBank(); } public static void UnloadBank(string name, bool ignoreRefCount = false, AudioTriggerSource trigger = AudioTriggerSource.Code) { lock (m_BankHandles) { BankHandle handle = null; if (m_BankHandles.TryGetValue(name, out handle)) { handle.triggerSource = trigger; handle.DecRef(ignoreRefCount); } } } }