Exemple #1
0
        public static void FindAndSetBankReference(WwiseAddressableSoundBank addressableBankAsset, string name)
        {
            System.Reflection.Assembly[] assemblies = System.AppDomain.CurrentDomain.GetAssemblies();

            var  assembly            = Assembly.Load("AK.Wwise.Unity.API.WwiseTypes");
            var  AkBankReferenceType = assembly.GetType("WwiseBankReference");
            bool success             = (bool)AkBankReferenceType.GetMethod("FindBankReferenceAndSetAddressableBank").Invoke(null, new object[] { addressableBankAsset, name });
        }
Exemple #2
0
        internal static void UpdateAddressableBankReference(WwiseAddressableSoundBank asset, string bankName)
        {
            bool bankScriptableObjectUpdated = false;

            if (AkAssetUtilities.AddressableBankUpdated != null)
            {
                bankScriptableObjectUpdated = AkAssetUtilities.AddressableBankUpdated.GetInvocationList().Select(x => (bool)x.DynamicInvoke(asset, bankName)).Any(v => v);
            }
            if (!bankScriptableObjectUpdated)
            {
                AkAssetUtilities.FindAndSetBankReference(asset, bankName);
            }
        }
        private void OnBankLoaded(WwiseAddressableSoundBank bank)
        {
            if (bank.loadState == BankLoadState.Loaded)
            {
                UnityEngine.Debug.Log($"Wwise Addressable Bank Manager : Loaded {bank.name} bank -  Bank ID : {bank.soundbankId}");

                if (InitBankLoaded && bank.name == InitBank.name)
                {
                    foreach (var b in m_AddressableBanks.Values)
                    {
                        if (b.loadState == BankLoadState.WaitingForInitBankToLoad)
                        {
                            LoadBank(b, b.decodeBank, b.saveDecodedBank);
                        }
                    }
                }

                //Fire any events that were waiting on the bank load
                var eventsToRemove = new List <uint>();
                foreach (var e in m_eventsToFireOnBankLoad)
                {
                    if (bank.eventNames.Contains(e.Value.eventName))
                    {
                        UnityEngine.Debug.Log($"Wwise Addressable Bank Manager: Triggering delayed event {e.Value.eventName}");
                        MethodInfo handleEvent = EventType.GetMethod(e.Value.methodName, e.Value.methodArgTypes);
                        handleEvent.Invoke(e.Value.eventObject, e.Value.methodArgs);
                        eventsToRemove.Add(e.Key);
                    }
                }

                foreach (var e in eventsToRemove)
                {
                    m_eventsToFireOnBankLoad.TryRemove(e, out _);
                }
            }

            //Reset bank state if load failed
            if (bank.loadState == BankLoadState.LoadFailed)
            {
                UnloadBank(bank, ignoreRefCount: true);
            }

            if (m_banksToUnload.Keys.Contains(bank.name))
            {
                UnloadBank(bank);
            }
        }
        public void UnloadBank(WwiseAddressableSoundBank bank, bool ignoreRefCount = false, bool removeFromBankDictionary = true)
        {
            if (!ignoreRefCount)
            {
                bank.refCount = Math.Max(0, bank.refCount - 1);
                if (bank.refCount != 0)
                {
                    return;
                }
            }

            if (bank.loadState == BankLoadState.Loading)
            {
                UnityEngine.Debug.Log($"Wwise Addressable Bank Manager: {bank.name} will be unloaded after it is done loading");
                m_banksToUnload.TryAdd(bank.name, bank.name);
                return;
            }

            if (bank.loadState == BankLoadState.Loaded)
            {
                UnityEngine.Debug.Log($"Wwise Addressable Bank Manager: Unloading {bank.name} sound bank - Bank ID : {bank.soundbankId}");
                AkSoundEngine.UnloadBank(bank.soundbankId, System.IntPtr.Zero);
            }

            m_banksToUnload.TryRemove(bank.name, out _);
            bank.soundbankId = 0;
            bank.refCount    = 0;
            bank.loadState   = BankLoadState.Unloaded;

            if (removeFromBankDictionary)
            {
                if (!m_AddressableBanks.TryRemove(bank.name, out _))
                {
#if UNITY_EDITOR
                    // Don't unnecessarily log messages when caused by domain reload
                    if (UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode && !UnityEditor.EditorApplication.isPlaying)
                    {
                        return;
                    }
#endif
                    if (InitBank && bank.name != InitBank.name)
                    {
                        UnityEngine.Debug.LogError($"Wwise Addressable Bank Manager: Unloaded {bank.name}, but it was not in the list of loaded banks");
                    }
                }
            }
        }
