using System; using System.Collections.Generic; using System.Threading; using UnityEngine; public static class AkBankManager { private static Dictionary m_BankHandles = new Dictionary(); public static List BanksToUnload = new List(); private static Mutex m_Mutex = new Mutex(); public static void DoUnloadBanks() { for (int i = 0; i < BanksToUnload.Count; i++) { uint in_bankID = BanksToUnload[i]; AkSoundEngine.UnloadBank(in_bankID, IntPtr.Zero, null, null); } BanksToUnload.Clear(); } public static void Reset() { m_BankHandles.Clear(); BanksToUnload.Clear(); } public static void GlobalBankCallback(uint in_bankID, IntPtr in_pInMemoryBankPtr, AKRESULT in_eLoadResult, uint in_memPoolId, object in_Cookie) { m_Mutex.WaitOne(); AkBankHandle akBankHandle = (AkBankHandle)in_Cookie; AkCallbackManager.BankCallback bankCallback = akBankHandle.bankCallback; if (in_eLoadResult != AKRESULT.AK_Success) { Debug.LogWarning("WwiseUnity: Bank " + akBankHandle.bankName + " failed to load (" + in_eLoadResult.ToString() + ")"); m_BankHandles.Remove(akBankHandle.bankName); } m_Mutex.ReleaseMutex(); if (bankCallback != null) { bankCallback(in_bankID, in_pInMemoryBankPtr, in_eLoadResult, in_memPoolId, null); } } public static void LoadBank(string name) { m_Mutex.WaitOne(); AkBankHandle value = null; if (!m_BankHandles.TryGetValue(name, out value)) { value = new AkBankHandle(name); m_BankHandles.Add(name, value); m_Mutex.ReleaseMutex(); value.LoadBank(); } else { value.IncRef(); m_Mutex.ReleaseMutex(); } } public static void LoadBankAsync(string name, AkCallbackManager.BankCallback callback = null) { m_Mutex.WaitOne(); AkBankHandle value = null; if (!m_BankHandles.TryGetValue(name, out value)) { value = new AkBankHandle(name); m_BankHandles.Add(name, value); m_Mutex.ReleaseMutex(); value.LoadBankAsync(callback); } else { value.IncRef(); m_Mutex.ReleaseMutex(); } } public static void UnloadBank(string name) { m_Mutex.WaitOne(); AkBankHandle value = null; if (m_BankHandles.TryGetValue(name, out value)) { value.DecRef(); if (value.RefCount == 0) { m_BankHandles.Remove(name); } } m_Mutex.ReleaseMutex(); } }