using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using com.rfilkov.kinect;
namespace com.rfilkov.components
{
///
/// This component tries to play back multiple recording files, if applicable.
///
public class PlayMultipleRecordings : MonoBehaviour
{
[Tooltip("Depth sensor index - 0 is the 1st one, 1 - the 2nd one, etc.")]
public int sensorIndex = 0;
[Tooltip("List of full paths to recording files that need to be played back.")]
public string[] recordingFiles = new string[0];
// references to KM & sensor data
private KinectManager kinectManager = null;
private DepthSensorBase sensorInterface = null;
private int recFileIndex = -1;
private ulong lastDepthFrameTime = 0;
private float lastUnityTime = 0f;
private bool isGoToNextRec = false;
void Update()
{
// find the KinectManager-component in the scene
if(kinectManager == null)
{
kinectManager = FindObjectOfType();
if(kinectManager == null)
{
Debug.LogError("Can't find the KinectManager-component! Please check your scene setup.");
}
}
// find the sensor-interface component in the scene
if(sensorInterface == null)
{
DepthSensorBase[] sensorInterfaces = FindObjectsOfType();
for(int i = 0; i < sensorInterfaces.Length; i++)
{
if(sensorInterfaces[i].deviceStreamingMode != KinectInterop.DeviceStreamingMode.Disabled)
{
sensorInterface = sensorInterfaces[i];
}
}
if (sensorInterface == null)
{
Debug.LogError("Can't find any active sensor interface component! Please check your scene setup.");
}
}
if (kinectManager && sensorInterface && recordingFiles.Length > 0)
{
// update the recording file if needed
if(isGoToNextRec || recFileIndex < 0)
{
// stop depth sensor
if (kinectManager.IsInitialized())
{
Debug.Log("Stopping depth sensors...");
kinectManager.StopDepthSensors();
}
// change the recording file
recFileIndex = (recFileIndex + 1) % recordingFiles.Length;
string recordingFile = recordingFiles[recFileIndex];
sensorInterface.deviceStreamingMode = KinectInterop.DeviceStreamingMode.PlayRecording;
sensorInterface.recordingFile = recordingFile;
Debug.Log("Setting new playback file: " + recordingFile);
if(kinectManager && kinectManager.statusInfoText)
{
kinectManager.statusInfoText.text = string.Empty;
}
// restart depth sensor
Debug.Log("Restarting depth sensors...");
kinectManager.StartDepthSensors();
lastUnityTime = Time.time;
isGoToNextRec = false;
}
if(lastDepthFrameTime != kinectManager.GetDepthFrameTime(sensorIndex))
{
lastDepthFrameTime = kinectManager.GetDepthFrameTime(sensorIndex);
lastUnityTime = Time.time;
}
else
{
if((Time.time - lastUnityTime) >= 3f) // no depth data for 3 seconds
{
Debug.Log("Timed out. Switch to the next recording.");
isGoToNextRec = true;
}
}
}
}
}
}