Exemple #5
0
        public void UnloadBank(WwiseAddressableSoundBank bank, bool ignoreRefCount = false, bool removeFromBankDictionary = true)
        {
            if (bank.loadState == BankLoadState.Loading || bank.loadState == BankLoadState.WaitingForInitBankToLoad)
            {
                UnityEngine.Debug.LogError($"Wwise Addressable Bank Manager: Will unload {bank.name} when it has finished loading");
                m_banksToUnload.TryAdd(bank.name, bank.name);
                return;
            }

            if (!ignoreRefCount)
            {
                bank.refCount = Math.Max(0, bank.refCount - 1);
                if (bank.refCount != 0)
                {
                    return;
                }
            }

            if (bank.loadState == BankLoadState.Loaded)
            {
                UnityEngine.Debug.Log($"Wwise Addressable Bank Manager: Unloading {bank.name} sound bank - Bank ID : {bank.soundbankId}");
                AkSoundEngine.UnloadBank(bank.soundbankId, System.IntPtr.Zero);
                bank.soundbankId = 0;
                bank.loadState   = BankLoadState.Unloaded;
                bank.refCount    = 0;

                if (removeFromBankDictionary)
                {
                    if (!m_AddressableBanks.TryRemove(bank.name, out _))
                    {
#if UNITY_EDITOR
                        if (UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode && !UnityEditor.EditorApplication.isPlaying)
                        {
                            return;
                        }
#endif
                        UnityEngine.Debug.LogError($"Wwise Addressable Bank Manager: Did not unload {bank.name} as it was not in the list of loaded banks");
                    }
                }
            }
        }
