Choreoh.MainWindow.playSegment C# (CSharp) Method

playSegment() private method

private playSegment ( ) : void
return void
        private void playSegment()
        {
            commentBoxCanvas.Visibility = Visibility.Collapsed;
            // play the segment
            if (isPlaying)
            {
                // for the weird double-clicking issues...
                return;
            }
            //darken background so user's attention brough to video
            var videoPlayerTimer = new DispatcherTimer();
            int videoCounter = 0;

            videoPlaybackCanvas.Visibility = Visibility.Visible;
            Image img = new System.Windows.Controls.Image();

            videoPlaybackCanvas.Children.Add(img);

            Canvas.SetTop(img, 0);
            Canvas.SetLeft(img, 0);
            videoPlayerTimer.Tick += new EventHandler((object localsender, EventArgs locale) =>
            {
                if (videoCounter >= selectedSegment.length)
                {
                    videoPlaybackCanvas.Visibility = Visibility.Collapsed;
                    (localsender as DispatcherTimer).Stop();
                    return;
                }

                img.Source = selectedSegment.getFrameSource(videoCounter);

                videoCounter++;
            });
            videoPlayerTimer.Interval = new TimeSpan((int)((1.0 / 30) * (1000000000 / 100)));
            Debug.WriteLine("Videplayer Tick Interval is " + videoPlayerTimer.Interval.TotalMilliseconds + " milliseconds");

            int frameOfSegmentStart = 0;
            foreach (KeyValuePair<int, DanceSegment> kvp in routine.segments)
            {
                if (kvp.Value == selectedSegment)
                {
                    frameOfSegmentStart = kvp.Key;
                    break;
                }
            }
            int frameOfSegmentEnd = frameOfSegmentStart + selectedSegment.length;

            TimeSpan startTime = new TimeSpan(0, 0, (int)(frameOfSegmentStart / 30.0));
            TimeSpan durationTime = new TimeSpan(0, 0, (int)((frameOfSegmentEnd - frameOfSegmentStart) / 30.0));

            waveform.selectStart(frameOfSegmentStart / 30);
            waveform.selectEnd(frameOfSegmentEnd / 30);

            var waveformTicker = new DispatcherTimer();
            waveformTicker.Tick += new EventHandler((object localsender, EventArgs locale) =>
            {
                if (waveform.isPlaying())
                {
                    Debug.WriteLine("waveform is playing, so tick");
                    waveform.movePlay();
                }
                else
                {
                    Debug.WriteLine("waveform stopped playing, so stop ticking");
                    (localsender as DispatcherTimer).Stop();
                }
            });
            double secondsPerPixel = 1 / waveform.getPixelsPerSecond();
            double nanoseconds = secondsPerPixel * 1000000000;
            int ticks = (int)(nanoseconds / 100);
            Debug.WriteLine("Ticks: " + ticks);
            waveformTicker.Interval = new TimeSpan(ticks);

            var playbackTimer = new DispatcherTimer();
            playbackTimer.Tick += new EventHandler((object localsender, EventArgs locale) =>
            {
                (localsender as DispatcherTimer).Stop();
                videoPlayerTimer.Stop();
                waveformTicker.Stop();
                waveform.endPlay();
                waveform.deselectSegment();
                hideMode();
                isPlaying = false;
                videoPlaybackCanvas.Visibility = Visibility.Collapsed;
            });
            playbackTimer.Interval = durationTime;

            AudioPlay.playForDuration(mainCanvas, songFilename, startTime, durationTime);
            videoPlayerTimer.Start();
            waveformTicker.Start();
            waveform.startPlay();
            playbackTimer.Start();
            switchModeToPlayback();
            isPlaying = true;
        }