mixedreality/com.microsoft.mixedreality..../Core/Utilities/Editor/SpatializerUtilities.cs

109 lines
4.2 KiB
C#

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using Microsoft.MixedReality.Toolkit.Editor;
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace Microsoft.MixedReality.Toolkit.Utilities.Editor
{
/// <summary>
/// Collection of utilities to manage the configured audio spatializer.
/// </summary>
public static class SpatializerUtilities
{
/// <summary>
/// Returns the name of the currently selected spatializer plugin.
/// </summary>
public static string CurrentSpatializer => AudioSettings.GetSpatializerPluginName();
/// <summary>
/// Returns the names of installed spatializer plugins.
/// </summary>
public static string[] InstalledSpatializers => AudioSettings.GetSpatializerPluginNames();
/// <summary>
/// Checks to see if the audio spatializer is configured and/or whether or
/// not the spatializer collection has changed.
/// </summary>
/// <returns>
/// True if the selected spatializer is installed and no changes have been made to the collection of installed spatializers.
/// False if the selected spatializer is no longer installed or the collection of installed spatializers has been changed.
/// </returns>
public static bool CheckSettings()
{
// Check to see if the count of installed spatializers has changed
if (!CheckSpatializerCount())
{
// A spatializer has been added or removed.
return false;
}
string spatializerName = CurrentSpatializer;
// Check to see if an audio spatializer is configured.
if (string.IsNullOrWhiteSpace(spatializerName))
{
// The user chose to not initialize a spatializer so we are set correctly
return true;
}
string[] installedSpatializers = InstalledSpatializers;
// Check to see if the configured spatializer is installed.
if (!installedSpatializers.Contains(spatializerName))
{
// The current spatializer has been uninstalled.
return false;
}
// A spatializer is correctly configured.
return true;
}
/// <summary>
/// Saves the specified spatializer to the audio settings.
/// </summary>
public static void SaveSettings(string spatializer)
{
if (string.IsNullOrWhiteSpace(spatializer))
{
Debug.Log("No spatializer was specified. The application will not support Spatial Sound.");
}
else if (!InstalledSpatializers.Contains(spatializer))
{
Debug.LogError($"{spatializer} is not an installed spatializer.");
return;
}
SerializedObject audioMgrSettings = MixedRealityOptimizeUtils.GetSettingsObject("AudioManager");
SerializedProperty spatializerPlugin = audioMgrSettings.FindProperty("m_SpatializerPlugin");
if (spatializerPlugin == null)
{
Debug.LogError("Unable to save the spatializer settings. The field could not be located into the Audio Manager settings object.");
return;
}
AudioSettings.SetSpatializerPluginName(spatializer);
spatializerPlugin.stringValue = spatializer;
audioMgrSettings.ApplyModifiedProperties();
// Cache the count of installed spatializers
MixedRealityProjectPreferences.AudioSpatializerCount = InstalledSpatializers.Length;
}
/// <summary>
/// Compares the previous and current count of installed spatializer plugins.
/// </summary>
/// <returns>True if the count of installed spatializers is unchanged, false otherwise.</returns>
private static bool CheckSpatializerCount()
{
int previousCount = MixedRealityProjectPreferences.AudioSpatializerCount;
int currentCount = InstalledSpatializers.Length;
return (previousCount == currentCount);
}
}
}