////////////////////////////////////////////////////////////////////// // // Copyright (c) 2020 Audiokinetic Inc. / All Rights Reserved // ////////////////////////////////////////////////////////////////////// using System.Collections.Generic; using System.Collections.ObjectModel; /// /// Base class for Json serializable objects. /// Implements implicit cast to string using UnityEngine.JsonUtility.ToJson. /// [System.Serializable] public class JsonSerializable { public static implicit operator string(JsonSerializable o) => UnityEngine.JsonUtility.ToJson(o); } /// /// Abstract base class for WAAPI command arguments. /// [System.Serializable] public abstract class Args : JsonSerializable { } /// /// WAAPI arguments containing a WAQL string. /// [System.Serializable] public class WaqlArgs : Args { public string waql; public WaqlArgs(string query) { waql = query; } } /// /// WAAPI arguments containing an object identfier. /// [System.Serializable] public class ArgsObject : Args { public string @object; public ArgsObject(string objectId) { @object = objectId; } } /// /// WAAPI arguments containing an object identfier and new value used when renaming an object. /// [System.Serializable] public class ArgsRename : Args { public string @object; public string value; public ArgsRename(string objectId, string value) { @object = objectId; this.value = value; } } /// /// WAAPI arguments containing an object identfier and name used when deleting an object. /// [System.Serializable] public class ArgsDisplayName : Args { public string displayName; public ArgsDisplayName(string displayName) { this.displayName = displayName; } } /// /// WAAPI arguments containing an object identfier and command field. /// Used by AkWaapiUtilities.SelectObjectInAuthoringAsync(). /// [System.Serializable] public class ArgsCommand : Args { public string[] @objects; public string command; public ArgsCommand(string c, string[] objectIds) { command = c; objects = objectIds; } } /// /// WAAPI arguments containing an Event identfier and transport ID. /// Used to toggle Event playback. /// [System.Serializable] public class ArgsPlay : Args { public string action; public int transport; public ArgsPlay(string a, int t) { action = a; transport = t; } } /// /// WAAPI arguments containing a transport ID. /// Used to specify transports in transport-specific commands. /// [System.Serializable] public class ArgsTransport : Args { public int transport; public ArgsTransport(int t) { transport = t; } } /// /// Abstract base class for WAAPI command options. /// [System.Serializable] public class Options : JsonSerializable { } /// /// WAAPI options to specify the names of fields to return in a WAAPI request returning WwiseObjects. /// [System.Serializable] public class ReturnOptions : Options { public string[] @return; public ReturnOptions(string [] infokeys) { @return = infokeys; } } /// /// WAAPI options used to specify the transport ID when subscribing. /// [System.Serializable] public class TransportOptions : Options { public int transport; public TransportOptions(int id) { transport = id; } } /// /// Used to deserialize the response from an ak.wwise.core.transport.create command. /// Contains the transport ID. /// [System.Serializable] public class ReturnTransport : JsonSerializable { public int transport; } /// /// Used to deserialize transport-state information receieved from the transport.stateChanged topic. /// [System.Serializable] public class TransportState : JsonSerializable { public string gameObject; public string state; public string @object; public int transport; } /// /// Used to deserialize WAAPI error messages. /// [System.Serializable] public class ErrorMessage : JsonSerializable { public string message; public ErrorDetails details; } /// /// Used to deserialize details in WAAPI error messages. /// [System.Serializable] public class ErrorDetails : JsonSerializable { public string [] reasons; public string procedureUri; } /// /// Class used to deserialize a WAAPI response containing Wwise objects. /// [System.Serializable] public class ReturnWwiseObjects : JsonSerializable { public List @return; } /// /// Generic class to deserialize a WAAPI response containing Wwise objects with custom return options. /// [System.Serializable] public class ReturnWwiseObjects : JsonSerializable { public List @return; } /// /// Class used to deserialize selected Wwise objects published on the ak.wwise.ui.selectionChanged topic. /// [System.Serializable] public class SelectedWwiseObjects : JsonSerializable { public List objects; } /// /// Used to deserialize information published on the ak.wwise.core.@object.nameChanged topic. /// [System.Serializable] public class WwiseRenameInfo : JsonSerializable { public WwiseObjectInfoJsonObject @object; public string newName; public string oldName; public WwiseObjectInfo objectInfo; public void ParseInfo() { objectInfo = @object; } } /// /// Used to deserialize information published on the ak.wwise.core.@object.childAdded and ak.wwise.core.@object.childRemoved topics. /// [System.Serializable] public class WwiseChildModifiedInfo : JsonSerializable { public WwiseObjectInfoJsonObject parent; public WwiseObjectInfoJsonObject child; public WwiseObjectInfo parentInfo; public WwiseObjectInfo childInfo; public void ParseInfo() { parentInfo = parent; childInfo = child; } } /// /// Used to deserialize information from a request for a Wwise object. /// Implements an implicit cast to WwiseObjectInfo. /// [System.Serializable] public class WwiseObjectInfoJsonObject { public string id; public WwiseObjectInfoParent parent; public string name; public string type; public int childrenCount; public string path; public string filePath; public string workunitType; public string soundbankBnkFilePath; public static implicit operator WwiseObjectInfo(WwiseObjectInfoJsonObject info) { return ToObjectInfo(info); } public static WwiseObjectInfo ToObjectInfo(WwiseObjectInfoJsonObject info) { var type = info.type == null ? "" : info.type; var wutype = info.workunitType == null ? "" : info.workunitType; var objectType = WaapiHelper.GetWwiseObjectTypeFromString(type.ToLower(), wutype.ToLower()); var parentID = info.parent.id == null ? System.Guid.Empty : System.Guid.Parse(info.parent.id); var objectGuid = info.id == null ? System.Guid.Empty : System.Guid.Parse(info.id); return new WwiseObjectInfo { objectGUID = objectGuid, name = info.name, type = objectType, childrenCount = info.childrenCount, path = info.path, workUnitType = wutype, parentID = parentID, filePath = info.filePath, soundbankBnkFilePath = info.soundbankBnkFilePath }; } } /// /// Contains the GUID of the returned object's parent. /// [System.Serializable] public class WwiseObjectInfoParent { public string id; } /// /// Class containing the information returned by a WAAPI request for an object. /// [System.Serializable] public struct WwiseObjectInfo { public System.Guid objectGUID; public System.Guid parentID; public string name; public WwiseObjectType type; public int childrenCount; public string path; public string workUnitType; public string filePath; public string soundbankBnkFilePath; } /// /// Contains a helper function GetWwiseObjectTypeFromString. /// public static class WaapiHelper { public static WwiseObjectType GetWwiseObjectTypeFromString(string typeString, string workUnitType) { if (!WaapiKeywords.typeStringDict.ContainsKey(typeString)) return WwiseObjectType.None; if (workUnitType != string.Empty) { if (workUnitType == "folder") { return WaapiKeywords.typeStringDict["physicalfolder"]; } return WaapiKeywords.typeStringDict[typeString]; } return WaapiKeywords.typeStringDict[typeString]; } } /// /// Contains fields for specific WAAPI keywords. /// public class WaapiKeywords { public const string ACTION = "action"; public const string ANCESTORS = "ancestors"; public const string AT = "@"; public const string AUX_BUSSES = "auxBusses"; public const string BACK_SLASH = "\\"; public const string BANK_DATA = "bankData"; public const string BANK_INFO = "bankInfo"; public const string CHILD = "child"; public const string CHILDREN = "children"; public const string CHILDREN_COUNT = "childrenCount"; public const string CLASSID = "classId"; public const string COMMAND = "command"; public const string DATA = "data"; public const string DELETE_ITEMS = "Delete Items"; public const string DESCENDANTS = "descendants"; public const string DISPLAY_NAME = "displayName"; public const string DRAG_DROP_ITEMS = "Drag Drop Items"; public const string EVENT = "event"; public const string EVENTS = "events"; public const string FILEPATH = "filePath"; public const string FIND_IN_PROJECT_EXPLORER = "FindInProjectExplorerSyncGroup1"; public const string FOLDER = "Folder"; public const string FROM = "from"; public const string ID = "id"; public const string INCLUSIONS = "inclusions"; public const string INFO_FILE = "infoFile"; public const string IS_CONNECTED = "isConnected"; public const string LANGUAGE = "language"; public const string LANGUAGES = "languages"; public const string MAX = "max"; public const string MAX_RADIUS_ATTENUATION = "audioSource:maxRadiusAttenuation"; public const string MESSSAGE = "message"; public const string MIN = "min"; public const string NAME = "name"; public const string NAMECONTAINS = "name:contains"; public const string NEW = "new"; public const string NEW_NAME = "newName"; public const string NOTES = "notes"; public const string OBJECT = "object"; public const string OBJECTS = "objects"; public const string OF_TYPE = "ofType"; public const string OLD_NAME = "oldName"; public const string PARENT = "parent"; public const string PATH = "path"; public const string PHYSICAL_FOLDER = "PhysicalFolder"; public const string PLATFORM = "platform"; public const string PLATFORMS = "platforms"; public const string PLAY = "play"; public const string PLAYING = "playing"; public const string PLAYSTOP = "playStop"; public const string PLUGININFO_OPTIONS = "pluginInfo"; public const string PLUGININFO_RESPONSE = "PluginInfo"; public const string PROJECT = "Project"; public const string PROPERTY = "property"; public const string RADIUS = "radius"; public const string RANGE = "range"; public const string REBUILD = "rebuild"; public const string REDO = "Redo"; public const string RESTRICTION = "restriction"; public const string RETURN = "return"; public const string SEARCH = "search"; public const string SELECT = "select"; public const string SIZE = "size"; public const string SKIP_LANGUAGES = "skipLanguages"; public const string SOUNDBANK = "soundbank"; public const string SOUNDBANKS = "soundbanks"; public const string STATE = "state"; public const string STOP = "stop"; public const string STOPPED = "stopped"; public const string STRUCTURE = "structure"; public const string TRANSFORM = "transform"; public const string TRANSPORT = "transport"; public const string TYPE = "type"; public const string UI = "ui"; public const string UNDO = "Undo"; public const string VALUE = "value"; public const string VOLUME = "Volume"; public const string WHERE = "where"; public const string WORKUNIT_TYPE = "workunit:type"; public const string OPEN_SOUNDBANK_FOLDER = "OpenContainingFolderSoundbank"; public const string OPEN_WORKUNIT_FOLDER = "OpenContainingFolderWorkUnit"; public const string OPEN_WAV_FOLDER = "OpenContainingFolderWAV"; /// /// Maps WwiseObjectType to strings. /// public static ReadOnlyDictionary WwiseObjectTypeStrings = new ReadOnlyDictionary(new Dictionary() { {WwiseObjectType.None, "None"}, {WwiseObjectType.AuxBus, "AuxiliaryBus"}, {WwiseObjectType.Bus, "Bus"}, {WwiseObjectType.Event, "Event"}, {WwiseObjectType.Folder, "Folder"}, {WwiseObjectType.PhysicalFolder, "PhysicalFolder"}, {WwiseObjectType.Project, "Project"}, {WwiseObjectType.Soundbank, "SoundBank"}, {WwiseObjectType.State, "State"}, {WwiseObjectType.StateGroup, "StateGroup"}, {WwiseObjectType.Switch, "Switch"}, {WwiseObjectType.SwitchGroup, "SwitchGroup"}, {WwiseObjectType.WorkUnit, "WorkUnit"}, {WwiseObjectType.GameParameter, "Game Parametr"}, {WwiseObjectType.Trigger, "Trigger"}, {WwiseObjectType.AcousticTexture, "AcousticTexture"} }); /// /// Maps root folder names to displayed strings. /// public static ReadOnlyDictionary FolderDisplaynames = new ReadOnlyDictionary(new Dictionary() { {"Master-Mixer Hierarchy", "Auxiliary Busses" }, { "Events", "Events"}, { "States", "States"}, { "SoundBanks", "SoundBanks"}, { "Switches", "Switches"}, { "Virtual Acoustics", "Virtual Acoustics"}, }); /// /// Maps strings to WwiseObjectType. /// public static ReadOnlyDictionary typeStringDict = new ReadOnlyDictionary(new Dictionary() { ["auxbus"] = WwiseObjectType.AuxBus, ["bus"] = WwiseObjectType.Bus, ["event"] = WwiseObjectType.Event, ["folder"] = WwiseObjectType.Folder, ["physicalfolder"] = WwiseObjectType.PhysicalFolder, ["soundbank"] = WwiseObjectType.Soundbank, ["project"] = WwiseObjectType.Project, ["state"] = WwiseObjectType.State, ["stategroup"] = WwiseObjectType.StateGroup, ["switch"] = WwiseObjectType.Switch, ["switchgroup"] = WwiseObjectType.SwitchGroup, ["workunit"] = WwiseObjectType.WorkUnit, ["gameparameter"] = WwiseObjectType.GameParameter, ["trigger"] = WwiseObjectType.Trigger, ["acoustictexture"] = WwiseObjectType.AcousticTexture }); }