Exemple #6
0
        internal static void AddBankReferenceToAddressableBankAsset(ConcurrentDictionary <string, WwiseAddressableSoundBank> addressableAssetCache, HashSet <string> bankAssetsAdded)
        {
            List <CreateAssetEntry> itemsToCreate = new List <CreateAssetEntry>();

            try
            {
                foreach (var bankPath in bankAssetsAdded)
                {
                    string name = Path.GetFileNameWithoutExtension(bankPath);

                    string platform;
                    string language;
                    AkAssetUtilities.ParseAssetPath(bankPath, out platform, out language);

                    // First find or create AddressableBank asset
                    WwiseAddressableSoundBank addressableBankAsset = null;
                    if (!addressableAssetCache.TryGetValue(name, out addressableBankAsset))
                    {
                        var results = AssetDatabase.FindAssets(string.Format("{0} t:{1}", name, nameof(WwiseAddressableSoundBank)));
                        if (results.Length > 0)
                        {
                            string addressableBankGuid = results.First();
                            addressableBankAsset = AssetDatabase.LoadAssetAtPath <WwiseAddressableSoundBank>(AssetDatabase.GUIDToAssetPath(addressableBankGuid));
                        }

                        string addressableBankAssetDirectory = AkAssetUtilities.GetSoundbanksPath();
                        string addressableBankAssetPath      = string.Format("{0}/{1}", addressableBankAssetDirectory, Path.ChangeExtension(name, ".asset"));
                        if (addressableBankAsset == null)
                        {
                            if (!AssetDatabase.IsValidFolder(addressableBankAssetDirectory))
                            {
                                StringBuilder currentPathBuilder        = new StringBuilder();
                                var           addressableBankAssetParts = addressableBankAssetDirectory.Split('/');

                                currentPathBuilder.Append(addressableBankAssetParts[0]);

                                for (int i = 1; i < addressableBankAssetParts.Length; ++i)
                                {
                                    string previousPath = currentPathBuilder.ToString();

                                    currentPathBuilder.AppendFormat("/{0}", addressableBankAssetParts[i]);

                                    string currentPath = currentPathBuilder.ToString();

                                    if (!AssetDatabase.IsValidFolder(currentPath))
                                    {
                                        AssetDatabase.CreateFolder(previousPath, addressableBankAssetParts[i]);
                                    }
                                }
                            }
                            addressableBankAsset = ScriptableObject.CreateInstance <WwiseAddressableSoundBank>();
                            itemsToCreate.Add(new CreateAssetEntry {
                                Asset = addressableBankAsset, Path = addressableBankAssetPath, Name = name
                            });
                        }
                        else
                        {
                            UpdateAddressableBankReference(addressableBankAsset, name);
                        }

                        addressableAssetCache.AddOrUpdate(name, addressableBankAsset, (key, oldValue) => addressableBankAsset);

                        if (name == "Init")
                        {
                            var            wwiseGlobablGameObject = GameObject.Find("WwiseGlobal");
                            InitBankHolder bankHolder;
                            if (wwiseGlobablGameObject != null)
                            {
                                bankHolder = wwiseGlobablGameObject.GetComponent <InitBankHolder>();
                                if (bankHolder == null)
                                {
                                    wwiseGlobablGameObject.AddComponent <InitBankHolder>();
                                    bankHolder = wwiseGlobablGameObject.GetComponent <InitBankHolder>();
                                }
                                bankHolder.InitBank = addressableBankAsset;
                            }
                            else
                            {
                                bankHolder = UnityEngine.Object.FindObjectOfType <InitBankHolder>();
                                if (bankHolder != null)
                                {
                                    bankHolder.InitBank = addressableBankAsset;
                                }
                                else
                                {
                                    Debug.Log("Could not find or create the InitBankHolder, you will have to add one to the WwiseGlobal object in your scene and ensure it references the Init bank.");
                                }
                            }
                        }
                    }

                    if (!string.IsNullOrEmpty(platform))
                    {
                        var soundbankInfos = AkAssetUtilities.ParsePlatformSoundbanksXML(platform, name);
                        addressableBankAsset.UpdateLocalizationLanguages(platform, soundbankInfos[name].Keys.ToList());
                        addressableBankAsset.AddOrUpdate(platform, language, new AssetReferenceWwiseBankData(AssetDatabase.AssetPathToGUID(bankPath)));
                        EditorUtility.SetDirty(addressableBankAsset);
                    }
                }
            }
            finally
            {
                if (itemsToCreate.Count > 0)
                {
                    AssetDatabase.StartAssetEditing();
                    foreach (var entry in itemsToCreate)
                    {
                        AssetDatabase.CreateAsset(entry.Asset, entry.Path);
                        UpdateAddressableBankReference(entry.Asset, entry.Name);
                    }
                    AssetDatabase.StopAssetEditing();
                }

                AssetDatabase.SaveAssets();
                AssetDatabase.Refresh();
            }
        }
        public async void LoadBankAsync(WwiseAddressableSoundBank bank, AssetReferenceWwiseBankData bankData)
        {
            var AsyncHandle = bankData.LoadAssetAsync();
            await AsyncHandle.Task;

            if (AsyncHandle.IsValid() && AsyncHandle.Status == AsyncOperationStatus.Succeeded)
            {
                bank.eventNames = new HashSet <string>(AsyncHandle.Result.eventNames);
                var data = AsyncHandle.Result.RawData;
                bank.GCHandle = GCHandle.Alloc(data, GCHandleType.Pinned);
                var result = AkSoundEngine.LoadBankMemoryCopy(bank.GCHandle.AddrOfPinnedObject(), (uint)data.Length, out uint bankID);
                if (result == AKRESULT.AK_Success)
                {
                    bank.soundbankId = bankID;
                    bank.loadState   = BankLoadState.Loaded;
                }
                else
                {
                    bank.soundbankId = INVALID_SOUND_BANK_ID;
                    bank.loadState   = BankLoadState.LoadFailed;
                    UnityEngine.Debug.Log($"Wwise Addressable Bank Manager : Sound Engine failed to load {bank.name} SoundBank");
                }
                bank.GCHandle.Free();
                Addressables.Release(AsyncHandle);

                string destinationDir;
                if (bank.StreamingMedia != null)
                {
                    foreach (var language in bank.StreamingMedia.Keys)
                    {
                        if (language == "SFX")
                        {
                            destinationDir = UnityEngine.Application.persistentDataPath;;
                        }
                        else
                        {
                            destinationDir = Path.Combine(UnityEngine.Application.persistentDataPath, language);
                        }

                        if (!Directory.Exists(destinationDir))
                        {
                            Directory.CreateDirectory(destinationDir);
                        }

                        foreach (var streamedAsset in bank.StreamingMedia[language].media)
                        {
                            if (streamedAsset == null)
                            {
                                UnityEngine.Debug.LogError($"Wwise Addressable Bank Manager: Streaming media asset referenced in {bank.name} SoundBank is null");
                                continue;
                            }
                            var loadHandle = streamedAsset.LoadAssetAsync();
                            await loadHandle.Task;

                            if (loadHandle.IsValid() && loadHandle.Status == AsyncOperationStatus.Succeeded)
                            {
                                AkAssetUtilities.UpdateWwiseFileIfNecessary(destinationDir, loadHandle.Result);
                                Addressables.Release(loadHandle);
                            }
                            else
                            {
                                UnityEngine.Debug.LogError($"Wwise Addressable Bank Manager: Failed to load streaming media asset {streamedAsset.id} in {bank.name} SoundBank");
                            }
                        }
                    }
                }
            }
            else
            {
                UnityEngine.Debug.Log($"Wwise Addressable Bank Manager : Failed to load {bank.name} SoundBank");
                bank.loadState = BankLoadState.LoadFailed;
                Addressables.Release(AsyncHandle);
            }

            //Make sure the asset is cleared from memory
            UnityEngine.Resources.UnloadUnusedAssets();
            OnBankLoaded(bank);
        }
        //Todo : support decoding banks and saving decoded banks
        public void LoadBank(WwiseAddressableSoundBank bank, bool decodeBank = false, bool saveDecodedBank = false, bool addToBankDictionary = true)
        {
            bank.decodeBank      = decodeBank;
            bank.saveDecodedBank = saveDecodedBank;
            if (m_AddressableBanks.ContainsKey(bank.name))
            {
                m_AddressableBanks.TryGetValue(bank.name, out bank);
            }
            else if (addToBankDictionary)
            {
                m_AddressableBanks.TryAdd(bank.name, bank);
            }

            if (bank.loadState == BankLoadState.Unloaded || bank.loadState == BankLoadState.WaitingForInitBankToLoad)
            {
                if (!InitBankLoaded && bank.name != "Init")
                {
                    UnityEngine.Debug.Log($"Wwise Addressable Bank Manager: {bank.name} bank will be loaded after the init bank is loaded");
                    bank.loadState = BankLoadState.WaitingForInitBankToLoad;
                    return;
                }
            }
            if (bank.loadState == BankLoadState.Loading)
            {
                bank.refCount += 1;
                return;
            }

            if (bank.loadState == BankLoadState.Loaded)
            {
                bank.refCount += 1;
                return;
            }

            bank.refCount += 1;
            bank.loadState = BankLoadState.Loading;

            if (bank.Data == null)
            {
                UnityEngine.Debug.LogError($"Wwise Addressable Bank Manager : {bank.name} could not be loaded - Bank reference not set");
                m_AddressableBanks.TryRemove(bank.name, out _);
                return;
            }

            AssetReferenceWwiseBankData bankData;

            if (bank.Data.ContainsKey("SFX"))
            {
                UnityEngine.Debug.Log($"Wwise Addressable Bank Manager: Loading {bank.name} bank");
                bankData             = bank.Data["SFX"];
                bank.currentLanguage = "SFX";
            }
            else
            {
                var currentLanguage = AkSoundEngine.GetCurrentLanguage();
                if (bank.Data.ContainsKey(currentLanguage))
                {
                    bankData             = bank.Data[currentLanguage];
                    bank.currentLanguage = currentLanguage;
                    UnityEngine.Debug.Log($"Wwise Addressable Bank Manager: Loading {bank.name} - {currentLanguage}");
                }
                else
                {
                    UnityEngine.Debug.LogError($"Wwise Addressable Bank Manager: {bank.name} could not be loaded in {currentLanguage} language ");
                    m_AddressableBanks.TryRemove(bank.name, out _);
                    return;
                }
            }

            LoadBankAsync(bank, bankData);
        }
