|
|
- /************************************************************************************
- Filename : ONSPPropagationInterface.cs
- Content : Interface into the Oculus Audio propagation functions
- Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
-
- Licensed under the Oculus SDK Version 3.5 (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.5/
-
- 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 System;
- using System.Runtime.InteropServices;
- using UnityEngine;
- using Oculus.Spatializer.Propagation;
-
- namespace Oculus
- {
- namespace Spatializer
- {
- namespace Propagation
- {
- /***********************************************************************************/
- // ENUMS and STRUCTS
- /***********************************************************************************/
- public enum FaceType : uint
- {
- TRIANGLES = 0,
- QUADS
- }
-
- public enum MaterialProperty : uint
- {
- ABSORPTION = 0,
- TRANSMISSION,
- SCATTERING
- }
-
- // Matches internal mesh layout
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct MeshGroup
- {
- public UIntPtr indexOffset;
- public UIntPtr faceCount;
- [MarshalAs(UnmanagedType.U4)]
- public FaceType faceType;
- public IntPtr material;
- }
- }
- }
- }
-
- class ONSPPropagation
- {
- static PropagationInterface CachedInterface;
- public static PropagationInterface Interface { get { if (CachedInterface == null) CachedInterface = FindInterface(); return CachedInterface; } }
-
- static PropagationInterface FindInterface()
- {
- IntPtr temp;
- try
- {
- WwisePluginInterface.ovrAudio_GetPluginContext(out temp, ClientType.OVRA_CLIENT_TYPE_WWISE_UNKNOWN);
- Debug.Log("Propagation initialized with Wwise Oculus Spatializer plugin");
- return new WwisePluginInterface();
- }
- catch(System.DllNotFoundException)
- {
- // this is fine
- }
- try
- {
- FMODPluginInterface.ovrAudio_GetPluginContext(out temp, ClientType.OVRA_CLIENT_TYPE_FMOD);
- Debug.Log("Propagation initialized with FMOD Oculus Spatializer plugin");
- return new FMODPluginInterface();
- }
- catch (System.DllNotFoundException)
- {
- // this is fine
- }
-
- Debug.Log("Propagation initialized with Unity Oculus Spatializer plugin");
- return new UnityNativeInterface();
- }
-
- public enum ovrAudioScalarType : uint
- {
- Int8,
- UInt8,
- Int16,
- UInt16,
- Int32,
- UInt32,
- Int64,
- UInt64,
- Float16,
- Float32,
- Float64
- }
-
- public class ClientType
- {
- // Copied from AudioSDK\OVRAudio\OVR_Audio_Internal.h
- public const uint OVRA_CLIENT_TYPE_NATIVE = 0;
- public const uint OVRA_CLIENT_TYPE_WWISE_2016 = 1;
- public const uint OVRA_CLIENT_TYPE_WWISE_2017_1 = 2;
- public const uint OVRA_CLIENT_TYPE_WWISE_2017_2 = 3;
- public const uint OVRA_CLIENT_TYPE_WWISE_2018_1 = 4;
- public const uint OVRA_CLIENT_TYPE_FMOD = 5;
- public const uint OVRA_CLIENT_TYPE_UNITY = 6;
- public const uint OVRA_CLIENT_TYPE_UE4 = 7;
- public const uint OVRA_CLIENT_TYPE_VST = 8;
- public const uint OVRA_CLIENT_TYPE_AAX = 9;
- public const uint OVRA_CLIENT_TYPE_TEST = 10;
- public const uint OVRA_CLIENT_TYPE_OTHER = 11;
- public const uint OVRA_CLIENT_TYPE_WWISE_UNKNOWN = 12;
- public const uint OVRA_CLIENT_TYPE_WWISE_2019_1 = 13;
- }
-
- public interface PropagationInterface
- {
- /***********************************************************************************/
- // Settings API
- int SetPropagationQuality(float quality);
- int SetPropagationThreadAffinity(UInt64 cpuMask);
-
- /***********************************************************************************/
- // Geometry API
- int CreateAudioGeometry(out IntPtr geometry);
- int DestroyAudioGeometry(IntPtr geometry);
- int AudioGeometryUploadMeshArrays(IntPtr geometry,
- float[] vertices, int vertexCount,
- int[] indices, int indexCount,
- MeshGroup[] groups, int groupCount);
- int AudioGeometrySetTransform(IntPtr geometry, float[] matrix4x4);
- int AudioGeometryGetTransform(IntPtr geometry, out float[] matrix4x4);
- int AudioGeometryWriteMeshFile(IntPtr geometry, string filePath);
- int AudioGeometryReadMeshFile(IntPtr geometry, string filePath);
- int AudioGeometryWriteMeshFileObj(IntPtr geometry, string filePath);
-
- /***********************************************************************************/
- // Material API
- int AudioMaterialGetFrequency(IntPtr material, MaterialProperty property, float frequency, out float value);
- int CreateAudioMaterial(out IntPtr material);
- int DestroyAudioMaterial(IntPtr material);
- int AudioMaterialSetFrequency(IntPtr material, MaterialProperty property, float frequency, float value);
- int AudioMaterialReset(IntPtr material, MaterialProperty property);
- }
-
- /***********************************************************************************/
- // UNITY NATIVE
- /***********************************************************************************/
- public class UnityNativeInterface : PropagationInterface
- {
- // The name used for the plugin DLL.
- public const string strOSPS = "AudioPluginOculusSpatializer";
-
- /***********************************************************************************/
- // Context API: Required to create internal context if it does not exist yet
- IntPtr context_ = IntPtr.Zero;
- IntPtr context { get { if (context_ == IntPtr.Zero) { ovrAudio_GetPluginContext(out context_, ClientType.OVRA_CLIENT_TYPE_UNITY); } return context_; } }
-
- [DllImport(strOSPS)]
- public static extern int ovrAudio_GetPluginContext(out IntPtr context, uint clientType);
-
- /***********************************************************************************/
- // Settings API
- [DllImport(strOSPS)]
- private static extern int ovrAudio_SetPropagationQuality(IntPtr context, float quality);
- public int SetPropagationQuality(float quality)
- {
- return ovrAudio_SetPropagationQuality(context, quality);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_SetPropagationThreadAffinity(IntPtr context, UInt64 cpuMask);
- public int SetPropagationThreadAffinity(UInt64 cpuMask)
- {
- return ovrAudio_SetPropagationThreadAffinity(context, cpuMask);
- }
-
- /***********************************************************************************/
- // Geometry API
- [DllImport(strOSPS)]
- private static extern int ovrAudio_CreateAudioGeometry(IntPtr context, out IntPtr geometry);
- public int CreateAudioGeometry(out IntPtr geometry)
- {
- return ovrAudio_CreateAudioGeometry(context, out geometry);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_DestroyAudioGeometry(IntPtr geometry);
- public int DestroyAudioGeometry(IntPtr geometry)
- {
- return ovrAudio_DestroyAudioGeometry(geometry);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryUploadMeshArrays(IntPtr geometry,
- float[] vertices, UIntPtr verticesBytesOffset, UIntPtr vertexCount, UIntPtr vertexStride, ovrAudioScalarType vertexType,
- int[] indices, UIntPtr indicesByteOffset, UIntPtr indexCount, ovrAudioScalarType indexType,
- MeshGroup[] groups, UIntPtr groupCount);
-
- public int AudioGeometryUploadMeshArrays(IntPtr geometry,
- float[] vertices, int vertexCount,
- int[] indices, int indexCount,
- MeshGroup[] groups, int groupCount)
- {
- return ovrAudio_AudioGeometryUploadMeshArrays(geometry,
- vertices, UIntPtr.Zero, (UIntPtr)vertexCount, UIntPtr.Zero, ovrAudioScalarType.Float32,
- indices, UIntPtr.Zero, (UIntPtr)indexCount, ovrAudioScalarType.UInt32,
- groups, (UIntPtr)groupCount);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometrySetTransform(IntPtr geometry, float[] matrix4x4);
- public int AudioGeometrySetTransform(IntPtr geometry, float[] matrix4x4)
- {
- return ovrAudio_AudioGeometrySetTransform(geometry, matrix4x4);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryGetTransform(IntPtr geometry, out float[] matrix4x4);
- public int AudioGeometryGetTransform(IntPtr geometry, out float[] matrix4x4)
- {
- return ovrAudio_AudioGeometryGetTransform(geometry, out matrix4x4);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryWriteMeshFile(IntPtr geometry, string filePath);
- public int AudioGeometryWriteMeshFile(IntPtr geometry, string filePath)
- {
- return ovrAudio_AudioGeometryWriteMeshFile(geometry, filePath);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryReadMeshFile(IntPtr geometry, string filePath);
- public int AudioGeometryReadMeshFile(IntPtr geometry, string filePath)
- {
- return ovrAudio_AudioGeometryReadMeshFile(geometry, filePath);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryWriteMeshFileObj(IntPtr geometry, string filePath);
- public int AudioGeometryWriteMeshFileObj(IntPtr geometry, string filePath)
- {
- return ovrAudio_AudioGeometryWriteMeshFileObj(geometry, filePath);
- }
-
- /***********************************************************************************/
- // Material API
- [DllImport(strOSPS)]
- private static extern int ovrAudio_CreateAudioMaterial(IntPtr context, out IntPtr material);
- public int CreateAudioMaterial(out IntPtr material)
- {
- return ovrAudio_CreateAudioMaterial(context, out material);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_DestroyAudioMaterial(IntPtr material);
- public int DestroyAudioMaterial(IntPtr material)
- {
- return ovrAudio_DestroyAudioMaterial(material);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioMaterialSetFrequency(IntPtr material, MaterialProperty property, float frequency, float value);
- public int AudioMaterialSetFrequency(IntPtr material, MaterialProperty property, float frequency, float value)
- {
- return ovrAudio_AudioMaterialSetFrequency(material, property, frequency, value);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioMaterialGetFrequency(IntPtr material, MaterialProperty property, float frequency, out float value);
- public int AudioMaterialGetFrequency(IntPtr material, MaterialProperty property, float frequency, out float value)
- {
- return ovrAudio_AudioMaterialGetFrequency(material, property, frequency, out value);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioMaterialReset(IntPtr material, MaterialProperty property);
- public int AudioMaterialReset(IntPtr material, MaterialProperty property)
- {
- return ovrAudio_AudioMaterialReset(material, property);
- }
- }
-
- /***********************************************************************************/
- // WWISE
- /***********************************************************************************/
- public class WwisePluginInterface : PropagationInterface
- {
- // The name used for the plugin DLL.
- public const string strOSPS = "OculusSpatializerWwise";
-
- /***********************************************************************************/
- // Context API: Required to create internal context if it does not exist yet
- IntPtr context_ = IntPtr.Zero;
- IntPtr context { get { if (context_ == IntPtr.Zero) { ovrAudio_GetPluginContext(out context_, ClientType.OVRA_CLIENT_TYPE_WWISE_UNKNOWN); } return context_; } }
-
- [DllImport(strOSPS)]
- public static extern int ovrAudio_GetPluginContext(out IntPtr context, uint clientType);
-
- /***********************************************************************************/
- // Settings API
- [DllImport(strOSPS)]
- private static extern int ovrAudio_SetPropagationQuality(IntPtr context, float quality);
- public int SetPropagationQuality(float quality)
- {
- return ovrAudio_SetPropagationQuality(context, quality);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_SetPropagationThreadAffinity(IntPtr context, UInt64 cpuMask);
- public int SetPropagationThreadAffinity(UInt64 cpuMask)
- {
- return ovrAudio_SetPropagationThreadAffinity(context, cpuMask);
- }
-
- /***********************************************************************************/
- // Geometry API
- [DllImport(strOSPS)]
- private static extern int ovrAudio_CreateAudioGeometry(IntPtr context, out IntPtr geometry);
- public int CreateAudioGeometry(out IntPtr geometry)
- {
- return ovrAudio_CreateAudioGeometry(context, out geometry);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_DestroyAudioGeometry(IntPtr geometry);
- public int DestroyAudioGeometry(IntPtr geometry)
- {
- return ovrAudio_DestroyAudioGeometry(geometry);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryUploadMeshArrays(IntPtr geometry,
- float[] vertices, UIntPtr verticesBytesOffset, UIntPtr vertexCount, UIntPtr vertexStride, ovrAudioScalarType vertexType,
- int[] indices, UIntPtr indicesByteOffset, UIntPtr indexCount, ovrAudioScalarType indexType,
- MeshGroup[] groups, UIntPtr groupCount);
-
- public int AudioGeometryUploadMeshArrays(IntPtr geometry,
- float[] vertices, int vertexCount,
- int[] indices, int indexCount,
- MeshGroup[] groups, int groupCount)
- {
- return ovrAudio_AudioGeometryUploadMeshArrays(geometry,
- vertices, UIntPtr.Zero, (UIntPtr)vertexCount, UIntPtr.Zero, ovrAudioScalarType.Float32,
- indices, UIntPtr.Zero, (UIntPtr)indexCount, ovrAudioScalarType.UInt32,
- groups, (UIntPtr)groupCount);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometrySetTransform(IntPtr geometry, float[] matrix4x4);
- public int AudioGeometrySetTransform(IntPtr geometry, float[] matrix4x4)
- {
- return ovrAudio_AudioGeometrySetTransform(geometry, matrix4x4);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryGetTransform(IntPtr geometry, out float[] matrix4x4);
- public int AudioGeometryGetTransform(IntPtr geometry, out float[] matrix4x4)
- {
- return ovrAudio_AudioGeometryGetTransform(geometry, out matrix4x4);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryWriteMeshFile(IntPtr geometry, string filePath);
- public int AudioGeometryWriteMeshFile(IntPtr geometry, string filePath)
- {
- return ovrAudio_AudioGeometryWriteMeshFile(geometry, filePath);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryReadMeshFile(IntPtr geometry, string filePath);
- public int AudioGeometryReadMeshFile(IntPtr geometry, string filePath)
- {
- return ovrAudio_AudioGeometryReadMeshFile(geometry, filePath);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryWriteMeshFileObj(IntPtr geometry, string filePath);
- public int AudioGeometryWriteMeshFileObj(IntPtr geometry, string filePath)
- {
- return ovrAudio_AudioGeometryWriteMeshFileObj(geometry, filePath);
- }
-
- /***********************************************************************************/
- // Material API
- [DllImport(strOSPS)]
- private static extern int ovrAudio_CreateAudioMaterial(IntPtr context, out IntPtr material);
- public int CreateAudioMaterial(out IntPtr material)
- {
- return ovrAudio_CreateAudioMaterial(context, out material);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_DestroyAudioMaterial(IntPtr material);
- public int DestroyAudioMaterial(IntPtr material)
- {
- return ovrAudio_DestroyAudioMaterial(material);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioMaterialSetFrequency(IntPtr material, MaterialProperty property, float frequency, float value);
- public int AudioMaterialSetFrequency(IntPtr material, MaterialProperty property, float frequency, float value)
- {
- return ovrAudio_AudioMaterialSetFrequency(material, property, frequency, value);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioMaterialGetFrequency(IntPtr material, MaterialProperty property, float frequency, out float value);
- public int AudioMaterialGetFrequency(IntPtr material, MaterialProperty property, float frequency, out float value)
- {
- return ovrAudio_AudioMaterialGetFrequency(material, property, frequency, out value);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioMaterialReset(IntPtr material, MaterialProperty property);
- public int AudioMaterialReset(IntPtr material, MaterialProperty property)
- {
- return ovrAudio_AudioMaterialReset(material, property);
- }
- }
-
- /***********************************************************************************/
- // FMOD
- /***********************************************************************************/
- public class FMODPluginInterface : PropagationInterface
- {
- // The name used for the plugin DLL.
- public const string strOSPS = "OculusSpatializerFMOD";
-
- /***********************************************************************************/
- // Context API: Required to create internal context if it does not exist yet
- IntPtr context_ = IntPtr.Zero;
- IntPtr context { get { if (context_ == IntPtr.Zero) { ovrAudio_GetPluginContext(out context_, ClientType.OVRA_CLIENT_TYPE_FMOD); } return context_; } }
-
- [DllImport(strOSPS)]
- public static extern int ovrAudio_GetPluginContext(out IntPtr context, uint clientType);
-
- /***********************************************************************************/
- // Settings API
- [DllImport(strOSPS)]
- private static extern int ovrAudio_SetPropagationQuality(IntPtr context, float quality);
- public int SetPropagationQuality(float quality)
- {
- return ovrAudio_SetPropagationQuality(context, quality);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_SetPropagationThreadAffinity(IntPtr context, UInt64 cpuMask);
- public int SetPropagationThreadAffinity(UInt64 cpuMask)
- {
- return ovrAudio_SetPropagationThreadAffinity(context, cpuMask);
- }
-
- /***********************************************************************************/
- // Geometry API
- [DllImport(strOSPS)]
- private static extern int ovrAudio_CreateAudioGeometry(IntPtr context, out IntPtr geometry);
- public int CreateAudioGeometry(out IntPtr geometry)
- {
- return ovrAudio_CreateAudioGeometry(context, out geometry);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_DestroyAudioGeometry(IntPtr geometry);
- public int DestroyAudioGeometry(IntPtr geometry)
- {
- return ovrAudio_DestroyAudioGeometry(geometry);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryUploadMeshArrays(IntPtr geometry,
- float[] vertices, UIntPtr verticesBytesOffset, UIntPtr vertexCount, UIntPtr vertexStride, ovrAudioScalarType vertexType,
- int[] indices, UIntPtr indicesByteOffset, UIntPtr indexCount, ovrAudioScalarType indexType,
- MeshGroup[] groups, UIntPtr groupCount);
-
- public int AudioGeometryUploadMeshArrays(IntPtr geometry,
- float[] vertices, int vertexCount,
- int[] indices, int indexCount,
- MeshGroup[] groups, int groupCount)
- {
- return ovrAudio_AudioGeometryUploadMeshArrays(geometry,
- vertices, UIntPtr.Zero, (UIntPtr)vertexCount, UIntPtr.Zero, ovrAudioScalarType.Float32,
- indices, UIntPtr.Zero, (UIntPtr)indexCount, ovrAudioScalarType.UInt32,
- groups, (UIntPtr)groupCount);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometrySetTransform(IntPtr geometry, float[] matrix4x4);
- public int AudioGeometrySetTransform(IntPtr geometry, float[] matrix4x4)
- {
- return ovrAudio_AudioGeometrySetTransform(geometry, matrix4x4);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryGetTransform(IntPtr geometry, out float[] matrix4x4);
- public int AudioGeometryGetTransform(IntPtr geometry, out float[] matrix4x4)
- {
- return ovrAudio_AudioGeometryGetTransform(geometry, out matrix4x4);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryWriteMeshFile(IntPtr geometry, string filePath);
- public int AudioGeometryWriteMeshFile(IntPtr geometry, string filePath)
- {
- return ovrAudio_AudioGeometryWriteMeshFile(geometry, filePath);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryReadMeshFile(IntPtr geometry, string filePath);
- public int AudioGeometryReadMeshFile(IntPtr geometry, string filePath)
- {
- return ovrAudio_AudioGeometryReadMeshFile(geometry, filePath);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioGeometryWriteMeshFileObj(IntPtr geometry, string filePath);
- public int AudioGeometryWriteMeshFileObj(IntPtr geometry, string filePath)
- {
- return ovrAudio_AudioGeometryWriteMeshFileObj(geometry, filePath);
- }
-
- /***********************************************************************************/
- // Material API
- [DllImport(strOSPS)]
- private static extern int ovrAudio_CreateAudioMaterial(IntPtr context, out IntPtr material);
- public int CreateAudioMaterial(out IntPtr material)
- {
- return ovrAudio_CreateAudioMaterial(context, out material);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_DestroyAudioMaterial(IntPtr material);
- public int DestroyAudioMaterial(IntPtr material)
- {
- return ovrAudio_DestroyAudioMaterial(material);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioMaterialSetFrequency(IntPtr material, MaterialProperty property, float frequency, float value);
- public int AudioMaterialSetFrequency(IntPtr material, MaterialProperty property, float frequency, float value)
- {
- return ovrAudio_AudioMaterialSetFrequency(material, property, frequency, value);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioMaterialGetFrequency(IntPtr material, MaterialProperty property, float frequency, out float value);
- public int AudioMaterialGetFrequency(IntPtr material, MaterialProperty property, float frequency, out float value)
- {
- return ovrAudio_AudioMaterialGetFrequency(material, property, frequency, out value);
- }
-
- [DllImport(strOSPS)]
- private static extern int ovrAudio_AudioMaterialReset(IntPtr material, MaterialProperty property);
- public int AudioMaterialReset(IntPtr material, MaterialProperty property)
- {
- return ovrAudio_AudioMaterialReset(material, property);
- }
- }
- }
|