private void PlayFrames()
{
if (Status != PointCloudPlayerStatus.Playing)
{
return;
}
if (CurrentFrameIndex >= MaxFrameIndex)
{
Status = PointCloudPlayerStatus.Stopped;
Seek(0);
_soundPlayer.Stop();
OnPlaybackEnded();
}
var timeOffset = DateTime.Now - _playbackStartUTC;
var targetPlayerTime = MinTimeUTC + timeOffset;
MotionFrame playFrame = null;
int lastFrameIndex = CurrentFrameIndex;
lock (_bufferedFrames)
{
while (_bufferedFrames.Count > 0)
{
var frame = _bufferedFrames.OrderBy(f => f.Id).First();
if (frame.TimeUTC <= targetPlayerTime)
{
playFrame = frame;
_bufferedFrames.Remove(frame);
CurrentFrameIndex++;
}
else
{
break;
}
}
}
if (CurrentFrameIndex - lastFrameIndex > 1)
{
Trace.WriteLine("Skipped a frame from " + lastFrameIndex + " to " + CurrentFrameIndex);
}
if (playFrame != null)
{
CurrentTimeUTC = playFrame.TimeUTC;
var offsetMS = (playFrame.TimeUTC - targetPlayerTime).TotalMilliseconds;
Debug.WriteLine("Playing frame " + CurrentFrameIndex + " id: " + playFrame.Id + " time offset: " + offsetMS.ToString("F4"));
//_soundPlayer.Stop();
if (Math.Abs(offsetMS) > 100)
{
var span = CurrentTimeUTC - MinTimeUTC;
if (CurrentFrameIndex % 30 == 0)
Trace.WriteLine("Reseeking audio to " + span.ToString());
_soundPlayer.Seek(span);
}
//_soundPlayer.Play();
OnMotionFrameAvailable(playFrame);
}
}