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); } }