Ejemplo n.º 1
0
        private void Tick()
        {
            _time.Start();
            while (true)
            {
                PlayerState state     = State;
                bool        playing   = state == PlayerState.Playing;
                bool        recording = state == PlayerState.Recording;
                if (!playing && !recording)
                {
                    goto stop;
                }

                void MixerProcess()
                {
                    _mixer.ChannelTick();
                    _mixer.Process(playing, recording);
                }

                while (_tempoStack >= 240)
                {
                    _tempoStack -= 240;
                    bool allDone = true;
                    for (int trackIndex = 0; trackIndex < _tracks.Length; trackIndex++)
                    {
                        Track track = _tracks[trackIndex];
                        track.Tick();
                        while (track.Rest == 0 && !track.Stopped)
                        {
                            ExecuteNext(track);
                        }
                        if (trackIndex == _longestTrack)
                        {
                            if (ElapsedTicks == MaxTicks)
                            {
                                if (!track.Stopped)
                                {
                                    List <SongEvent> evs = Events[trackIndex];
                                    for (int i = 0; i < evs.Count; i++)
                                    {
                                        SongEvent ev = evs[i];
                                        if (ev.Offset == track.CurOffset)
                                        {
                                            ElapsedTicks = ev.Ticks[0] - track.Rest;
                                            break;
                                        }
                                    }
                                    _elapsedLoops++;
                                    if (ShouldFadeOut && !_mixer.IsFading() && _elapsedLoops > NumLoops)
                                    {
                                        _mixer.BeginFadeOut();
                                    }
                                }
                            }
                            else
                            {
                                ElapsedTicks++;
                            }
                        }
                        if (!track.Stopped || track.Channels.Count != 0)
                        {
                            allDone = false;
                        }
                    }
                    if (_mixer.IsFadeDone())
                    {
                        allDone = true;
                    }
                    if (allDone)
                    {
                        MixerProcess();
                        State = PlayerState.Stopped;
                        SongEnded?.Invoke();
                    }
                }
                _tempoStack += _tempo;
                MixerProcess();
                if (playing)
                {
                    _time.Wait();
                }
            }
stop:
            _time.Stop();
        }
Ejemplo n.º 2
0
 private void Tick()
 {
     time.Start();
     while (State == PlayerState.Playing || State == PlayerState.Recording)
     {
         while (tempoStack >= 240)
         {
             tempoStack -= 240;
             bool allDone = true;
             for (int i = 0; i < tracks.Length; i++)
             {
                 Track track = tracks[i];
                 track.Tick();
                 while (track.Rest == 0 && !track.Stopped)
                 {
                     ExecuteNext(i);
                 }
                 if (i == longestTrack)
                 {
                     if (ElapsedTicks == MaxTicks)
                     {
                         if (!track.Stopped)
                         {
                             ElapsedTicks = Events[i][track.CurEvent].Ticks[0] - track.Rest;
                             elapsedLoops++;
                             if (ShouldFadeOut && !fadeOutBegan && elapsedLoops > NumLoops)
                             {
                                 fadeOutBegan = true;
                                 mixer.BeginFadeOut();
                             }
                         }
                     }
                     else
                     {
                         ElapsedTicks++;
                     }
                 }
                 if (!track.Stopped || track.Channels.Count != 0)
                 {
                     allDone = false;
                 }
             }
             if (fadeOutBegan && mixer.IsFadeDone())
             {
                 allDone = true;
             }
             if (allDone)
             {
                 State = PlayerState.Stopped;
                 SongEnded?.Invoke();
             }
         }
         tempoStack += tempo;
         mixer.ChannelTick();
         mixer.Process(State == PlayerState.Playing, State == PlayerState.Recording);
         if (State == PlayerState.Playing)
         {
             time.Wait();
         }
     }
     time.Stop();
 }