Exemple #9
0
        public void LoadBankEditor(WwiseAddressableSoundBank bank, AssetReferenceWwiseBankData bankData)
        {
            var p          = UnityEditor.AssetDatabase.GetAssetPath(bankData.editorAsset);
            var loadedBank = UnityEditor.AssetDatabase.LoadAssetAtPath <WwiseSoundBankAsset>(p);

            bank.eventNames = new HashSet <string>(loadedBank.eventNames);
            var data = loadedBank.RawData;

            bank.GCHandle = GCHandle.Alloc(data, GCHandleType.Pinned);
            var result = AkSoundEngine.LoadBankMemoryCopy(bank.GCHandle.AddrOfPinnedObject(), (uint)data.Length, out uint bankID);

            if (result == AKRESULT.AK_Success)
            {
                bank.soundbankId = bankID;
            }
            else
            {
                bank.soundbankId = INVALID_SOUND_BANK_ID;
            }
            bank.GCHandle.Free();

            string outFolder = UnityEngine.Application.persistentDataPath;

            if (!Directory.Exists(outFolder))
            {
                Directory.CreateDirectory(outFolder);
            }

            string destinationDir;

            if (bank.StreamingMedia != null)
            {
                foreach (var language in bank.StreamingMedia.Keys)
                {
                    if (language == "SFX")
                    {
                        destinationDir = UnityEngine.Application.persistentDataPath;
                    }
                    else
                    {
                        destinationDir = Path.Combine(UnityEngine.Application.persistentDataPath, language);
                    }

                    if (!Directory.Exists(destinationDir))
                    {
                        Directory.CreateDirectory(destinationDir);
                    }

                    foreach (var streamedAsset in bank.StreamingMedia[language].media)
                    {
                        if (streamedAsset == null)
                        {
                            UnityEngine.Debug.LogError($"Wwise Addressable Bank Manager: Streaming media asset referenced in {bank.name} soundbank is null");
                            continue;
                        }

                        var mediaPath = UnityEditor.AssetDatabase.GetAssetPath(streamedAsset.editorAsset);
                        var media     = UnityEditor.AssetDatabase.LoadAssetAtPath <WwiseStreamingMediaAsset>(mediaPath);
                        AkAssetUtilities.UpdateWwiseFileIfNecessary(destinationDir, media);
                    }
                }
            }

            //Make sure the asset is cleared from memory
            UnityEngine.Resources.UnloadUnusedAssets();

            OnBankLoaded(bank);
        }