/************************************************************************************
|
|
Filename : ONSPAmbisonicsNative.cs
|
|
Content : Native interface into the Oculus Ambisonics
|
|
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 UnityEngine;
|
|
using System.Collections;
|
|
using System.Runtime.InteropServices;
|
|
|
|
public class ONSPAmbisonicsNative : MonoBehaviour
|
|
{
|
|
#if !UNITY_5
|
|
static int numFOAChannels = 4; // we are only dealing with 1st order Ambisonics at this time
|
|
static int paramVSpeakerMode = 6; // set speaker mode (OculusAmbi or VSpeaker)
|
|
static int paramAmbiStat = 7; // use this to return internal Ambisonic status
|
|
|
|
// Staus codes that may return from Ambisonic engine
|
|
public enum ovrAmbisonicsNativeStatus
|
|
{
|
|
Uninitialized = -1, // Ambisonic stream not initialized (inital status)
|
|
NotEnabled, // Ambisonic has not been enabled on clip
|
|
Success, // Stream initialized and playing
|
|
StreamError, // Something wrong with input stream (not a 4-channel AmbiX format stream?)
|
|
ProcessError, // Handling of stream error
|
|
MaxStatValue
|
|
};
|
|
|
|
// current status
|
|
ovrAmbisonicsNativeStatus currentStatus = ovrAmbisonicsNativeStatus.Uninitialized;
|
|
|
|
// true to use Virtual Speaker output. Otherwise use OculusAmbi
|
|
[SerializeField]
|
|
private bool useVirtualSpeakers = false;
|
|
public bool UseVirtualSpeakers
|
|
{
|
|
get
|
|
{
|
|
return useVirtualSpeakers;
|
|
}
|
|
set
|
|
{
|
|
useVirtualSpeakers = value;
|
|
}
|
|
}
|
|
#endif
|
|
/// <summary>
|
|
/// OnEnable this instance.
|
|
/// </summary>
|
|
void OnEnable()
|
|
{
|
|
// Unity 4 is deprecated; UNITY_5 still valid with plug-in
|
|
#if UNITY_5
|
|
Debug.Log("Ambisonic ERROR: Ambisonic support in Unity 2017 or higher");
|
|
#else
|
|
|
|
AudioSource source = GetComponent<AudioSource>();
|
|
|
|
currentStatus = ovrAmbisonicsNativeStatus.Uninitialized;
|
|
|
|
if (source == null)
|
|
{
|
|
Debug.Log("Ambisonic ERROR: AudioSource does not exist.");
|
|
}
|
|
else
|
|
{
|
|
if(source.spatialize == true)
|
|
{
|
|
Debug.Log("Ambisonic WARNING: Turning spatialize field off for Ambisonic sources.");
|
|
source.spatialize = false;
|
|
}
|
|
|
|
if (source.clip == null)
|
|
{
|
|
Debug.Log("Ambisonic ERROR: AudioSource does not contain an audio clip.");
|
|
}
|
|
else
|
|
{
|
|
if(source.clip.channels != numFOAChannels)
|
|
{
|
|
Debug.Log("Ambisonic ERROR: AudioSource clip does not have correct number of channels.");
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
// Unity 4 is deprecated; UNITY_5 still valid with plug-in
|
|
#if !UNITY_5
|
|
/// <summary>
|
|
/// Update this instance.
|
|
/// </summary>
|
|
void Update()
|
|
{
|
|
AudioSource source = GetComponent<AudioSource>();
|
|
|
|
if (source == null)
|
|
{
|
|
// We already caught the error in Awake so bail
|
|
return;
|
|
}
|
|
|
|
// Set speaker mode
|
|
if(useVirtualSpeakers == true)
|
|
source.SetAmbisonicDecoderFloat(paramVSpeakerMode, 1.0f); // VSpeakerMode
|
|
else
|
|
source.SetAmbisonicDecoderFloat(paramVSpeakerMode, 0.0f); // OclusAmbi
|
|
|
|
float statusF = 0.0f;
|
|
// PGG 5/25/2017 There is a bug in the 2017.2 beta that does not
|
|
// allow for ambisonic params to be passed through to native
|
|
// from C# Get latest editor from Unity when available
|
|
source.GetAmbisonicDecoderFloat(paramAmbiStat, out statusF);
|
|
|
|
ovrAmbisonicsNativeStatus status = (ovrAmbisonicsNativeStatus)statusF;
|
|
|
|
// TODO: Add native result/error codes
|
|
if (status != currentStatus)
|
|
{
|
|
switch(status)
|
|
{
|
|
case (ovrAmbisonicsNativeStatus.NotEnabled):
|
|
Debug.Log("Ambisonic Native: Ambisonic not enabled on clip. Check clip field and turn it on");
|
|
break;
|
|
|
|
case (ovrAmbisonicsNativeStatus.Uninitialized):
|
|
Debug.Log("Ambisonic Native: Stream uninitialized");
|
|
break;
|
|
|
|
case (ovrAmbisonicsNativeStatus.Success):
|
|
Debug.Log("Ambisonic Native: Stream successfully initialized and playing/playable");
|
|
break;
|
|
|
|
case (ovrAmbisonicsNativeStatus.StreamError):
|
|
Debug.Log("Ambisonic Native WARNING: Stream error (bad input format?)");
|
|
break;
|
|
|
|
case (ovrAmbisonicsNativeStatus.ProcessError):
|
|
Debug.Log("Ambisonic Native WARNING: Stream process error (check default speaker setup)");
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
currentStatus = status;
|
|
}
|
|
#endif
|
|
}
|