public static void updateTrackingData(uint userId, FubiTrackingData data, FubiAccelerationData accelData = null) { GCHandle hSkeleton = new GCHandle(); GCHandle hAccel = new GCHandle(); IntPtr skelPointer = new IntPtr(0); IntPtr accelPointer = new IntPtr(0); double timeStamp = -1; if (data != null) { float[] skeletonArray = data.getArray(); hSkeleton = GCHandle.Alloc(skeletonArray, GCHandleType.Pinned); skelPointer = hSkeleton.AddrOfPinnedObject(); timeStamp = data.timeStamp; } if (accelData != null) { float[] accelArray = accelData.getArray(); hAccel = GCHandle.Alloc(accelArray, GCHandleType.Pinned); accelPointer = hAccel.AddrOfPinnedObject(); if (timeStamp < 0) timeStamp = accelData.timeStamp; } FubiInternal.updateTrackingData(userId, skelPointer, timeStamp, accelPointer); if (hSkeleton.IsAllocated) hSkeleton.Free(); if (hAccel.IsAllocated) hAccel.Free(); }