public void ForceFadeNow(ForceFadeType fadeType)
        {
            if (PlayState != PlayState.Playing)
            {
                return;
            }

            if (NextTrack == null || CurrentTrack == null)
            {
                return;
            }

            if (fadeType == ForceFadeType.SkipToEnd)
            {
                AudioStreamHelper.SetPosition(CurrentTrack,
                                              CurrentTrack.FadeOutStart - CurrentTrack.SecondsToSamples(0.01M));
            }
            else
            {
                CurrentForceFadeType = fadeType;
                IsForceFadeNowMode   = true;

                var length = 0D;
                switch (fadeType)
                {
                case ForceFadeType.Cut:
                    length = GetCutFadeLength(CurrentTrack);
                    break;

                case ForceFadeType.PowerDown:
                    length = GetPowerDownFadeLength(CurrentTrack);
                    CurrentTrack.PowerDownOnEnd = true;
                    break;

                case ForceFadeType.QuickFade:
                    length = GetCutFadeLength(CurrentTrack);
                    break;

                case ForceFadeType.SkipToEnd:
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(fadeType), fadeType, null);
                }

                if (CurrentTrack.FadeOutLengthSeconds < length)
                {
                    length = CurrentTrack.FadeOutLengthSeconds;
                }

                CurrentTrack.EndLoopCount = 0;

                BassMix.BASS_Mixer_ChannelRemoveSync(CurrentTrack.ChannelId, CurrentTrack.FadeOutStartSyncId);
                CurrentTrack.FadeOutStartSyncId = int.MinValue;
                BassMix.BASS_Mixer_ChannelRemoveSync(CurrentTrack.ChannelId, CurrentTrack.FadeOutEndSyncId);
                CurrentTrack.FadeOutEndSyncId = int.MinValue;

                var position = AudioStreamHelper.GetPosition(CurrentTrack);
                CurrentTrack.FadeOutStart = position + CurrentTrack.SecondsToSamples(0.05M);
                SetTrackSync(CurrentTrack, CurrentTrack.FadeOutStart, SyncType.StartFadeOut);

                CurrentTrack.FadeOutEnd = CurrentTrack.FadeOutStart + CurrentTrack.SecondsToSamples(length);
                SetTrackSync(CurrentTrack, CurrentTrack.FadeOutEnd, SyncType.EndFadeOut);
            }
        }