public void Seek(int frameNumber)
{
if (Status == PointCloudPlayerStatus.NotLoaded)
{
throw new InvalidOperationException("Player not loaded");
}
if (frameNumber < 0 || frameNumber > MaxFrameIndex)
{
throw new ArgumentOutOfRangeException("frameNumber");
}
//TODO: intelligently reset buffer
lock (_bufferedFrames)
{
_bufferedFrames.Clear();
}
_nextFrameToLoadIndex = frameNumber;
CurrentFrameIndex = frameNumber;
using (var stream = new MemoryStream())
{
lock (_zipFileLock)
{
_zipFile[_filesToLoad[frameNumber]].Extract(stream);
}
stream.Position = 0;
MotionFrameHeader header = _serializer.DeserializeHeader(stream);
var timeOffset = header.TimeUTC - MinTimeUTC;
if (Status == PointCloudPlayerStatus.Playing)
{
_playbackStartUTC = DateTime.Now - timeOffset;
}
_soundPlayer.Seek(timeOffset);
}
}