Updated oculus stuff
This commit is contained in:
9
Assets/Oculus/VoiceMod/Scripts/Helpers.meta
Normal file
9
Assets/Oculus/VoiceMod/Scripts/Helpers.meta
Normal file
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 30e0cd6fabc83a94ea16a972dd7778a0
|
||||
folderAsset: yes
|
||||
timeCreated: 1450118836
|
||||
licenseType: Store
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
223
Assets/Oculus/VoiceMod/Scripts/Helpers/OVRDebugConsole.cs
Normal file
223
Assets/Oculus/VoiceMod/Scripts/Helpers/OVRDebugConsole.cs
Normal file
@@ -0,0 +1,223 @@
|
||||
/************************************************************************************
|
||||
Filename : OVRDebugConsole.cs
|
||||
Content : Write to a text string, used by UI.Text
|
||||
Created : May 22, 2015
|
||||
Copyright : Copyright 2015 Oculus VR, Inc. All Rights reserved.
|
||||
|
||||
Licensed under the Oculus VR Rift SDK License Version 3.1 (the "License");
|
||||
you may not use the Oculus VR Rift 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
|
||||
|
||||
http://www.oculusvr.com/licenses/LICENSE-3.1
|
||||
|
||||
Unless required by applicable law or agreed to in writing, the Oculus VR 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 UnityEngine.UI;
|
||||
using System.Collections;
|
||||
|
||||
public class OVRDebugConsole : MonoBehaviour
|
||||
{
|
||||
public ArrayList messages = new ArrayList();
|
||||
public int maxMessages = 15; // The max number of messages displayed
|
||||
public Text textMsg; // text string to display
|
||||
|
||||
// Our instance to allow this script to be called without a direct connection.
|
||||
private static OVRDebugConsole s_Instance = null;
|
||||
|
||||
// Clear timeout
|
||||
private bool clearTimeoutOn = false;
|
||||
private float clearTimeout = 0.0f;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the instance.
|
||||
/// </summary>
|
||||
/// <value>The instance.</value>
|
||||
public static OVRDebugConsole instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (s_Instance == null)
|
||||
{
|
||||
s_Instance = FindObjectOfType(typeof(OVRDebugConsole)) as OVRDebugConsole;
|
||||
|
||||
if (s_Instance == null)
|
||||
{
|
||||
GameObject console = new GameObject();
|
||||
console.AddComponent<OVRDebugConsole>();
|
||||
console.name = "OVRDebugConsole";
|
||||
s_Instance = FindObjectOfType(typeof(OVRDebugConsole)) as OVRDebugConsole;
|
||||
}
|
||||
}
|
||||
|
||||
return s_Instance;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Awake this instance.
|
||||
/// </summary>
|
||||
void Awake()
|
||||
{
|
||||
s_Instance = this;
|
||||
Init();
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update this instance.
|
||||
/// </summary>
|
||||
void Update()
|
||||
{
|
||||
if(clearTimeoutOn == true)
|
||||
{
|
||||
clearTimeout -= Time.deltaTime;
|
||||
if(clearTimeout < 0.0f)
|
||||
{
|
||||
Clear();
|
||||
clearTimeout = 0.0f;
|
||||
clearTimeoutOn = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Init this instance.
|
||||
/// </summary>
|
||||
public void Init()
|
||||
{
|
||||
if(textMsg == null)
|
||||
{
|
||||
Debug.LogWarning("DebugConsole Init WARNING::UI text not set. Will not be able to display anything.");
|
||||
}
|
||||
|
||||
Clear();
|
||||
}
|
||||
|
||||
|
||||
//+++++++++ INTERFACE FUNCTIONS ++++++++++++++++++++++++++++++++
|
||||
|
||||
/// <summary>
|
||||
/// Log the specified message.
|
||||
/// </summary>
|
||||
/// <param name="message">Message.</param>
|
||||
public static void Log(string message)
|
||||
{
|
||||
OVRDebugConsole.instance.AddMessage(message, Color.white);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Log the specified message and color.
|
||||
/// </summary>
|
||||
/// <param name="message">Message.</param>
|
||||
/// <param name="color">Color.</param>
|
||||
public static void Log(string message, Color color)
|
||||
{
|
||||
OVRDebugConsole.instance.AddMessage(message, color);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clear this instance.
|
||||
/// </summary>
|
||||
public static void Clear()
|
||||
{
|
||||
OVRDebugConsole.instance.ClearMessages();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calls clear after a certain time.
|
||||
/// </summary>
|
||||
/// <param name="timeToClear">Time to clear.</param>
|
||||
public static void ClearTimeout(float timeToClear)
|
||||
{
|
||||
OVRDebugConsole.instance.SetClearTimeout(timeToClear);
|
||||
}
|
||||
|
||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Adds the message.
|
||||
/// </summary>
|
||||
/// <param name="message">Message.</param>
|
||||
/// <param name="color">Color.</param>
|
||||
public void AddMessage(string message, Color color)
|
||||
{
|
||||
messages.Add(message);
|
||||
|
||||
if(textMsg != null)
|
||||
textMsg.color = color;
|
||||
|
||||
Display();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clears the messages.
|
||||
/// </summary>
|
||||
public void ClearMessages()
|
||||
{
|
||||
messages.Clear();
|
||||
Display();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the clear timeout.
|
||||
/// </summary>
|
||||
/// <param name="timeout">Timeout.</param>
|
||||
public void SetClearTimeout(float timeout)
|
||||
{
|
||||
clearTimeout = timeout;
|
||||
clearTimeoutOn = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
// Prunes the array to fit within the maxMessages limit
|
||||
/// </summary>
|
||||
void Prune()
|
||||
{
|
||||
int diff;
|
||||
if (messages.Count > maxMessages)
|
||||
{
|
||||
if (messages.Count <= 0)
|
||||
{
|
||||
diff = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
diff = messages.Count - maxMessages;
|
||||
}
|
||||
messages.RemoveRange(0, (int)diff);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Display this instance.
|
||||
/// </summary>
|
||||
void Display()
|
||||
{
|
||||
if (messages.Count > maxMessages)
|
||||
{
|
||||
Prune();
|
||||
}
|
||||
|
||||
if(textMsg != null)
|
||||
{
|
||||
textMsg.text = ""; // Clear text out
|
||||
int x = 0;
|
||||
|
||||
while (x < messages.Count)
|
||||
{
|
||||
textMsg.text += (string)messages[x];
|
||||
textMsg.text +='\n';
|
||||
x += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 032142ba4fe4a53458d86dc9a8610f36
|
||||
timeCreated: 1450118836
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
470
Assets/Oculus/VoiceMod/Scripts/Helpers/OVRMessenger.cs
Normal file
470
Assets/Oculus/VoiceMod/Scripts/Helpers/OVRMessenger.cs
Normal file
@@ -0,0 +1,470 @@
|
||||
/************************************************************************************
|
||||
Filename : OVRMessenger.cs
|
||||
Content : Base component OVR class
|
||||
Created : January 8, 2013
|
||||
Authors : Peter Giokaris
|
||||
Copyright : Copyright 2014 Oculus VR, LLC. All Rights reserved.
|
||||
|
||||
Use of this software is subject to the terms of the Oculus LLC license
|
||||
agreement provided at the time of installation or download, or which
|
||||
otherwise accompanies this software in either electronic or hard copy form.
|
||||
|
||||
Messenger.cs from Unity3d: http://wiki.unity3d.com/index.php/Advanced_CSharp_Messenger
|
||||
|
||||
Renamed to OVRMessenger
|
||||
|
||||
* Advanced C# messenger by Ilya Suzdalnitski. V1.0
|
||||
*
|
||||
* Based on Rod Hyde's "CSharpMessenger" and Magnus Wolffelt's "CSharpMessenger Extended".
|
||||
*
|
||||
* Features:
|
||||
* Prevents a MissingReferenceException because of a reference to a destroyed message handler.
|
||||
* Option to log all messages
|
||||
* Extensive error detection, preventing silent bugs
|
||||
*
|
||||
* Usage examples:
|
||||
1. Messenger.AddListener<GameObject>("prop collected", PropCollected);
|
||||
Messenger.Broadcast<GameObject>("prop collected", prop);
|
||||
2. Messenger.AddListener<float>("speed changed", SpeedChanged);
|
||||
Messenger.Broadcast<float>("speed changed", 0.5f);
|
||||
*
|
||||
* Messenger cleans up its evenTable automatically upon loading of a new level.
|
||||
*
|
||||
* Don't forget that the messages that should survive the cleanup, should be marked with Messenger.MarkAsPermanent(string)
|
||||
*
|
||||
|
||||
************************************************************************************/
|
||||
//#define LOG_ALL_MESSAGES
|
||||
//#define LOG_ADD_LISTENER
|
||||
//#define LOG_BROADCAST_MESSAGE
|
||||
//#define REQUIRE_LISTENER
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
// Add more delegate types here and implement them the same way below..
|
||||
public delegate void OVRCallback();
|
||||
public delegate void OVRCallback<T>(T arg1);
|
||||
public delegate void OVRCallback<T, U>(T arg1, U arg2);
|
||||
public delegate void OVRCallback<T, U, V>(T arg1, U arg2, V arg3);
|
||||
|
||||
static internal class OVRMessenger {
|
||||
|
||||
#region Internal variables
|
||||
//Disable the unused variable warning
|
||||
#pragma warning disable 0414
|
||||
//Ensures that the MessengerHelper will be created automatically upon start of the game.
|
||||
static private MessengerHelper messengerHelper = ( new GameObject("MessengerHelper") ).AddComponent< MessengerHelper >();
|
||||
#pragma warning restore 0414
|
||||
|
||||
static public Dictionary<string, Delegate> eventTable = new Dictionary<string, Delegate>();
|
||||
|
||||
//Message handlers that should never be removed, regardless of calling Cleanup
|
||||
static public List< string > permanentMessages = new List< string > ();
|
||||
#endregion
|
||||
|
||||
#region Helper methods
|
||||
|
||||
/// <summary>
|
||||
/// Marks a certain message as permanent.
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
static public void MarkAsPermanent(string eventType)
|
||||
{
|
||||
#if LOG_ALL_MESSAGES
|
||||
Debug.Log("Messenger MarkAsPermanent \t\"" + eventType + "\"");
|
||||
#endif
|
||||
permanentMessages.Add( eventType );
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Cleanup this instance.
|
||||
/// </summary>
|
||||
static public void Cleanup()
|
||||
{
|
||||
#if LOG_ALL_MESSAGES
|
||||
Debug.Log("MESSENGER Cleanup. Make sure that none of necessary listeners are removed.");
|
||||
#endif
|
||||
List< string > messagesToRemove = new List<string>();
|
||||
|
||||
foreach (KeyValuePair<string, Delegate> pair in eventTable) {
|
||||
bool wasFound = false;
|
||||
|
||||
foreach (string message in permanentMessages) {
|
||||
|
||||
if (pair.Key == message) {
|
||||
wasFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!wasFound)
|
||||
messagesToRemove.Add( pair.Key );
|
||||
}
|
||||
|
||||
|
||||
foreach (string message in messagesToRemove) {
|
||||
eventTable.Remove( message );
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Prints the event table.
|
||||
/// </summary>
|
||||
static public void PrintEventTable()
|
||||
{
|
||||
Debug.Log("\t\t\t=== MESSENGER PrintEventTable ===");
|
||||
|
||||
foreach (KeyValuePair<string, Delegate> pair in eventTable) {
|
||||
Debug.Log("\t\t\t" + pair.Key + "\t\t" + pair.Value);
|
||||
}
|
||||
|
||||
Debug.Log("\n");
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Message logging and exception throwing
|
||||
/// <summary>
|
||||
/// Raises the listener adding event.
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
/// <param name="listenerBeingAdded">Listener being added.</param>
|
||||
static public void OnListenerAdding(string eventType, Delegate listenerBeingAdded)
|
||||
{
|
||||
#if LOG_ALL_MESSAGES || LOG_ADD_LISTENER
|
||||
Debug.Log("MESSENGER OnListenerAdding \t\"" + eventType + "\"\t{" + listenerBeingAdded.Target + " -> " + listenerBeingAdded.Method + "}");
|
||||
#endif
|
||||
|
||||
if (!eventTable.ContainsKey(eventType)) {
|
||||
eventTable.Add(eventType, null );
|
||||
}
|
||||
|
||||
Delegate d = eventTable[eventType];
|
||||
|
||||
if (d != null && d.GetType() != listenerBeingAdded.GetType()) {
|
||||
throw new ListenerException(string.Format("Attempting to add listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being added has type {2}", eventType, d.GetType().Name, listenerBeingAdded.GetType().Name));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raises the listener removing event.
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
/// <param name="listenerBeingRemoved">Listener being removed.</param>
|
||||
static public void OnListenerRemoving(string eventType, Delegate listenerBeingRemoved)
|
||||
{
|
||||
|
||||
#if LOG_ALL_MESSAGES
|
||||
Debug.Log("MESSENGER OnListenerRemoving \t\"" + eventType + "\"\t{" + listenerBeingRemoved.Target + " -> " + listenerBeingRemoved.Method + "}");
|
||||
#endif
|
||||
|
||||
if (eventTable.ContainsKey(eventType))
|
||||
{
|
||||
Delegate d = eventTable[eventType];
|
||||
|
||||
if (d == null)
|
||||
{
|
||||
throw new ListenerException(string.Format("Attempting to remove listener with for event type \"{0}\" but current listener is null.", eventType));
|
||||
} else if (d.GetType() != listenerBeingRemoved.GetType())
|
||||
{
|
||||
throw new ListenerException(string.Format("Attempting to remove listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being removed has type {2}", eventType, d.GetType().Name, listenerBeingRemoved.GetType().Name));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ListenerException(string.Format("Attempting to remove listener for type \"{0}\" but Messenger doesn't know about this event type.", eventType));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raises the listener removed event.
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
static public void OnListenerRemoved(string eventType) {
|
||||
|
||||
if (eventTable[eventType] == null) {
|
||||
eventTable.Remove(eventType);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raises the broadcasting event.
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
static public void OnBroadcasting(string eventType)
|
||||
{
|
||||
|
||||
#if REQUIRE_LISTENER
|
||||
if (!eventTable.ContainsKey(eventType)) {
|
||||
throw new BroadcastException(string.Format("Broadcasting message \"{0}\" but no listener found. Try marking the message with Messenger.MarkAsPermanent.", eventType));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates the broadcast signature exception.
|
||||
/// </summary>
|
||||
/// <returns>The broadcast signature exception.</returns>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
static public BroadcastException CreateBroadcastSignatureException(string eventType)
|
||||
{
|
||||
return new BroadcastException(string.Format("Broadcasting message \"{0}\" but listeners have a different signature than the broadcaster.", eventType));
|
||||
}
|
||||
|
||||
public class BroadcastException : Exception
|
||||
{
|
||||
public BroadcastException(string msg)
|
||||
: base(msg)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public class ListenerException : Exception
|
||||
{
|
||||
public ListenerException(string msg)
|
||||
: base(msg)
|
||||
{
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region AddListener
|
||||
/// <summary>
|
||||
/// No parameters.
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
/// <param name="handler">Handler.</param>
|
||||
static public void AddListener(string eventType, OVRCallback handler)
|
||||
{
|
||||
OnListenerAdding(eventType, handler);
|
||||
eventTable[eventType] = (OVRCallback)eventTable[eventType] + handler;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Single parameter.
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
/// <param name="handler">Handler.</param>
|
||||
/// <typeparam name="T">The 1st type parameter.</typeparam>
|
||||
static public void AddListener<T>(string eventType, OVRCallback<T> handler)
|
||||
{
|
||||
OnListenerAdding(eventType, handler);
|
||||
eventTable[eventType] = (OVRCallback<T>)eventTable[eventType] + handler;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Two parameters.
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
/// <param name="handler">Handler.</param>
|
||||
/// <typeparam name="T">The 1st type parameter.</typeparam>
|
||||
/// <typeparam name="U">The 2nd type parameter.</typeparam>
|
||||
static public void AddListener<T, U>(string eventType, OVRCallback<T, U> handler)
|
||||
{
|
||||
OnListenerAdding(eventType, handler);
|
||||
eventTable[eventType] = (OVRCallback<T, U>)eventTable[eventType] + handler;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Three parameters
|
||||
/// </summary
|
||||
/// <param name="eventType">Event type.</param>
|
||||
/// <param name="handler">Handler.</param>
|
||||
/// <typeparam name="T">The 1st type parameter.</typeparam>
|
||||
/// <typeparam name="U">The 2nd type parameter.</typeparam>
|
||||
/// <typeparam name="V">The 3rd type parameter.</typeparam>
|
||||
static public void AddListener<T, U, V>(string eventType, OVRCallback<T, U, V> handler)
|
||||
{
|
||||
OnListenerAdding(eventType, handler);
|
||||
eventTable[eventType] = (OVRCallback<T, U, V>)eventTable[eventType] + handler;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region RemoveListener
|
||||
/// <summary>
|
||||
/// No parameters
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
/// <param name="handler">Handler.</param>
|
||||
static public void RemoveListener(string eventType, OVRCallback handler)
|
||||
{
|
||||
OnListenerRemoving(eventType, handler);
|
||||
eventTable[eventType] = (OVRCallback)eventTable[eventType] - handler;
|
||||
OnListenerRemoved(eventType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Single parameter
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
/// <param name="handler">Handler.</param>
|
||||
/// <typeparam name="T">The 1st type parameter.</typeparam>
|
||||
static public void RemoveListener<T>(string eventType, OVRCallback<T> handler)
|
||||
{
|
||||
OnListenerRemoving(eventType, handler);
|
||||
eventTable[eventType] = (OVRCallback<T>)eventTable[eventType] - handler;
|
||||
OnListenerRemoved(eventType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Two parameters
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
/// <param name="handler">Handler.</param>
|
||||
/// <typeparam name="T">The 1st type parameter.</typeparam>
|
||||
/// <typeparam name="U">The 2nd type parameter.</typeparam>
|
||||
static public void RemoveListener<T, U>(string eventType, OVRCallback<T, U> handler)
|
||||
{
|
||||
OnListenerRemoving(eventType, handler);
|
||||
eventTable[eventType] = (OVRCallback<T, U>)eventTable[eventType] - handler;
|
||||
OnListenerRemoved(eventType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
//Three parameters.
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
/// <param name="handler">Handler.</param>
|
||||
/// <typeparam name="T">The 1st type parameter.</typeparam>
|
||||
/// <typeparam name="U">The 2nd type parameter.</typeparam>
|
||||
/// <typeparam name="V">The 3rd type parameter.</typeparam>
|
||||
static public void RemoveListener<T, U, V>(string eventType, OVRCallback<T, U, V> handler)
|
||||
{
|
||||
OnListenerRemoving(eventType, handler);
|
||||
eventTable[eventType] = (OVRCallback<T, U, V>)eventTable[eventType] - handler;
|
||||
OnListenerRemoved(eventType);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Broadcast
|
||||
/// <summary>
|
||||
/// Broadcast the specified eventType.
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
static public void Broadcast(string eventType)
|
||||
{
|
||||
#if LOG_ALL_MESSAGES || LOG_BROADCAST_MESSAGE
|
||||
Debug.Log("MESSENGER\t" + System.DateTime.Now.ToString("hh:mm:ss.fff") + "\t\t\tInvoking \t\"" + eventType + "\"");
|
||||
#endif
|
||||
OnBroadcasting(eventType);
|
||||
|
||||
Delegate d;
|
||||
if (eventTable.TryGetValue(eventType, out d)) {
|
||||
OVRCallback callback = d as OVRCallback;
|
||||
|
||||
if (callback != null) {
|
||||
callback();
|
||||
} else {
|
||||
throw CreateBroadcastSignatureException(eventType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Broadcast the specified eventType and arg1.
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
/// <param name="arg1">Arg1.</param>
|
||||
/// <typeparam name="T">The 1st type parameter.</typeparam>
|
||||
static public void Broadcast<T>(string eventType, T arg1) {
|
||||
#if LOG_ALL_MESSAGES || LOG_BROADCAST_MESSAGE
|
||||
Debug.Log("MESSENGER\t" + System.DateTime.Now.ToString("hh:mm:ss.fff") + "\t\t\tInvoking \t\"" + eventType + "\"");
|
||||
#endif
|
||||
OnBroadcasting(eventType);
|
||||
|
||||
Delegate d;
|
||||
|
||||
if (eventTable.TryGetValue(eventType, out d)) {
|
||||
OVRCallback<T> callback = d as OVRCallback<T>;
|
||||
|
||||
if (callback != null) {
|
||||
callback(arg1);
|
||||
} else {
|
||||
throw CreateBroadcastSignatureException(eventType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Broadcast the specified eventType, arg1 and arg2.
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
/// <param name="arg1">Arg1.</param>
|
||||
/// <param name="arg2">Arg2.</param>
|
||||
/// <typeparam name="T">The 1st type parameter.</typeparam>
|
||||
/// <typeparam name="U">The 2nd type parameter.</typeparam>
|
||||
static public void Broadcast<T, U>(string eventType, T arg1, U arg2)
|
||||
{
|
||||
#if LOG_ALL_MESSAGES || LOG_BROADCAST_MESSAGE
|
||||
Debug.Log("MESSENGER\t" + System.DateTime.Now.ToString("hh:mm:ss.fff") + "\t\t\tInvoking \t\"" + eventType + "\"");
|
||||
#endif
|
||||
OnBroadcasting(eventType);
|
||||
|
||||
Delegate d;
|
||||
|
||||
if (eventTable.TryGetValue(eventType, out d)) {
|
||||
OVRCallback<T, U> callback = d as OVRCallback<T, U>;
|
||||
|
||||
if (callback != null) {
|
||||
callback(arg1, arg2);
|
||||
} else {
|
||||
throw CreateBroadcastSignatureException(eventType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Broadcast the specified eventType, arg1, arg2 and arg3.
|
||||
/// </summary>
|
||||
/// <param name="eventType">Event type.</param>
|
||||
/// <param name="arg1">Arg1.</param>
|
||||
/// <param name="arg2">Arg2.</param>
|
||||
/// <param name="arg3">Arg3.</param>
|
||||
/// <typeparam name="T">The 1st type parameter.</typeparam>
|
||||
/// <typeparam name="U">The 2nd type parameter.</typeparam>
|
||||
/// <typeparam name="V">The 3rd type parameter.</typeparam>
|
||||
static public void Broadcast<T, U, V>(string eventType, T arg1, U arg2, V arg3)
|
||||
{
|
||||
#if LOG_ALL_MESSAGES || LOG_BROADCAST_MESSAGE
|
||||
Debug.Log("MESSENGER\t" + System.DateTime.Now.ToString("hh:mm:ss.fff") + "\t\t\tInvoking \t\"" + eventType + "\"");
|
||||
#endif
|
||||
OnBroadcasting(eventType);
|
||||
|
||||
Delegate d;
|
||||
if (eventTable.TryGetValue(eventType, out d)) {
|
||||
OVRCallback<T, U, V> callback = d as OVRCallback<T, U, V>;
|
||||
|
||||
if (callback != null) {
|
||||
callback(arg1, arg2, arg3);
|
||||
} else {
|
||||
throw CreateBroadcastSignatureException(eventType);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Messenger helper.
|
||||
/// This manager will ensure that the messenger's eventTable will be cleaned up upon loading of a new level.
|
||||
/// </summary>
|
||||
public sealed class MessengerHelper : MonoBehaviour
|
||||
{
|
||||
/// <summary>
|
||||
/// Awake this instance.
|
||||
/// </summary>
|
||||
void Awake ()
|
||||
{
|
||||
DontDestroyOnLoad(gameObject);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raises the disable event.
|
||||
/// </summary>
|
||||
public void OnDisable()
|
||||
{
|
||||
OVRMessenger.Cleanup();
|
||||
}
|
||||
}
|
||||
12
Assets/Oculus/VoiceMod/Scripts/Helpers/OVRMessenger.cs.meta
Normal file
12
Assets/Oculus/VoiceMod/Scripts/Helpers/OVRMessenger.cs.meta
Normal file
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c7841d42721591642aa796e18d66d248
|
||||
timeCreated: 1447374135
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
297
Assets/Oculus/VoiceMod/Scripts/Helpers/OVRMicInput.cs
Normal file
297
Assets/Oculus/VoiceMod/Scripts/Helpers/OVRMicInput.cs
Normal file
@@ -0,0 +1,297 @@
|
||||
/************************************************************************************
|
||||
Filename : OVRMicInput.cs
|
||||
Content : Interface to microphone input
|
||||
Created : May 12, 2015
|
||||
Copyright : Copyright 2015 Oculus VR, Inc. All Rights reserved.
|
||||
|
||||
Licensed under the Oculus VR Rift SDK License Version 3.1 (the "License");
|
||||
you may not use the Oculus VR Rift 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
|
||||
|
||||
http://www.oculusvr.com/licenses/LICENSE-3.1
|
||||
|
||||
Unless required by applicable law or agreed to in writing, the Oculus VR 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;
|
||||
|
||||
[RequireComponent(typeof(AudioSource))]
|
||||
|
||||
public class OVRMicInput : MonoBehaviour
|
||||
{
|
||||
public enum micActivation
|
||||
{
|
||||
HoldToSpeak,
|
||||
PushToSpeak,
|
||||
ConstantSpeak
|
||||
}
|
||||
|
||||
// PUBLIC MEMBERS
|
||||
public AudioSource audioSource = null;
|
||||
public bool GuiSelectDevice = true;
|
||||
|
||||
[SerializeField]
|
||||
private float sensitivity = 100;
|
||||
public float Sensitivity
|
||||
{
|
||||
get{return sensitivity;}
|
||||
set{sensitivity = Mathf.Clamp (value, 0, 100);}
|
||||
}
|
||||
|
||||
[SerializeField]
|
||||
private float sourceVolume = 100;
|
||||
public float SourceVolume
|
||||
{
|
||||
get{return sourceVolume;}
|
||||
set{sourceVolume = Mathf.Clamp (value, 0, 100);}
|
||||
}
|
||||
|
||||
[SerializeField]
|
||||
private int micFrequency = 16000;
|
||||
public float MicFrequency
|
||||
{
|
||||
get{return micFrequency;}
|
||||
set{micFrequency = (int)Mathf.Clamp ((float)value, 0, 96000);}
|
||||
}
|
||||
|
||||
|
||||
public micActivation micControl;
|
||||
|
||||
public string selectedDevice;
|
||||
|
||||
public float loudness; // Use this to chenge visual values. Range is 0 - 100
|
||||
|
||||
// PRIVATE MEMBERS
|
||||
private bool micSelected = false;
|
||||
private int minFreq, maxFreq;
|
||||
private bool focused = true;
|
||||
|
||||
//----------------------------------------------------
|
||||
// MONOBEHAVIOUR OVERRIDE FUNCTIONS
|
||||
//----------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// Awake this instance.
|
||||
/// </summary>
|
||||
void Awake()
|
||||
{
|
||||
// First thing to do, cache the unity audio source (can be managed by the
|
||||
// user if audio source can change)
|
||||
if (!audioSource) audioSource = GetComponent<AudioSource>();
|
||||
if (!audioSource) return; // this should never happen
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Start this instance.
|
||||
/// </summary>
|
||||
void Start()
|
||||
{
|
||||
audioSource.loop = true; // Set the AudioClip to loop
|
||||
audioSource.mute = false;
|
||||
|
||||
if(Microphone.devices.Length!= 0)
|
||||
{
|
||||
selectedDevice = Microphone.devices[0].ToString();
|
||||
micSelected = true;
|
||||
GetMicCaps();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update this instance.
|
||||
/// </summary>
|
||||
void Update()
|
||||
{
|
||||
if (!focused)
|
||||
StopMicrophone();
|
||||
|
||||
if (!Application.isPlaying)
|
||||
StopMicrophone();
|
||||
|
||||
audioSource.volume = (sourceVolume / 100);
|
||||
loudness = Mathf.Clamp(GetAveragedVolume() * sensitivity * (sourceVolume / 10), 0, 100);
|
||||
|
||||
//Hold To Speak
|
||||
if (micControl == micActivation.HoldToSpeak)
|
||||
{
|
||||
if (Microphone.IsRecording(selectedDevice) && Input.GetKey(KeyCode.Space) == false)
|
||||
StopMicrophone();
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.Space)) //Push to talk
|
||||
StartMicrophone();
|
||||
|
||||
if (Input.GetKeyUp(KeyCode.Space))
|
||||
StopMicrophone();
|
||||
}
|
||||
|
||||
//Push To Talk
|
||||
if (micControl == micActivation.PushToSpeak)
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.Space))
|
||||
{
|
||||
if (Microphone.IsRecording(selectedDevice))
|
||||
StopMicrophone();
|
||||
else if (!Microphone.IsRecording(selectedDevice))
|
||||
StartMicrophone();
|
||||
}
|
||||
}
|
||||
|
||||
//Constant Speak
|
||||
if (micControl == micActivation.ConstantSpeak)
|
||||
if (!Microphone.IsRecording(selectedDevice))
|
||||
StartMicrophone();
|
||||
|
||||
|
||||
//Mic Slected = False
|
||||
if (Input.GetKeyDown(KeyCode.M))
|
||||
micSelected = false;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Raises the application focus event.
|
||||
/// </summary>
|
||||
/// <param name="focus">If set to <c>true</c> focus.</param>
|
||||
void OnApplicationFocus(bool focus)
|
||||
{
|
||||
focused = focus;
|
||||
|
||||
// fixes app with a delayed buffer if going out of focus
|
||||
if (!focused)
|
||||
StopMicrophone();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raises the application pause event.
|
||||
/// </summary>
|
||||
/// <param name="focus">If set to <c>true</c> focus.</param>
|
||||
void OnApplicationPause(bool focus)
|
||||
{
|
||||
focused = focus;
|
||||
|
||||
// fixes app with a delayed buffer if going out of focus
|
||||
if (!focused)
|
||||
StopMicrophone();
|
||||
}
|
||||
|
||||
void OnDisable()
|
||||
{
|
||||
StopMicrophone();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raises the GU event.
|
||||
/// </summary>
|
||||
void OnGUI()
|
||||
{
|
||||
MicDeviceGUI((Screen.width/2)-150, (Screen.height/2)-75, 300, 50, 10, -300);
|
||||
}
|
||||
|
||||
//----------------------------------------------------
|
||||
// PUBLIC FUNCTIONS
|
||||
//----------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// Mics the device GU.
|
||||
/// </summary>
|
||||
/// <param name="left">Left.</param>
|
||||
/// <param name="top">Top.</param>
|
||||
/// <param name="width">Width.</param>
|
||||
/// <param name="height">Height.</param>
|
||||
/// <param name="buttonSpaceTop">Button space top.</param>
|
||||
/// <param name="buttonSpaceLeft">Button space left.</param>
|
||||
public void MicDeviceGUI (float left, float top, float width, float height, float buttonSpaceTop, float buttonSpaceLeft)
|
||||
{
|
||||
//If there is more than one device, choose one.
|
||||
if (Microphone.devices.Length >= 1 && GuiSelectDevice == true && micSelected == false)
|
||||
{
|
||||
for (int i = 0; i < Microphone.devices.Length; ++i)
|
||||
{
|
||||
if (GUI.Button(new Rect(left + ((width + buttonSpaceLeft) * i), top + ((height + buttonSpaceTop) * i), width, height),
|
||||
Microphone.devices[i].ToString()))
|
||||
{
|
||||
StopMicrophone();
|
||||
selectedDevice = Microphone.devices[i].ToString();
|
||||
micSelected = true;
|
||||
GetMicCaps();
|
||||
StartMicrophone();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the mic caps.
|
||||
/// </summary>
|
||||
public void GetMicCaps ()
|
||||
{
|
||||
if(micSelected == false) return;
|
||||
|
||||
//Gets the frequency of the device
|
||||
Microphone.GetDeviceCaps(selectedDevice, out minFreq, out maxFreq);
|
||||
|
||||
if ( minFreq == 0 && maxFreq == 0 )
|
||||
{
|
||||
Debug.LogWarning ("GetMicCaps warning:: min and max frequencies are 0");
|
||||
minFreq = 44100;
|
||||
maxFreq = 44100;
|
||||
}
|
||||
|
||||
if (micFrequency > maxFreq)
|
||||
micFrequency = maxFreq;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Starts the microphone.
|
||||
/// </summary>
|
||||
public void StartMicrophone ()
|
||||
{
|
||||
if(micSelected == false) return;
|
||||
|
||||
//Starts recording
|
||||
audioSource.clip = Microphone.Start(selectedDevice, true, 1, micFrequency);
|
||||
|
||||
// Wait until the recording has started
|
||||
while (!(Microphone.GetPosition(selectedDevice) > 0)){}
|
||||
|
||||
// Play the audio source
|
||||
audioSource.Play();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stops the microphone.
|
||||
/// </summary>
|
||||
public void StopMicrophone ()
|
||||
{
|
||||
if(micSelected == false) return;
|
||||
|
||||
// Overriden with a clip to play? Don't stop the audio source
|
||||
if((audioSource != null) && (audioSource.clip != null) &&(audioSource.clip.name == "Microphone"))
|
||||
audioSource.Stop();
|
||||
|
||||
Microphone.End(selectedDevice);
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------
|
||||
// PRIVATE FUNCTIONS
|
||||
//----------------------------------------------------
|
||||
|
||||
/// <summary>
|
||||
/// Gets the averaged volume.
|
||||
/// </summary>
|
||||
/// <returns>The averaged volume.</returns>
|
||||
float GetAveragedVolume()
|
||||
{
|
||||
// We will use the SR to get average volume
|
||||
// return OVRSpeechRec.GetAverageVolume();
|
||||
return 0.0f;
|
||||
}
|
||||
}
|
||||
12
Assets/Oculus/VoiceMod/Scripts/Helpers/OVRMicInput.cs.meta
Normal file
12
Assets/Oculus/VoiceMod/Scripts/Helpers/OVRMicInput.cs.meta
Normal file
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 19e8290db1b2e0748a6126d146686a6d
|
||||
timeCreated: 1450118836
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
263
Assets/Oculus/VoiceMod/Scripts/OVRVoiceMod.cs
Normal file
263
Assets/Oculus/VoiceMod/Scripts/OVRVoiceMod.cs
Normal file
@@ -0,0 +1,263 @@
|
||||
/************************************************************************************
|
||||
Filename : OVRVoiceMod.cs
|
||||
Content : Interface to Oculus voice mod
|
||||
Created : December 14th, 2015
|
||||
Copyright : Copyright 2015 Oculus VR, Inc. All Rights reserved.
|
||||
|
||||
Licensed under the Oculus VR Rift SDK License Version 3.1 (the "License");
|
||||
you may not use the Oculus VR Rift 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
|
||||
|
||||
http://www.oculusvr.com/licenses/LICENSE-3.1
|
||||
|
||||
Unless required by applicable law or agreed to in writing, the Oculus VR 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;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
//-------------------------------------------------------------------------------------
|
||||
// ***** OVRVoiceMod
|
||||
//
|
||||
/// <summary>
|
||||
/// OVRVoiceMod interfaces into the Oculus voice-mod engine. This component should be added
|
||||
/// into the scene once.
|
||||
///
|
||||
/// </summary>
|
||||
public class OVRVoiceMod : MonoBehaviour
|
||||
{
|
||||
public const int ovrVoiceModSuccess = 0;
|
||||
|
||||
// Error codes that may return from VoiceMod engine
|
||||
public enum ovrVoiceModError
|
||||
{
|
||||
Unknown = -2250, //< An unknown error has occurred
|
||||
CannotCreateContext = -2251, //< Unable to create a context
|
||||
InvalidParam = -2252, //< An invalid parameter, e.g. NULL pointer or out of range
|
||||
BadSampleRate = -2253, //< An unsupported sample rate was declared
|
||||
MissingDLL = -2254, //< The DLL or shared library could not be found
|
||||
BadVersion = -2255, //< Mismatched versions between header and libs
|
||||
UndefinedFunction = -2256 //< An undefined function
|
||||
};
|
||||
|
||||
/// Flags (unused at this time)
|
||||
public enum ovrViceModFlag
|
||||
{
|
||||
None = 0x0000,
|
||||
};
|
||||
|
||||
/// NOTE: Opaque typedef for voice mod context is an unsigned int (uint)
|
||||
|
||||
// * * * * * * * * * * * * *
|
||||
// Import functions
|
||||
public const string strOVRLS = "OVRVoiceMod";
|
||||
[DllImport(strOVRLS)]
|
||||
private static extern int ovrVoiceModDll_Initialize(int SampleRate, int BufferSize);
|
||||
[DllImport(strOVRLS)]
|
||||
private static extern void ovrVoiceModDll_Shutdown();
|
||||
[DllImport(strOVRLS)]
|
||||
private static extern IntPtr ovrVoicemodDll_GetVersion(ref int Major,
|
||||
ref int Minor,
|
||||
ref int Patch);
|
||||
[DllImport(strOVRLS)]
|
||||
private static extern int ovrVoiceModDll_CreateContext(ref uint Context);
|
||||
[DllImport(strOVRLS)]
|
||||
private static extern int ovrVoiceModDll_DestroyContext(uint Context);
|
||||
[DllImport(strOVRLS)]
|
||||
private static extern int ovrVoiceModDll_SendParameter(uint Context, int Parameter, int Value);
|
||||
[DllImport(strOVRLS)]
|
||||
private static extern int ovrVoiceModDll_ProcessFrame(uint Context, uint Flags, float [] AudioBuffer);
|
||||
[DllImport(strOVRLS)]
|
||||
private static extern int ovrVoiceModDll_ProcessFrameInterleaved(uint Context, uint Flags, float [] AudioBuffer);
|
||||
[DllImport(strOVRLS)]
|
||||
private static extern int ovrVoiceModDll_GetAverageAbsVolume(uint Context, ref float Volume);
|
||||
|
||||
// * * * * * * * * * * * * *
|
||||
// Public members
|
||||
|
||||
// * * * * * * * * * * * * *
|
||||
// Static members
|
||||
private static int sOVRVoiceModInit = (int)ovrVoiceModError.Unknown;
|
||||
|
||||
// interface through this static member.
|
||||
public static OVRVoiceMod sInstance = null;
|
||||
|
||||
// * * * * * * * * * * * * *
|
||||
// MonoBehaviour overrides
|
||||
|
||||
/// <summary>
|
||||
/// Awake this instance.
|
||||
/// </summary>
|
||||
void Awake ()
|
||||
{
|
||||
// We can only have one instance of OVRLipSync in a scene (use this for local property query)
|
||||
if(sInstance == null)
|
||||
{
|
||||
sInstance = this;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning (System.String.Format ("OVRVoiceMod Awake: Only one instance of OVRVoiceMod can exist in the scene."));
|
||||
return;
|
||||
}
|
||||
|
||||
int samplerate;
|
||||
int bufsize;
|
||||
int numbuf;
|
||||
|
||||
// Get the current sample rate
|
||||
samplerate = AudioSettings.outputSampleRate;
|
||||
// Get the current buffer size and number of buffers
|
||||
AudioSettings.GetDSPBufferSize (out bufsize, out numbuf);
|
||||
|
||||
String str = System.String.Format
|
||||
("OvrVoiceMod Awake: Queried SampleRate: {0:F0} BufferSize: {1:F0}", samplerate, bufsize);
|
||||
Debug.LogWarning (str);
|
||||
|
||||
sOVRVoiceModInit = ovrVoiceModDll_Initialize(samplerate, bufsize);
|
||||
|
||||
if(sOVRVoiceModInit != ovrVoiceModSuccess)
|
||||
{
|
||||
Debug.LogWarning (System.String.Format
|
||||
("OvrVoiceMod Awake: Failed to init VoiceMod library"));
|
||||
}
|
||||
|
||||
// Important: Use the touchpad mechanism for input, call Create on the OVRTouchpad helper class
|
||||
OVRTouchpad.Create();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Start this instance.
|
||||
/// Note: make sure to always have a Start function for classes that have editor scripts.
|
||||
/// </summary>
|
||||
void Start()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Run processes that need to be updated in our game thread
|
||||
/// </summary>
|
||||
void Update()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raises the destroy event.
|
||||
/// </summary>
|
||||
void OnDestroy()
|
||||
{
|
||||
if(sInstance != this)
|
||||
{
|
||||
Debug.LogWarning ("OVRVoiceMod OnDestroy: This is not the correct OVRVoiceMod instance.");
|
||||
}
|
||||
|
||||
ovrVoiceModDll_Shutdown();
|
||||
sOVRVoiceModInit = (int)ovrVoiceModError.Unknown;
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * *
|
||||
// Public Functions
|
||||
|
||||
/// <summary>
|
||||
/// Determines if is initialized.
|
||||
/// </summary>
|
||||
/// <returns><c>true</c> if is initialized; otherwise, <c>false</c>.</returns>
|
||||
public static int IsInitialized()
|
||||
{
|
||||
return sOVRVoiceModInit;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates the context.
|
||||
/// </summary>
|
||||
/// <returns>The context.</returns>
|
||||
/// <param name="context">Context.</param>
|
||||
public static int CreateContext(ref uint context)
|
||||
{
|
||||
if(IsInitialized() != ovrVoiceModSuccess)
|
||||
return (int)ovrVoiceModError.CannotCreateContext;
|
||||
|
||||
return ovrVoiceModDll_CreateContext(ref context);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Destroies the context.
|
||||
/// </summary>
|
||||
/// <returns>The context.</returns>
|
||||
/// <param name="context">Context.</param>
|
||||
public static int DestroyContext (uint context)
|
||||
{
|
||||
if(IsInitialized() != ovrVoiceModSuccess)
|
||||
return (int)ovrVoiceModError.Unknown;
|
||||
|
||||
return ovrVoiceModDll_DestroyContext(context);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sends the parameter.
|
||||
/// </summary>
|
||||
/// <returns>The parameter.</returns>
|
||||
/// <param name="context">Context.</param>
|
||||
/// <param name="parameter">Parameter.</param>
|
||||
/// <param name="value">Value.</param>
|
||||
public static int SendParameter(uint context, int parameter, int value)
|
||||
{
|
||||
if(IsInitialized() != ovrVoiceModSuccess)
|
||||
return (int)ovrVoiceModError.Unknown;
|
||||
|
||||
return ovrVoiceModDll_SendParameter(context, parameter, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Processes the frame.
|
||||
/// </summary>
|
||||
/// <returns>The frame.</returns>
|
||||
/// <param name="context">Context.</param>
|
||||
/// <param name="audioBuffer">Audio buffer.</param>
|
||||
public static int ProcessFrame(uint context, float [] audioBuffer)
|
||||
{
|
||||
if(IsInitialized() != ovrVoiceModSuccess)
|
||||
return (int)ovrVoiceModError.Unknown;
|
||||
|
||||
return ovrVoiceModDll_ProcessFrame(context, (uint)ovrViceModFlag.None , audioBuffer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Processes the frame interleaved.
|
||||
/// </summary>
|
||||
/// <returns>The frame interleaved.</returns>
|
||||
/// <param name="context">Context.</param>
|
||||
/// <param name="audioBuffer">Audio buffer.</param>
|
||||
public static int ProcessFrameInterleaved(uint context, float [] audioBuffer)
|
||||
{
|
||||
if(IsInitialized() != ovrVoiceModSuccess)
|
||||
return (int)ovrVoiceModError.Unknown;
|
||||
|
||||
return ovrVoiceModDll_ProcessFrameInterleaved(context, (uint)ovrViceModFlag.None, audioBuffer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the average abs volume.
|
||||
/// </summary>
|
||||
/// <returns>The average abs volume.</returns>
|
||||
/// <param name="context">Context.</param>
|
||||
/// <param name="volume">Volume.</param>
|
||||
public static float GetAverageAbsVolume(uint context)
|
||||
{
|
||||
if(IsInitialized() != ovrVoiceModSuccess)
|
||||
return 0.0f;
|
||||
|
||||
float volume = 0;
|
||||
|
||||
int result = ovrVoiceModDll_GetAverageAbsVolume(context, ref volume);
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
12
Assets/Oculus/VoiceMod/Scripts/OVRVoiceMod.cs.meta
Normal file
12
Assets/Oculus/VoiceMod/Scripts/OVRVoiceMod.cs.meta
Normal file
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f9518abe0e11ea14dbba5c3d7a2fec2d
|
||||
timeCreated: 1450120036
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
517
Assets/Oculus/VoiceMod/Scripts/OVRVoiceModContext.cs
Normal file
517
Assets/Oculus/VoiceMod/Scripts/OVRVoiceModContext.cs
Normal file
@@ -0,0 +1,517 @@
|
||||
/************************************************************************************
|
||||
Filename : OVRVoiceModContext.cs
|
||||
Content : Interface to Oculus Lip-Sync engine
|
||||
Created : December 14th, 2015
|
||||
Copyright : Copyright 2015 Oculus VR, Inc. All Rights reserved.
|
||||
|
||||
Licensed under the Oculus VR Rift SDK License Version 3.1 (the "License");
|
||||
you may not use the Oculus VR Rift 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
|
||||
|
||||
http://www.oculusvr.com/licenses/LICENSE-3.1
|
||||
|
||||
Unless required by applicable law or agreed to in writing, the Oculus VR 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;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
|
||||
[RequireComponent(typeof(AudioSource))]
|
||||
|
||||
//-------------------------------------------------------------------------------------
|
||||
// ***** OVRVoiceModContext
|
||||
//
|
||||
/// <summary>
|
||||
/// OVRVoiceModContext interfaces into VoiceMod engine.
|
||||
/// Includes preset bank.
|
||||
/// This component should be added into the scene once for each Audio Source.
|
||||
///
|
||||
/// </summary>
|
||||
public class OVRVoiceModContext : MonoBehaviour
|
||||
{
|
||||
// Enum for various voice mod parameters (lines up with native context, OVRVoiceModContext.h)
|
||||
public enum ovrVoiceModParams
|
||||
{
|
||||
MixInputAudio, // 0.0->1.0
|
||||
PitchInputAudio, // 0.5->2.0
|
||||
SetBands, // 1 -> 128
|
||||
FormantCorrection, // 0 = off, 1 = on
|
||||
Carrier1_TrackPitch, // 0 = off, 1 = om
|
||||
Carrier1_Type, // Carrier type: 0 = Noise, 1 = CycledNoise, 2 = SawUp, 3 = Pulse
|
||||
Carrier1_Gain, // Linear multiplier (0.0 -> 1.0)
|
||||
Carrier1_Frequency, // Frequency of carrier (used by SawUp and Pulse) 0.0 -> Sample Rate
|
||||
Carrier1_Note, // Translates to frequency (0-127)
|
||||
Carrier1_PulseWidth, // Used by Pulse carrier (0.0 -> 1.0)
|
||||
Carrier1_CycledNoiseSize, // Number of samples in cycled noise carrier: 1 - 1024
|
||||
Carrier2_TrackPitch, // Same as Carrier 1
|
||||
Carrier2_Type, //
|
||||
Carrier2_Gain, //
|
||||
Carrier2_Frequency, //
|
||||
Carrier2_Note, //
|
||||
Carrier2_PulseWidth, //
|
||||
Carrier2_CycledNoiseSize, //
|
||||
Count
|
||||
};
|
||||
|
||||
// * * * * * * * * * * * * *
|
||||
// Public members
|
||||
public AudioSource audioSource = null;
|
||||
public float gain = 1.0f;
|
||||
public bool audioMute = true;
|
||||
public KeyCode loopback = KeyCode.L;
|
||||
|
||||
// Voice Mod Preset
|
||||
public struct VMPreset
|
||||
{
|
||||
public string info;
|
||||
public Color color;
|
||||
public float mix;
|
||||
public float pitch;
|
||||
public int bands;
|
||||
public int formant;
|
||||
public int c1PTrack;
|
||||
public int c1Type;
|
||||
public float c1Gain;
|
||||
public float c1Freq;
|
||||
public int c1Note;
|
||||
public float c1PW;
|
||||
public int c1CNS;
|
||||
public int c2PTrack;
|
||||
public int c2Type;
|
||||
public float c2Gain;
|
||||
public float c2Freq;
|
||||
public int c2Note;
|
||||
public float c2PW;
|
||||
public int c2CNS;
|
||||
};
|
||||
|
||||
private VMPreset [] VMPresets = new VMPreset[]
|
||||
{
|
||||
// INIT
|
||||
new VMPreset{info="-INIT-\nNo pitch shift, no vocode",
|
||||
color = Color.gray,
|
||||
mix = 1.0f, pitch = 1.0f, bands = 32, formant = 0,
|
||||
c1PTrack = 0, c1Type = 0, c1Gain = 0.0f, c1Freq = 440.0f, c1Note = -1, c1PW = 0.5f, c1CNS = 512,
|
||||
c2PTrack = 0, c2Type = 0, c2Gain = 0.0f, c2Freq = 440.0f, c2Note = -1, c2PW = 0.5f, c2CNS = 512,},
|
||||
|
||||
new VMPreset{info="FULL VOCODE\nCarrier 1: Full noise",
|
||||
color = Color.white,
|
||||
mix = 0.0f, pitch = 1.0f, bands = 32, formant = 0,
|
||||
c1PTrack = 0, c1Type = 0, c1Gain = 1.0f, c1Freq = 440.0f, c1Note = -1, c1PW = 0.5f, c1CNS = 512,
|
||||
c2PTrack = 0, c2Type = 0, c2Gain = 0.0f, c2Freq = 440.0f, c2Note = -1, c2PW = 0.5f, c2CNS = 512,},
|
||||
|
||||
new VMPreset{info="FULL VOCODE\nCarrier 1: Cycled noise 512",
|
||||
color = Color.blue,
|
||||
mix = 0.0f, pitch = 1.0f, bands = 32, formant = 0,
|
||||
c1PTrack = 0, c1Type = 1, c1Gain = 1.0f, c1Freq = 440.0f, c1Note = -1, c1PW = 0.5f, c1CNS = 512,
|
||||
c2PTrack = 0, c2Type = 0, c2Gain = 0.0f, c2Freq = 440.0f, c2Note = -1, c2PW = 0.5f, c2CNS = 512,},
|
||||
|
||||
new VMPreset{info="FULL VOCODE\nCarrier 1: Saw Up, Freq 220",
|
||||
color = Color.magenta,
|
||||
mix = 0.0f, pitch = 1.0f, bands = 32, formant = 0,
|
||||
c1PTrack = 0, c1Type = 2, c1Gain = 1.0f, c1Freq = 220.0f, c1Note = -1, c1PW = 0.5f, c1CNS = 512,
|
||||
c2PTrack = 0, c2Type = 0, c2Gain = 0.0f, c2Freq = 440.0f, c2Note = -1, c2PW = 0.5f, c2CNS = 512,},
|
||||
|
||||
new VMPreset{info="FULL VOCODE\nCarrier 1: Saw Up, Pitch tracked\n",
|
||||
color = Color.cyan,
|
||||
mix = 0.0f, pitch = 1.0f, bands = 32, formant = 0,
|
||||
c1PTrack = 1, c1Type = 2, c1Gain = 0.34f, c1Freq = 440.0f, c1Note = -1, c1PW = 0.1f, c1CNS = 512,
|
||||
c2PTrack = 0, c2Type = 0, c2Gain = 0.0f, c2Freq = 440.0f, c2Note = -1, c2PW = 0.5f, c2CNS = 512,},
|
||||
|
||||
new VMPreset{info="INPUT PLUS VOCODE\nInput 50%, Vocode 50%\nPitch 1.0\nCarrier 1: Full Noise,\nCarrier 2: Cycled Noise 512",
|
||||
color = Color.green,
|
||||
mix = 0.5f, pitch = 1.0f, bands = 32, formant = 0,
|
||||
c1PTrack = 0, c1Type = 0, c1Gain = 0.5f, c1Freq = 440.0f, c1Note = 57, c1PW = 0.5f, c1CNS = 512,
|
||||
c2PTrack = 0, c2Type = 1, c2Gain = 0.5f, c2Freq = 440.0f, c2Note = 45, c2PW = 0.25f, c2CNS = 512,},
|
||||
|
||||
new VMPreset{info="INPUT PLUS VOCODE PLUS PITCH DOWN\nInput 50%, Vocode 50%\nPitch 0.75\nCarrier 1: Cycled Noise 512\nCarrier 2: Cycled Noise 768",
|
||||
color = Color.red,
|
||||
mix = 0.5f, pitch = 0.75f, bands = 32, formant = 0,
|
||||
c1PTrack = 0, c1Type = 1, c1Gain = 0.6f, c1Freq = 440.0f, c1Note = 57, c1PW = 0.5f, c1CNS = 512,
|
||||
c2PTrack = 0, c2Type = 3, c2Gain = 0.2f, c2Freq = 440.0f, c2Note = 40, c2PW = 0.25f, c2CNS = 768,},
|
||||
|
||||
new VMPreset{info="PITCH ONLY\nPitch 1.25 (Formant correction)",
|
||||
color = Color.blue,
|
||||
mix = 1.0f, pitch = 1.25f, bands = 32, formant = 1,
|
||||
c1PTrack = 0, c1Type = 1, c1Gain = 1.0f, c1Freq = 440.0f, c1Note = 57, c1PW = 0.5f, c1CNS = 400,
|
||||
c2PTrack = 0, c2Type = 3, c2Gain = 0.0f, c2Freq = 440.0f, c2Note = 52, c2PW = 0.5f, c2CNS = 512,},
|
||||
|
||||
new VMPreset{info="PITCH ONLY\nPitch 0.5 (Formant correction)",
|
||||
color = Color.green,
|
||||
mix = 1.0f, pitch = 0.5f, bands = 32, formant = 1,
|
||||
c1PTrack = 0, c1Type = 1, c1Gain = 1.0f, c1Freq = 440.0f, c1Note = 57, c1PW = 0.5f, c1CNS = 400,
|
||||
c2PTrack = 0, c2Type = 3, c2Gain = 0.0f, c2Freq = 440.0f, c2Note = 52, c2PW = 0.5f, c2CNS = 512,},
|
||||
|
||||
new VMPreset{info="PITCH ONLY\nPitch 2.0 (Formant correction)",
|
||||
color = Color.yellow,
|
||||
mix = 1.0f, pitch = 2.0f, bands = 32, formant = 1,
|
||||
c1PTrack = 0, c1Type = 1, c1Gain = 1.0f, c1Freq = 440.0f, c1Note = 57, c1PW = 0.5f, c1CNS = 400,
|
||||
c2PTrack = 0, c2Type = 3, c2Gain = 0.0f, c2Freq = 440.0f, c2Note = 52, c2PW = 0.5f, c2CNS = 512,},
|
||||
};
|
||||
|
||||
// Current VoiceMod values (visible in inspector without writing a editor helper class)
|
||||
public float VM_MixAudio = 1.0f;
|
||||
public float VM_Pitch = 1.0f;
|
||||
public int VM_Bands = 32;
|
||||
public int VM_FormantCorrect = 0;
|
||||
|
||||
// Carrier 1
|
||||
public int VM_C1_TrackPitch = 0;
|
||||
public int VM_C1_Type = 0;
|
||||
public float VM_C1_Gain = 0.5f;
|
||||
public float VM_C1_Freq = 440.0f;
|
||||
public int VM_C1_Note = 67;
|
||||
public float VM_C1_PulseWidth = 0.5f;
|
||||
public int VM_C1_CycledNoiseSize = 512;
|
||||
|
||||
// Carrier 2
|
||||
public int VM_C2_TrackPitch = 0;
|
||||
public int VM_C2_Type = 0;
|
||||
public float VM_C2_Gain = 0.5f;
|
||||
public float VM_C2_Freq = 440.0f;
|
||||
public int VM_C2_Note = 67;
|
||||
public float VM_C2_PulseWidth = 0.5f;
|
||||
public int VM_C2_CycledNoiseSize = 512;
|
||||
|
||||
// * * * * * * * * * * * * *
|
||||
// Private members
|
||||
private uint context = 0; // 0 is no context
|
||||
private float prevVol = 0.0f; // used for smoothing avg volume
|
||||
|
||||
// * * * * * * * * * * * * *
|
||||
// Static members
|
||||
|
||||
// * * * * * * * * * * * * *
|
||||
// MonoBehaviour overrides
|
||||
|
||||
/// <summary>
|
||||
/// Awake this instance.
|
||||
/// </summary>
|
||||
void Awake ()
|
||||
{
|
||||
// Cache the audio source we are going to be using to pump data to the SR
|
||||
if (!audioSource) audioSource = GetComponent<AudioSource>();
|
||||
if (!audioSource) return;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Start this instance.
|
||||
/// Note: make sure to always have a Start function for classes that have editor scripts.
|
||||
/// </summary>
|
||||
void Start()
|
||||
{
|
||||
// Create the context that we will feed into the audio buffer
|
||||
lock(this)
|
||||
{
|
||||
if(context == 0)
|
||||
{
|
||||
if(OVRVoiceMod.CreateContext(ref context) != OVRVoiceMod.ovrVoiceModSuccess)
|
||||
{
|
||||
Debug.Log ("OVRVoiceModContext.Start ERROR: Could not create VoiceMod context.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add a listener to the OVRMessenger for touch events
|
||||
OVRMessenger.AddListener<OVRTouchpad.TouchEvent>("Touchpad", LocalTouchEventCallback);
|
||||
|
||||
// VoiceMod: Set the current state of the voice mod as set in the inspector
|
||||
SendVoiceModUpdate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Run processes that need to be updated in our game thread
|
||||
/// </summary>
|
||||
void Update()
|
||||
{
|
||||
// Turn loopback on/off
|
||||
if (Input.GetKeyDown(loopback))
|
||||
{
|
||||
audioMute = !audioMute;
|
||||
|
||||
OVRDebugConsole.Clear();
|
||||
OVRDebugConsole.ClearTimeout(1.5f);
|
||||
|
||||
if(!audioMute)
|
||||
OVRDebugConsole.Log("LOOPBACK MODE: ENABLED");
|
||||
else
|
||||
OVRDebugConsole.Log("LOOPBACK MODE: DISABLED");
|
||||
|
||||
}
|
||||
else if(Input.GetKeyDown(KeyCode.LeftArrow))
|
||||
{
|
||||
gain -= 0.1f;
|
||||
if(gain < 0.5f) gain = 0.5f;
|
||||
|
||||
string g = "LINEAR GAIN: ";
|
||||
g += gain;
|
||||
OVRDebugConsole.Clear();
|
||||
OVRDebugConsole.Log(g);
|
||||
OVRDebugConsole.ClearTimeout(1.5f);
|
||||
|
||||
}
|
||||
else if(Input.GetKeyDown(KeyCode.RightArrow))
|
||||
{
|
||||
gain += 0.1f;
|
||||
if(gain > 3.0f)
|
||||
gain = 3.0f;
|
||||
|
||||
string g = "LINEAR GAIN: ";
|
||||
g += gain;
|
||||
OVRDebugConsole.Clear();
|
||||
OVRDebugConsole.Log(g);
|
||||
OVRDebugConsole.ClearTimeout(1.5f);
|
||||
|
||||
}
|
||||
|
||||
UpdateVoiceModUpdate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raises the destroy event.
|
||||
/// </summary>
|
||||
void OnDestroy()
|
||||
{
|
||||
// Create the context that we will feed into the audio buffer
|
||||
lock(this)
|
||||
{
|
||||
if(context != 0)
|
||||
{
|
||||
if(OVRVoiceMod.DestroyContext(context) != OVRVoiceMod.ovrVoiceModSuccess)
|
||||
{
|
||||
Debug.Log ("OVRVoiceModContext.OnDestroy ERROR: Could not delete VoiceMod context.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raises the audio filter read event.
|
||||
/// </summary>
|
||||
/// <param name="data">Data.</param>
|
||||
/// <param name="channels">Channels.</param>
|
||||
void OnAudioFilterRead(float[] data, int channels)
|
||||
{
|
||||
// Do not spatialize if we are not initialized, or if there is no
|
||||
// audio source attached to game object
|
||||
if ((OVRVoiceMod.IsInitialized() != OVRVoiceMod.ovrVoiceModSuccess) || audioSource == null)
|
||||
return;
|
||||
|
||||
// increase the gain of the input to get a better signal input
|
||||
for (int i = 0; i < data.Length; ++i)
|
||||
data[i] = data[i] * gain;
|
||||
|
||||
// Send data into VoiceMod context for processing (if context is not 0)
|
||||
lock(this)
|
||||
{
|
||||
if(context != 0)
|
||||
{
|
||||
OVRVoiceMod.ProcessFrameInterleaved(context, data);
|
||||
}
|
||||
}
|
||||
|
||||
// Turn off output (so that we don't get feedback from a mic too close to speakers)
|
||||
if(audioMute == true)
|
||||
{
|
||||
for (int i = 0; i < data.Length; ++i)
|
||||
data[i] = data[i] * 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * *
|
||||
// Public Functions
|
||||
|
||||
/// <summary>
|
||||
/// Sends the parameter.
|
||||
/// </summary>
|
||||
/// <returns>The parameter.</returns>
|
||||
/// <param name="parameter">Parameter.</param>
|
||||
/// <param name="value">Value.</param>
|
||||
public int SendParameter(ovrVoiceModParams parameter, int value)
|
||||
{
|
||||
if(OVRVoiceMod.IsInitialized() != OVRVoiceMod.ovrVoiceModSuccess)
|
||||
return (int)OVRVoiceMod.ovrVoiceModError.Unknown;
|
||||
|
||||
return OVRVoiceMod.SendParameter(context, (int)parameter, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the preset.
|
||||
/// </summary>
|
||||
/// <returns><c>true</c>, if preset was set, <c>false</c> otherwise.</returns>
|
||||
/// <param name="preset">Preset.</param>
|
||||
public bool SetPreset(int preset)
|
||||
{
|
||||
if(preset < 0 || preset >= VMPresets.Length)
|
||||
return false;
|
||||
|
||||
VM_MixAudio = VMPresets[preset].mix;
|
||||
VM_Pitch = VMPresets[preset].pitch;
|
||||
VM_Bands = VMPresets[preset].bands;
|
||||
VM_FormantCorrect = VMPresets[preset].formant;
|
||||
VM_C1_TrackPitch = VMPresets[preset].c1PTrack;
|
||||
VM_C1_Type = VMPresets[preset].c1Type;
|
||||
VM_C1_Gain = VMPresets[preset].c1Gain;
|
||||
VM_C1_Freq = VMPresets[preset].c1Freq;
|
||||
VM_C1_Note = VMPresets[preset].c1Note;
|
||||
VM_C1_PulseWidth = VMPresets[preset].c1PW;
|
||||
VM_C1_CycledNoiseSize = VMPresets[preset].c1CNS;
|
||||
VM_C2_TrackPitch = VMPresets[preset].c2PTrack;
|
||||
VM_C2_Type = VMPresets[preset].c2Type;
|
||||
VM_C2_Gain = VMPresets[preset].c2Gain;
|
||||
VM_C2_Freq = VMPresets[preset].c2Freq;
|
||||
VM_C2_Note = VMPresets[preset].c2Note;
|
||||
VM_C2_PulseWidth = VMPresets[preset].c2PW;
|
||||
VM_C2_CycledNoiseSize = VMPresets[preset].c2CNS;
|
||||
|
||||
SendVoiceModUpdate();
|
||||
|
||||
OVRDebugConsole.Clear();
|
||||
OVRDebugConsole.Log(VMPresets[preset].info);
|
||||
OVRDebugConsole.ClearTimeout(5.0f);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the number presets.
|
||||
/// </summary>
|
||||
/// <returns>The number presets.</returns>
|
||||
public int GetNumPresets()
|
||||
{
|
||||
return VMPresets.Length;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the color of the preset.
|
||||
/// </summary>
|
||||
/// <returns>The preset color.</returns>
|
||||
/// <param name="preset">Preset.</param>
|
||||
public Color GetPresetColor(int preset)
|
||||
{
|
||||
if(preset < 0 || preset >= VMPresets.Length)
|
||||
return Color.black;
|
||||
|
||||
return VMPresets[preset].color;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the average abs volume.
|
||||
/// </summary>
|
||||
/// <returns>The average abs volume.</returns>
|
||||
public float GetAverageAbsVolume()
|
||||
{
|
||||
if(context == 0)
|
||||
return 0.0f;
|
||||
|
||||
float V = prevVol * 0.8f + OVRVoiceMod.GetAverageAbsVolume(context) * 0.2f;
|
||||
prevVol = V;
|
||||
|
||||
return V;
|
||||
}
|
||||
|
||||
// LocalTouchEventCallback
|
||||
// NOTE: We will not worry about gain on Android, since it will be
|
||||
// more important to switch presets. We will keep gain available on
|
||||
// Desktop
|
||||
void LocalTouchEventCallback(OVRTouchpad.TouchEvent touchEvent)
|
||||
{
|
||||
switch(touchEvent)
|
||||
{
|
||||
case(OVRTouchpad.TouchEvent.SingleTap):
|
||||
audioMute = !audioMute;
|
||||
|
||||
OVRDebugConsole.Clear();
|
||||
OVRDebugConsole.ClearTimeout(1.5f);
|
||||
|
||||
if(!audioMute)
|
||||
OVRDebugConsole.Log("LOOPBACK MODE: ENABLED");
|
||||
else
|
||||
OVRDebugConsole.Log("LOOPBACK MODE: DISABLED");
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Update directly from current state in inspector
|
||||
void UpdateVoiceModUpdate()
|
||||
{
|
||||
// Send directly from inspector
|
||||
if(Input.GetKeyDown(KeyCode.Space))
|
||||
{
|
||||
SendVoiceModUpdate();
|
||||
OVRDebugConsole.Clear();
|
||||
OVRDebugConsole.Log("UPDATED VOICE MOD FROM INSPECTOR");
|
||||
OVRDebugConsole.ClearTimeout(1.0f);
|
||||
}
|
||||
}
|
||||
|
||||
// Sends the current state of voice mod values
|
||||
void SendVoiceModUpdate()
|
||||
{
|
||||
VM_MixAudio = Mathf.Clamp(VM_MixAudio, 0.0f, 1.0f);
|
||||
VM_Pitch = Mathf.Clamp(VM_Pitch, 0.5f, 2.0f);
|
||||
VM_Bands = Mathf.Clamp(VM_Bands, 1, 128);
|
||||
VM_FormantCorrect = Mathf.Clamp(VM_FormantCorrect, 0, 1);
|
||||
VM_C1_TrackPitch = Mathf.Clamp(VM_C1_TrackPitch, 0, 1);
|
||||
VM_C1_Type = Mathf.Clamp(VM_C1_Type, 0, 3);
|
||||
VM_C1_Gain = Mathf.Clamp(VM_C1_Gain, 0.0f, 1.0f);
|
||||
VM_C1_Freq = Mathf.Clamp(VM_C1_Freq, 0.0f, 96000.0f);
|
||||
VM_C1_Note = Mathf.Clamp(VM_C1_Note, -1, 127);
|
||||
VM_C1_PulseWidth = Mathf.Clamp(VM_C1_PulseWidth, 0.0f, 1.0f);
|
||||
VM_C1_CycledNoiseSize = Mathf.Clamp(VM_C1_CycledNoiseSize, 0, 1024);
|
||||
VM_C2_TrackPitch = Mathf.Clamp(VM_C2_TrackPitch, 0, 1);
|
||||
VM_C2_Type = Mathf.Clamp(VM_C2_Type, 0, 3);
|
||||
VM_C2_Gain = Mathf.Clamp(VM_C2_Gain, 0.0f, 1.0f);
|
||||
VM_C2_Freq = Mathf.Clamp(VM_C2_Freq, 0.0f, 96000.0f);
|
||||
VM_C2_Note = Mathf.Clamp(VM_C2_Note, -1, 127);
|
||||
VM_C2_PulseWidth = Mathf.Clamp(VM_C2_PulseWidth, 0.0f, 1.0f);
|
||||
VM_C2_CycledNoiseSize = Mathf.Clamp(VM_C2_CycledNoiseSize, 0, 1024);
|
||||
|
||||
// We will send these in as Int and use 100 as a scale
|
||||
// Might go to 1000 :)
|
||||
|
||||
// VoiceMod and Vocoder values
|
||||
SendParameter(ovrVoiceModParams.MixInputAudio, (int)(100.0f * VM_MixAudio));
|
||||
SendParameter(ovrVoiceModParams.PitchInputAudio,(int)(100.0f * VM_Pitch));
|
||||
SendParameter(ovrVoiceModParams.SetBands, (int)VM_Bands);
|
||||
SendParameter(ovrVoiceModParams.FormantCorrection, (int)VM_FormantCorrect);
|
||||
|
||||
// Carrier 1
|
||||
SendParameter(ovrVoiceModParams.Carrier1_TrackPitch, (int)VM_C1_TrackPitch);
|
||||
SendParameter(ovrVoiceModParams.Carrier1_Type, (int)VM_C1_Type);
|
||||
SendParameter(ovrVoiceModParams.Carrier1_Gain, (int)(100.0f * VM_C1_Gain));
|
||||
|
||||
// Note overrides Frequency if valid range
|
||||
if(VM_C1_Note == -1)
|
||||
SendParameter(ovrVoiceModParams.Carrier1_Frequency, (int)(100.0f * VM_C1_Freq));
|
||||
else
|
||||
SendParameter(ovrVoiceModParams.Carrier1_Note, (int)VM_C1_Note);
|
||||
|
||||
SendParameter(ovrVoiceModParams.Carrier1_PulseWidth, (int)(100.0f * VM_C1_PulseWidth));
|
||||
SendParameter(ovrVoiceModParams.Carrier1_CycledNoiseSize, (int)VM_C1_CycledNoiseSize);
|
||||
|
||||
// Carrier 2
|
||||
SendParameter(ovrVoiceModParams.Carrier2_TrackPitch, (int)VM_C2_TrackPitch);
|
||||
SendParameter(ovrVoiceModParams.Carrier2_Type, (int)VM_C2_Type);
|
||||
SendParameter(ovrVoiceModParams.Carrier2_Gain, (int)(100.0f * VM_C2_Gain));
|
||||
|
||||
// Note overrides Frequency if valid range
|
||||
if(VM_C2_Note == -1)
|
||||
SendParameter(ovrVoiceModParams.Carrier2_Frequency, (int)(100.0f * VM_C2_Freq));
|
||||
else
|
||||
SendParameter(ovrVoiceModParams.Carrier2_Note, (int)VM_C2_Note);
|
||||
|
||||
SendParameter(ovrVoiceModParams.Carrier2_PulseWidth, (int)(100.0f * VM_C2_PulseWidth));
|
||||
SendParameter(ovrVoiceModParams.Carrier2_CycledNoiseSize, (int)VM_C1_CycledNoiseSize);
|
||||
}
|
||||
}
|
||||
12
Assets/Oculus/VoiceMod/Scripts/OVRVoiceModContext.cs.meta
Normal file
12
Assets/Oculus/VoiceMod/Scripts/OVRVoiceModContext.cs.meta
Normal file
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: beb05abfbdc9f804ab7e1bdd89727bd7
|
||||
timeCreated: 1450128495
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user