|
|
- /************************************************************************************
- Filename : OVRLipSyncContext.cs
- Content : Interface to Oculus Lip-Sync engine
- Created : August 6th, 2015
- Copyright : Copyright Facebook Technologies, LLC and its affiliates.
- All rights reserved.
-
- Licensed under the Oculus Audio SDK License Version 3.3 (the "License");
- you may not use the Oculus Audio 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/audio-3.3/
-
- Unless required by applicable law or agreed to in writing, the Oculus Audio 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;
-
-
- [RequireComponent(typeof(AudioSource))]
-
- //-------------------------------------------------------------------------------------
- // ***** OVRLipSyncContextBase
- //
- /// <summary>
- /// OVRLipSyncContextBase interfaces into the Oculus phoneme recognizer.
- /// This component should be added into the scene once for each Audio Source.
- ///
- /// </summary>
- public class OVRLipSyncContextBase : MonoBehaviour
- {
- // * * * * * * * * * * * * *
- // Public members
- public AudioSource audioSource = null;
-
- [Tooltip("Which lip sync provider to use for viseme computation.")]
- public OVRLipSync.ContextProviders provider = OVRLipSync.ContextProviders.Enhanced;
- [Tooltip("Enable DSP offload on supported Android devices.")]
- public bool enableAcceleration = true;
-
- // * * * * * * * * * * * * *
- // Private members
- private OVRLipSync.Frame frame = new OVRLipSync.Frame();
- private uint context = 0; // 0 is no context
-
- private int _smoothing;
- public int Smoothing
- {
- set
- {
- OVRLipSync.Result result =
- OVRLipSync.SendSignal(context, OVRLipSync.Signals.VisemeSmoothing, value, 0);
-
- if (result != OVRLipSync.Result.Success)
- {
- if (result == OVRLipSync.Result.InvalidParam)
- {
- Debug.LogError("OVRLipSyncContextBase.SetSmoothing: A viseme smoothing" +
- " parameter is invalid, it should be between 1 and 100!");
- }
- else
- {
- Debug.LogError("OVRLipSyncContextBase.SetSmoothing: An unexpected" +
- " error occured.");
- }
- }
-
- _smoothing = value;
- }
- get
- {
- return _smoothing;
- }
- }
-
- public uint Context
- {
- get
- {
- return context;
- }
- }
-
- protected OVRLipSync.Frame Frame
- {
- get
- {
- return frame;
- }
- }
-
- /// <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>();
- }
-
- lock (this)
- {
- if (context == 0)
- {
- if (OVRLipSync.CreateContext(ref context, provider, 0, enableAcceleration)
- != OVRLipSync.Result.Success)
- {
- Debug.LogError("OVRLipSyncContextBase.Start ERROR: Could not create" +
- " Phoneme context.");
- return;
- }
- }
- }
- }
-
-
- /// <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 (OVRLipSync.DestroyContext(context) != OVRLipSync.Result.Success)
- {
- Debug.LogError("OVRLipSyncContextBase.OnDestroy ERROR: Could not delete" +
- " Phoneme context.");
- }
- }
- }
- }
-
- // * * * * * * * * * * * * *
- // Public Functions
-
- /// <summary>
- /// Gets the current phoneme frame (lock and copy current frame to caller frame)
- /// </summary>
- /// <returns>error code</returns>
- /// <param name="inFrame">In frame.</param>
- public OVRLipSync.Frame GetCurrentPhonemeFrame()
- {
- return frame;
- }
-
- /// <summary>
- /// Sets a given viseme id blend weight to a given amount
- /// </summary>
- /// <param name="viseme">Integer viseme ID</param>
- /// <param name="amount">Integer viseme amount</param>
- public void SetVisemeBlend(int viseme, int amount)
- {
- OVRLipSync.Result result =
- OVRLipSync.SendSignal(context, OVRLipSync.Signals.VisemeAmount, viseme, amount);
-
- if (result != OVRLipSync.Result.Success)
- {
- if (result == OVRLipSync.Result.InvalidParam)
- {
- Debug.LogError("OVRLipSyncContextBase.SetVisemeBlend: Viseme ID is invalid.");
- }
- else
- {
- Debug.LogError("OVRLipSyncContextBase.SetVisemeBlend: An unexpected" +
- " error occured.");
- }
- }
- }
-
- /// <summary>
- /// Sets a given viseme id blend weight to a given amount
- /// </summary>
- /// <param name="amount">Integer viseme amount</param>
- public void SetLaughterBlend(int amount)
- {
- OVRLipSync.Result result =
- OVRLipSync.SendSignal(context, OVRLipSync.Signals.LaughterAmount, amount, 0);
-
- if (result != OVRLipSync.Result.Success)
- {
- Debug.LogError("OVRLipSyncContextBase.SetLaughterBlend: An unexpected" +
- " error occured.");
- }
- }
-
- /// <summary>
- /// Resets the context.
- /// </summary>
- /// <returns>error code</returns>
- public OVRLipSync.Result ResetContext()
- {
- // Reset visemes to silence etc.
- frame.Reset();
-
- return OVRLipSync.ResetContext(context);
- }
- }
|