public void Unload()
 {
     Status = PointCloudPlayerStatus.NotLoaded;
     Reset();
 }
        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);
            }
        }
        public void Play()
        {
            if (Status == PointCloudPlayerStatus.NotLoaded)
                return;

            if (Status != PointCloudPlayerStatus.Playing)
            {
                var playOffset = CurrentTimeUTC - MinTimeUTC;
                _playbackStartUTC = DateTime.Now - playOffset;
                _soundPlayer.Seek(playOffset);
            }
            Status = PointCloudPlayerStatus.Playing;
            _soundPlayer.Play();
        }
        public void Stop()
        {
            if (Status == PointCloudPlayerStatus.NotLoaded)
                return;

            if (Status == PointCloudPlayerStatus.Playing)
            {
                Status = PointCloudPlayerStatus.Stopped;
            }
            _soundPlayer.Stop();
        }
        public void Load(string filename)
        {
            Reset();

            if (!File.Exists(filename))
            {
                Unload();
                return;
            }

            lock (_zipFileLock)
            {
                if (_zipFile != null)
                {
                    _zipFile.Dispose();
                    _zipFile = null;
                }

                _zipFile = new ZipFile(filename);

                if (!_zipFile.EntryFileNames.Contains(descriptionFilename))
                {
                    Unload();
                    return;
                }

                var frameFiles = _zipFile.EntryFileNames.Where(s => s.Substring(s.Length - 3, 3) == "mfx");

                _filesToLoad = frameFiles.OrderBy(f => f).ToList();

                if (_filesToLoad.Count == 0)
                {
                    Unload();
                    return;
                }

                if (_zipFile.EntryFileNames.Contains(audioFilename))
                {
                    if (_audioStream != null)
                    {
                        _audioStream.Dispose();
                        _audioStream = null;
                    }
                    _audioStream = new MemoryStream();
                    _zipFile[audioFilename].Extract(_audioStream);
                    _audioStream.Position = 0;
                    _soundPlayer.LoadWavStream(_audioStream);
                }

                using (var settingsStream = new MemoryStream())
                {
                    _zipFile[descriptionFilename].Extract(settingsStream);
                    settingsStream.Position = 0;
                    var description = PointCloudStreamDescription.Load(settingsStream);

                    MinTimeUTC = description.RecordingStartDateTimeUTC;
                    CurrentTimeUTC = MinTimeUTC;
                    MaxTimeUTC = description.RecordingStopDateTimeUTC;

                    int count = description.FrameCount;
                    var span = MaxTimeUTC - MinTimeUTC;
                    if (count > 0 && span.TotalSeconds > 0)
                    {
                        FileFPS = count / span.TotalSeconds;
                    }
                }
            }

            Status = PointCloudPlayerStatus.Stopped;
            Seek(0);
        }
        private void PlayFrames()
        {
            if (Status != PointCloudPlayerStatus.Playing)
            {
                return;
            }

            if (CurrentFrameIndex >= MaxFrameIndex)
            {
                Status = PointCloudPlayerStatus.Stopped;
                Seek(0);
                _soundPlayer.Stop();
            }

            var currentTime = DateTime.Now;
            var timeOffset = currentTime - _playbackStartUTC;
            _soundPlayer.Seek(timeOffset);
            var targetPlayerTime = MinTimeUTC + timeOffset;

            MotionFrame playFrame = null;

            lock (_bufferedFrames)
            {
                while (_bufferedFrames.Count > 0)
                {
                    var frame = _bufferedFrames.Peek();

                    if (frame.TimeUTC <= targetPlayerTime)
                    {
                        playFrame = _bufferedFrames.Dequeue();
                        CurrentFrameIndex++;
                    }
                    else
                    {
                        break;
                    }
                }
                if (_bufferedFrames.Count == 0)
                {
                    Trace.WriteLine("empty buffer");
                }
            }

            if (playFrame != null)
            {
                CurrentTimeUTC = playFrame.TimeUTC;

                var offsetMS = (playFrame.TimeUTC - targetPlayerTime).TotalMilliseconds;

                Trace.WriteLine("Playing frame " + CurrentFrameIndex + " id: " + playFrame.Id + " time offset: " + offsetMS.ToString("F4"));

                OnMotionFrameAvailable(playFrame);
            }
        }
 public void Stop()
 {
     Status = PointCloudPlayerStatus.Stopped;
     _soundPlayer.Stop();
 }
 public void Play()
 {
     if (Status != PointCloudPlayerStatus.Playing && CurrentFrameIndex == 0)
     {
         _playbackStartUTC = DateTime.Now;
     }
     Status = PointCloudPlayerStatus.Playing;
     _soundPlayer.Play();
 }
        public void Load(string directory, string frameMask, string audioFilename)
        {
            Reset();

            if (!Directory.Exists("Recording/"))
            {
                Directory.CreateDirectory("Recording/");
            }

            _soundPlayer.Load(audioFilename);

            IEnumerable<string> files = Directory.EnumerateFiles("Recording/", "frame*.mfx");

            _filesToLoad = new List<string>(files.OrderBy(f => f));

            if (_filesToLoad.Count == 0)
            {
                Unload();
                return;
            }
            MotionFrameHeader header = _serializer.LoadHeader(_filesToLoad.FirstOrDefault());

            MinTimeUTC = header.TimeUTC;
            CurrentTimeUTC = header.TimeUTC;

            header = _serializer.LoadHeader(_filesToLoad.LastOrDefault());

            MaxTimeUTC = header.TimeUTC;

            Seek(0);
            Status = PointCloudPlayerStatus.Stopped;
        }