/************************************************************************************ Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. Licensed under the Oculus SDK License Version 3.4.1 (the "License"); you may not use the Oculus SDK except in compliance with the License, which is provided at the time of installation or download, or which otherwise accompanies this software in either electronic or hard copy form. You may obtain a copy of the License at https://developer.oculus.com/licenses/sdk-3.4.1 Unless required by applicable law or agreed to in writing, the Oculus SDK distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ************************************************************************************/ using UnityEngine; using UnityEditor; using UnityEditor.Callbacks; using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.IO; using System.Diagnostics; [InitializeOnLoad] class ONSPAudioPluginUpdater { private static bool restartPending = false; private static bool unityRunningInBatchmode = false; private static System.Version invalidVersion = new System.Version("0.0.0"); static ONSPAudioPluginUpdater() { EditorApplication.delayCall += OnDelayCall; } static void OnDelayCall() { if (System.Environment.CommandLine.Contains("-batchmode")) { unityRunningInBatchmode = true; } if (ShouldAttemptPluginUpdate()) { AttemptSpatializerPluginUpdate(true); } } private static string GetCurrentProjectPath() { return Directory.GetParent(Application.dataPath).FullName; } private static string GetUtilitiesRootPath() { var so = ScriptableObject.CreateInstance(typeof(ONSPAudioPluginUpdaterStub)); var script = MonoScript.FromScriptableObject(so); string assetPath = AssetDatabase.GetAssetPath(script); string editorDir = Directory.GetParent(assetPath).FullName; string ovrDir = Directory.GetParent(editorDir).FullName; return ovrDir; } public static string GetVersionDescription(System.Version version) { bool isVersionValid = (version != invalidVersion); return isVersionValid ? version.ToString() : "(Unknown)"; } private static bool ShouldAttemptPluginUpdate() { if (unityRunningInBatchmode) { return false; } else { return (autoUpdateEnabled && !restartPending && !Application.isPlaying); } } private static readonly string autoUpdateEnabledKey = "Oculus_Utilities_ONSPAudioPluginUpdater_AutoUpdate_" + 1.0;//PASOVRManager.utilitiesVersion; private static bool autoUpdateEnabled { get { return PlayerPrefs.GetInt(autoUpdateEnabledKey, 1) == 1; } set { PlayerPrefs.SetInt(autoUpdateEnabledKey, value ? 1 : 0); } } [MenuItem("Oculus/Tools/Update Spatializer Plugin")] private static void RunSpatializerPluginUpdate() { autoUpdateEnabled = true; AttemptSpatializerPluginUpdate(false); } // Separate entry point needed since "-executeMethod" does not support parameters or default parameter values private static void BatchmodePluginUpdate() { OnDelayCall(); // manually invoke when running editor in batchmode AttemptSpatializerPluginUpdate(false); } private static string GetSpatializerPluginsRootPath() { string ovrPath = GetUtilitiesRootPath(); string spatializerPluginsPath = Path.GetFullPath(Path.Combine(ovrPath, "../Spatializer/Plugins")); return spatializerPluginsPath; } private static bool RenameSpatializerPluginToOld(string currentPluginPath) { if (File.Exists(currentPluginPath)) { int index = 0; string targetPluginPath; string targetPluginMetaPath; for (; ; ) { targetPluginPath = currentPluginPath + ".old" + index.ToString(); targetPluginMetaPath = targetPluginPath + ".meta"; if (!File.Exists(targetPluginPath) && !File.Exists(targetPluginPath)) break; ++index; } try { File.Move(currentPluginPath, targetPluginPath); File.Move(currentPluginPath + ".meta", targetPluginMetaPath); UnityEngine.Debug.LogFormat("Spatializer plugin renamed: {0} to {1}", currentPluginPath, targetPluginPath); return true; } catch (Exception e) { UnityEngine.Debug.LogWarningFormat("Unable to rename spatializer plugin: {0}, exception {1}", currentPluginPath, e.Message); return false; } } return false; } private static void AttemptSpatializerPluginUpdate(bool triggeredByAutoUpdate) { // We use a simplified path to update spatializer plugins: // If there is a new AudioPluginOculusSpatializer.dll.new, we'll rename the original one to .old, and the new one to .dll, and restart the editor string pluginsPath = GetSpatializerPluginsRootPath(); string newX86PluginPath = Path.GetFullPath(Path.Combine(pluginsPath, "x86/AudioPluginOculusSpatializer.dll.new")); string newX64PluginPath = Path.GetFullPath(Path.Combine(pluginsPath, "x86_64/AudioPluginOculusSpatializer.dll.new")); if (File.Exists(newX86PluginPath) || File.Exists(newX64PluginPath)) { bool userAcceptsUpdate = false; if (unityRunningInBatchmode) { userAcceptsUpdate = true; } else { int dialogResult = EditorUtility.DisplayDialogComplex("Update Spatializer Plugins", "New spatializer plugin found. Do you want to upgrade? If you choose 'Upgrade', the old plugin will be renamed to AudioPluginOculusSpatializer.old", "Upgrade", "Don't upgrade", "Delete new plugin"); if (dialogResult == 0) { userAcceptsUpdate = true; } else if (dialogResult == 1) { // do nothing } else if (dialogResult == 2) { try { File.Delete(newX86PluginPath); File.Delete(newX86PluginPath + ".meta"); File.Delete(newX64PluginPath); File.Delete(newX64PluginPath + ".meta"); } catch (Exception e) { UnityEngine.Debug.LogWarning("Exception happened when deleting new spatializer plugin: " + e.Message); } } } if (userAcceptsUpdate) { bool upgradeDone = false; string curX86PluginPath = Path.Combine(pluginsPath, "x86/AudioPluginOculusSpatializer.dll"); if (File.Exists(newX86PluginPath)) { RenameSpatializerPluginToOld(curX86PluginPath); try { File.Move(newX86PluginPath, curX86PluginPath); File.Move(newX86PluginPath + ".meta", curX86PluginPath + ".meta"); // fix the platform string curX86PluginPathRel = "Assets/Oculus/Spatializer/Plugins/x86/AudioPluginOculusSpatializer.dll"; UnityEngine.Debug.Log("path = " + curX86PluginPathRel); AssetDatabase.ImportAsset(curX86PluginPathRel, ImportAssetOptions.ForceUpdate); PluginImporter pi = PluginImporter.GetAtPath(curX86PluginPathRel) as PluginImporter; pi.SetCompatibleWithEditor(false); pi.SetCompatibleWithAnyPlatform(false); pi.SetCompatibleWithPlatform(BuildTarget.Android, false); pi.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows64, false); #if UNITY_2017_3_OR_NEWER pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSX, false); #else pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXUniversal, false); pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXIntel, false); pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXIntel64, false); #endif pi.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows, true); pi.SetCompatibleWithEditor(true); pi.SetEditorData("CPU", "X86"); pi.SetEditorData("OS", "Windows"); pi.SetPlatformData("Editor", "CPU", "X86"); pi.SetPlatformData("Editor", "OS", "Windows"); AssetDatabase.ImportAsset(curX86PluginPathRel, ImportAssetOptions.ForceUpdate); AssetDatabase.Refresh(); AssetDatabase.SaveAssets(); upgradeDone = true; } catch (Exception e) { UnityEngine.Debug.LogWarning("Unable to rename the new spatializer plugin: " + e.Message); } } string curX64PluginPath = Path.Combine(pluginsPath, "x86_64/AudioPluginOculusSpatializer.dll"); if (File.Exists(newX64PluginPath)) { RenameSpatializerPluginToOld(curX64PluginPath); try { File.Move(newX64PluginPath, curX64PluginPath); File.Move(newX64PluginPath + ".meta", curX64PluginPath + ".meta"); // fix the platform string curX64PluginPathRel = "Assets/Oculus/Spatializer/Plugins/x86_64/AudioPluginOculusSpatializer.dll"; UnityEngine.Debug.Log("path = " + curX64PluginPathRel); AssetDatabase.ImportAsset(curX64PluginPathRel, ImportAssetOptions.ForceUpdate); PluginImporter pi = PluginImporter.GetAtPath(curX64PluginPathRel) as PluginImporter; pi.SetCompatibleWithEditor(false); pi.SetCompatibleWithAnyPlatform(false); pi.SetCompatibleWithPlatform(BuildTarget.Android, false); pi.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows, false); #if UNITY_2017_3_OR_NEWER pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSX, false); #else pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXUniversal, false); pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXIntel, false); pi.SetCompatibleWithPlatform(BuildTarget.StandaloneOSXIntel64, false); #endif pi.SetCompatibleWithPlatform(BuildTarget.StandaloneWindows64, true); pi.SetCompatibleWithEditor(true); pi.SetEditorData("CPU", "X86_64"); pi.SetEditorData("OS", "Windows"); pi.SetPlatformData("Editor", "CPU", "X86_64"); pi.SetPlatformData("Editor", "OS", "Windows"); AssetDatabase.ImportAsset(curX64PluginPathRel, ImportAssetOptions.ForceUpdate); AssetDatabase.Refresh(); AssetDatabase.SaveAssets(); upgradeDone = true; } catch (Exception e) { UnityEngine.Debug.LogWarning("Unable to rename the new spatializer plugin: " + e.Message); } } if (upgradeDone) { if (unityRunningInBatchmode || EditorUtility.DisplayDialog("Restart Unity", "Spatializer plugins has been upgraded." + "\n\nPlease restart the Unity Editor to complete the update process." #if !UNITY_2017_1_OR_NEWER + " You may need to manually relaunch Unity if you are using Unity 5.6 and higher." #endif , "Restart", "Not Now")) { RestartUnityEditor(); } } } } else { UnityEngine.Debug.Log("No new spatializer plugin(s) found"); } } private static void RestartUnityEditor() { if (unityRunningInBatchmode) { EditorApplication.Exit(0); } else { restartPending = true; EditorApplication.OpenProject(GetCurrentProjectPath()); } } }