diff --git a/Vocaluxe/Base/CBackgroundMusic.cs b/Vocaluxe/Base/CBackgroundMusic.cs index 48c173a0..9afc32dd 100644 --- a/Vocaluxe/Base/CBackgroundMusic.cs +++ b/Vocaluxe/Base/CBackgroundMusic.cs @@ -17,7 +17,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Linq; using VocaluxeLib; @@ -39,7 +38,7 @@ namespace Vocaluxe.Base private static int _Video = -1; private static CTexture _CurrentVideoTexture; - private static readonly Stopwatch _FadeTimer = new Stopwatch(); + private static CFading _VideoFading; private static bool _VideoEnabled; private static bool _OwnMusicAdded; @@ -442,12 +441,12 @@ namespace Vocaluxe.Base float vtime; if (CVideo.GetFrame(_Video, ref _CurrentVideoTexture, CSound.GetPosition(_CurrentMusicStream), out vtime)) { - if (_FadeTimer.ElapsedMilliseconds <= 3000L) - _CurrentVideoTexture.Color.A = _FadeTimer.ElapsedMilliseconds / 3000f; - else + if (_VideoFading != null) { - _CurrentVideoTexture.Color.A = 1f; - _FadeTimer.Stop(); + bool finished; + _CurrentVideoTexture.Color.A = _VideoFading.GetValue(out finished); + if (finished) + _VideoFading = null; } return _CurrentVideoTexture; } @@ -469,8 +468,7 @@ namespace Vocaluxe.Base CVideo.Skip(_Video, _CurrentPlaylistElement.Start, _CurrentPlaylistElement.VideoGap); else CVideo.Skip(_Video, 0f, _CurrentPlaylistElement.VideoGap); - _FadeTimer.Reset(); - _FadeTimer.Start(); + _VideoFading = new CFading(0f, 1f, 3f); } } diff --git a/Vocaluxe/Base/CCursor.cs b/Vocaluxe/Base/CCursor.cs index 1ac568cd..94a1e495 100644 --- a/Vocaluxe/Base/CCursor.cs +++ b/Vocaluxe/Base/CCursor.cs @@ -24,10 +24,7 @@ namespace Vocaluxe.Base { class CCursor { - private readonly Stopwatch _CursorFadingTimer = new Stopwatch(); - private float _CursorTargetAlpha = 1f; - private float _CursorStartAlpha; - private float _CursorFadingTime = 0.5f; + private CFading _Fading; private CTexture _Cursor; private readonly Stopwatch _Movetimer = new Stopwatch(); @@ -52,28 +49,19 @@ namespace Vocaluxe.Base public void Draw() { - if (_Movetimer.IsRunning && _Movetimer.ElapsedMilliseconds / 1000f > CSettings.MouseMoveOffTime) + if (_Movetimer.IsRunning && _Movetimer.ElapsedMilliseconds > CSettings.MouseMoveOffTime) { _Movetimer.Stop(); _Fade(0f, 0.5f); } - if (_CursorFadingTimer.IsRunning) + if (_Fading != null) { - float t = _CursorFadingTimer.ElapsedMilliseconds / 1000f; - if (t < _CursorFadingTime) - { - if (_CursorTargetAlpha >= _CursorStartAlpha) - _Cursor.Color.A = _CursorStartAlpha + (_CursorTargetAlpha - _CursorStartAlpha) * t / _CursorFadingTime; - else - _Cursor.Color.A = (_CursorStartAlpha - _CursorTargetAlpha) * (1f - t / _CursorFadingTime); - } - else - { - _CursorFadingTimer.Stop(); - _Cursor.Color.A = _CursorTargetAlpha; - } + bool finished; + _Cursor.Color.A = _Fading.GetValue(out finished); + if (finished) + _Fading = null; } if (Visible && (CSettings.GameState == EGameState.EditTheme || ShowCursor)) @@ -85,11 +73,10 @@ namespace Vocaluxe.Base if (Math.Abs(_Cursor.Rect.X - x) > CSettings.MouseMoveDiffMin || Math.Abs(_Cursor.Rect.Y - y) > CSettings.MouseMoveDiffMin) { - if (_CursorTargetAlpha < 0.01) + if (!IsActive) _Fade(1f, 0.2f); - _Movetimer.Reset(); - _Movetimer.Start(); + _Movetimer.Restart(); CSettings.MouseActive(); } @@ -130,26 +117,13 @@ namespace Vocaluxe.Base public void FadeIn() { - _Movetimer.Reset(); - _Movetimer.Start(); + _Movetimer.Restart(); _Fade(1f, 0.2f); } private void _Fade(float targetAlpha, float time) { - _CursorFadingTimer.Stop(); - _CursorFadingTimer.Reset(); - - if (targetAlpha >= 0f && targetAlpha <= 1f) - _CursorTargetAlpha = targetAlpha; - else - _CursorTargetAlpha = 1f; - - if (time >= 0f) - _CursorFadingTime = time; - - _CursorStartAlpha = _Cursor.Color.A; - _CursorFadingTimer.Start(); + _Fading = new CFading(_Cursor.Color.A, targetAlpha, time); } } } \ No newline at end of file diff --git a/Vocaluxe/Base/CGraphics.cs b/Vocaluxe/Base/CGraphics.cs index 92a2577b..0966424a 100644 --- a/Vocaluxe/Base/CGraphics.cs +++ b/Vocaluxe/Base/CGraphics.cs @@ -30,13 +30,11 @@ namespace Vocaluxe.Base { static class CGraphics { - private static bool _Fading; - private static Stopwatch _FadingTimer; + private static CFading _Fading; private static readonly CCursor _Cursor = new CCursor(); private static float _GlobalAlpha; private static float _ZOffset; - private static IMenu _OldScreen; private static EScreens _CurrentScreen; private static EScreens _NextScreen; private static EPopupScreens _CurrentPopupScreen; @@ -98,7 +96,6 @@ namespace Vocaluxe.Base _CurrentScreen = EScreens.ScreenLoad; _NextScreen = EScreens.ScreenNull; _CurrentPopupScreen = EPopupScreens.NoPopup; - _FadingTimer = new Stopwatch(); _VolumePopupTimer = new Stopwatch(); _GlobalAlpha = 1f; @@ -198,11 +195,9 @@ namespace Vocaluxe.Base public static bool Draw() { - if ((_NextScreen != EScreens.ScreenNull) && !_Fading) + if (_NextScreen != EScreens.ScreenNull && _Fading == null) { - _Fading = true; - _FadingTimer.Reset(); - _FadingTimer.Start(); + _Fading = new CFading(0f, 1f, CConfig.FadeTime); if (_NextScreen == EScreens.ScreenPartyDummy) { @@ -216,49 +211,29 @@ namespace Vocaluxe.Base HidePopup(EPopupScreens.PopupPlayerControl); } - if (_Fading) + if (_Fading != null) { - long fadeTime = (long)(CConfig.FadeTime * 1000); + bool finished; + float newAlpha = _Fading.GetValue(out finished); - if ((_FadingTimer.ElapsedMilliseconds < fadeTime) && (CConfig.FadeTime > 0)) + if (!finished) { - long ms = 1; - if (_FadingTimer.ElapsedMilliseconds > 0) - ms = _FadingTimer.ElapsedMilliseconds; - - float factor = (float)ms / fadeTime; - - _GlobalAlpha = 1f; // -factor / 100f; + _GlobalAlpha = 1f; // -newAlpha / 100f; _ZOffset = CSettings.ZFar / 2; - if (_CurrentScreen == EScreens.ScreenPartyDummy) - { - CFonts.PartyModeID = CParty.CurrentPartyModeID; - _OldScreen.Draw(); - CFonts.PartyModeID = -1; - } - else - _OldScreen.Draw(); + _DrawScreen(_CurrentScreen); - _GlobalAlpha = factor; + _GlobalAlpha = newAlpha; _ZOffset = 0f; - if (_NextScreen == EScreens.ScreenPartyDummy) - { - CFonts.PartyModeID = CParty.CurrentPartyModeID; - _Screens[(int)_NextScreen].Draw(); - CFonts.PartyModeID = -1; - } - else - _Screens[(int)_NextScreen].Draw(); + _DrawScreen(_NextScreen); _GlobalAlpha = 1f; } else { _Screens[(int)_CurrentScreen].OnClose(); - GC.Collect(); _CurrentScreen = _NextScreen; _NextScreen = EScreens.ScreenNull; if (CBackgroundMusic.IsPlaying) @@ -266,32 +241,13 @@ namespace Vocaluxe.Base _Screens[(int)_CurrentScreen].OnShowFinish(); _Screens[(int)_CurrentScreen].ProcessMouseMove(_Cursor.X, _Cursor.Y); - if (_CurrentScreen == EScreens.ScreenPartyDummy) - { - CFonts.PartyModeID = CParty.CurrentPartyModeID; - _Screens[(int)_CurrentScreen].Draw(); - CFonts.PartyModeID = -1; - } - else - _Screens[(int)_CurrentScreen].Draw(); + _DrawScreen(_CurrentScreen); - _Fading = false; - _FadingTimer.Stop(); + _Fading = null; } } else - { - if (_CurrentScreen == EScreens.ScreenPartyDummy) - { - CFonts.PartyModeID = CParty.CurrentPartyModeID; - _Screens[(int)_CurrentScreen].Draw(); - CFonts.PartyModeID = -1; - } - else - _Screens[(int)_CurrentScreen].Draw(); - - _OldScreen = _Screens[(int)_CurrentScreen]; - } + _DrawScreen(_CurrentScreen); foreach (IMenu popup in _PopupScreens) popup.Draw(); @@ -302,6 +258,18 @@ namespace Vocaluxe.Base return true; } + private static void _DrawScreen(EScreens screen) + { + if (screen == EScreens.ScreenPartyDummy) + { + CFonts.PartyModeID = CParty.CurrentPartyModeID; + _Screens[(int)screen].Draw(); + CFonts.PartyModeID = -1; + } + else + _Screens[(int)screen].Draw(); + } + public static void FadeTo(EScreens screen) { if (screen == EScreens.ScreenPartyDummy) @@ -483,8 +451,7 @@ namespace Vocaluxe.Base if (_CurrentPopupScreen == EPopupScreens.NoPopup && diff != 0) { ShowPopup(EPopupScreens.PopupVolumeControl); - _VolumePopupTimer.Reset(); - _VolumePopupTimer.Start(); + _VolumePopupTimer.Restart(); } CBackgroundMusic.ApplyVolume(); @@ -498,7 +465,7 @@ namespace Vocaluxe.Base CDraw.MakeScreenShot(); else { - if (!_Fading) + if (_Fading == null) { bool handled = false; if (_CurrentPopupScreen != EPopupScreens.NoPopup) @@ -562,12 +529,14 @@ namespace Vocaluxe.Base bool handled = false; if (_CurrentPopupScreen != EPopupScreens.NoPopup) + { handled = _PopupScreens[(int)_CurrentPopupScreen].HandleMouse(mouseEvent); - if (handled && _CurrentPopupScreen == EPopupScreens.PopupVolumeControl) - _Screens[(int)_CurrentScreen].ApplyVolume(); + if (handled && _CurrentPopupScreen == EPopupScreens.PopupVolumeControl) + _Screens[(int)_CurrentScreen].ApplyVolume(); + } - if (!handled && !_Fading && (_Cursor.IsActive || mouseEvent.LB || mouseEvent.RB || mouseEvent.MB)) + if (!handled && _Fading == null && (_Cursor.IsActive || mouseEvent.LB || mouseEvent.RB || mouseEvent.MB)) resume &= _Screens[(int)_CurrentScreen].HandleMouse(mouseEvent); if (!eventsAvailable) @@ -594,14 +563,14 @@ namespace Vocaluxe.Base CDraw.MakeScreenShot(); else { - if (!_Fading) + if (_Fading == null) _Screens[(int)_CurrentScreen].HandleInputThemeEditor(keyEvent); } } while (mouse.PollEvent(ref mouseEvent)) { - if (!_Fading) + if (_Fading == null) _Screens[(int)_CurrentScreen].HandleMouseThemeEditor(mouseEvent); _UpdateMousePosition(mouseEvent.X, mouseEvent.Y); diff --git a/Vocaluxe/Base/CSettings.cs b/Vocaluxe/Base/CSettings.cs index 8d0c527b..e978691d 100644 --- a/Vocaluxe/Base/CSettings.cs +++ b/Vocaluxe/Base/CSettings.cs @@ -129,7 +129,7 @@ namespace Vocaluxe.Base public const int NumNoteLines = 11; public static int MouseMoveDiffMin = 2; - public const float MouseMoveOffTime = 3f; + public const int MouseMoveOffTime = 3000; //in ms public const int MaxNumPlayer = 6; public const int MaxScore = 10000; diff --git a/Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs b/Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs index 2b43716f..dc856e98 100644 --- a/Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs +++ b/Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs @@ -213,14 +213,6 @@ namespace Vocaluxe.Lib.Sound private class CGstreamerSharpAudioStream { - private enum EStreamAction - { - Nothing, - Pause, - Stop, - Close - } - private Element _Element; private bool _Loop; public volatile bool Closed = true; diff --git a/Vocaluxe/Lib/Sound/COpenALPlay.cs b/Vocaluxe/Lib/Sound/COpenALPlay.cs index 67891ffb..6ab9f2b4 100644 --- a/Vocaluxe/Lib/Sound/COpenALPlay.cs +++ b/Vocaluxe/Lib/Sound/COpenALPlay.cs @@ -24,6 +24,7 @@ using System.IO; using System.Threading; using Vocaluxe.Base; using Vocaluxe.Lib.Sound.Decoder; +using VocaluxeLib; namespace Vocaluxe.Lib.Sound { @@ -370,14 +371,8 @@ namespace Vocaluxe.Lib.Sound private float _Volume = 1f; private float _VolumeMax = 1f; - private readonly Stopwatch _FadeTimer = new Stopwatch(); - - private float _FadeTime; - private float _TargetVolume = 1f; - private float _StartVolume = 1f; - private bool _CloseStreamAfterFade; - private bool _PauseStreamAfterFade; - private bool _Fading; + private EStreamAction _AfterFadeAction; + private CFading _Fading; private readonly Stopwatch _Timer = new Stopwatch(); @@ -519,33 +514,28 @@ namespace Vocaluxe.Lib.Sound public void Fade(float targetVolume, float fadeTime) { - _Fading = true; - _FadeTimer.Stop(); - _FadeTimer.Reset(); - _StartVolume = _Volume; - _TargetVolume = targetVolume / 100f; - _FadeTime = fadeTime; - _FadeTimer.Start(); + _Fading = new CFading(_Volume, targetVolume, fadeTime); + _AfterFadeAction = EStreamAction.Nothing; } public void FadeAndPause(float targetVolume, float fadeTime) { - _PauseStreamAfterFade = true; Fade(targetVolume, fadeTime); + _AfterFadeAction = EStreamAction.Pause; } public void FadeAndStop(float targetVolume, float fadeTime, Closeproc closeProc, int streamID) { _Closeproc = closeProc; _StreamID = streamID; - _CloseStreamAfterFade = true; Fade(targetVolume, fadeTime); + _AfterFadeAction = EStreamAction.Stop; } public void Play() { Paused = false; - _PauseStreamAfterFade = false; + _AfterFadeAction = EStreamAction.Nothing; AL.SourcePlay(_Source); } @@ -745,21 +735,23 @@ namespace Vocaluxe.Lib.Sound private void _Update() { - if (_Fading) + if (_Fading != null) { - if (_FadeTimer.ElapsedMilliseconds / 1000f < _FadeTime) - _Volume = _StartVolume + (_TargetVolume - _StartVolume) * ((_FadeTimer.ElapsedMilliseconds / 1000f) / _FadeTime); - else + bool finished; + _Volume = _Fading.GetValue(out finished); + if (finished) { - _Volume = _TargetVolume; - _FadeTimer.Stop(); - _Fading = false; - - if (_CloseStreamAfterFade) - _Terminated = true; - - if (_PauseStreamAfterFade) - Paused = true; + switch (_AfterFadeAction) + { + case EStreamAction.Close: + case EStreamAction.Stop: + _Terminated = true; + break; + case EStreamAction.Pause: + Paused = true; + break; + } + _Fading = null; } } } diff --git a/Vocaluxe/Lib/Sound/CPortAudioPlay.cs b/Vocaluxe/Lib/Sound/CPortAudioPlay.cs index 82af2e91..2be82c2c 100644 --- a/Vocaluxe/Lib/Sound/CPortAudioPlay.cs +++ b/Vocaluxe/Lib/Sound/CPortAudioPlay.cs @@ -17,7 +17,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.InteropServices; @@ -25,6 +24,7 @@ using System.Threading; using Vocaluxe.Base; using Vocaluxe.Lib.Sound.Decoder; using Vocaluxe.Lib.Sound.PortAudio; +using VocaluxeLib; namespace Vocaluxe.Lib.Sound { @@ -351,15 +351,8 @@ namespace Vocaluxe.Lib.Sound private float _Volume = 1f; private float _VolumeMax = 1f; - private readonly Stopwatch _FadeTimer = new Stopwatch(); - - private float _FadeTime; - private float _TargetVolume = 1f; - private float _StartVolume = 1f; - private bool _CloseStreamAfterFade; - private bool _PauseStreamAfterFade; - private bool _StopStreamAfterFade; - private bool _Fading; + private EStreamAction _AfterFadeAction; + private CFading _Fading; private static CPortAudio.SPaHostApiInfo _ApiInfo; private static CPortAudio.SPaDeviceInfo _OutputDeviceInfo; @@ -507,19 +500,12 @@ namespace Vocaluxe.Lib.Sound public void Fade(float targetVolume, float fadeTime) { - _Fading = true; - _FadeTimer.Stop(); - _FadeTimer.Reset(); - _StartVolume = _Volume; - _TargetVolume = targetVolume / 100f; - _FadeTime = fadeTime; - _FadeTimer.Start(); + _Fading = new CFading(_Volume, targetVolume, fadeTime); + _AfterFadeAction = EStreamAction.Nothing; } public void FadeAndPause(float targetVolume, float fadeTime) { - _PauseStreamAfterFade = true; - Fade(targetVolume, fadeTime); } @@ -527,25 +513,22 @@ namespace Vocaluxe.Lib.Sound { _Closeproc = closeProc; _StreamID = streamID; - _CloseStreamAfterFade = true; - Fade(targetVolume, fadeTime); + _AfterFadeAction = EStreamAction.Close; } public void FadeAndStop(float targetVolume, float fadeTime, Closeproc closeProc, int streamID) { _Closeproc = closeProc; _StreamID = streamID; - _StopStreamAfterFade = true; - Fade(targetVolume, fadeTime); + _AfterFadeAction = EStreamAction.Stop; } public void Play() { Paused = false; - _PauseStreamAfterFade = false; - _StopStreamAfterFade = false; + _AfterFadeAction = EStreamAction.Nothing; lock (_Mutex) { _ErrorCheck("StartStream", CPortAudio.Pa_StartStream(_Ptr)); @@ -927,23 +910,25 @@ namespace Vocaluxe.Lib.Sound private void _Update() { - if (_Fading) + if (_Fading != null) { - if (_FadeTimer.ElapsedMilliseconds / 1000f < _FadeTime) - _Volume = _StartVolume + (_TargetVolume - _StartVolume) * ((_FadeTimer.ElapsedMilliseconds / 1000f) / _FadeTime); - else + bool finished; + _Volume = _Fading.GetValue(out finished); + if (finished) { - _Volume = _TargetVolume; - _FadeTimer.Stop(); - _Fading = false; - - if (_CloseStreamAfterFade) - _Terminated = true; - - if (_PauseStreamAfterFade) - Paused = true; - if (_StopStreamAfterFade) - Stop(); + switch (_AfterFadeAction) + { + case EStreamAction.Close: + _Terminated = true; + break; + case EStreamAction.Stop: + Stop(); + break; + case EStreamAction.Pause: + Paused = true; + break; + } + _Fading = null; } } } diff --git a/Vocaluxe/Lib/Sound/IPlayback.cs b/Vocaluxe/Lib/Sound/IPlayback.cs index 935956f5..22d7d7b7 100644 --- a/Vocaluxe/Lib/Sound/IPlayback.cs +++ b/Vocaluxe/Lib/Sound/IPlayback.cs @@ -17,6 +17,14 @@ namespace Vocaluxe.Lib.Sound { + public enum EStreamAction + { + Nothing, + Pause, + Stop, + Close + } + struct SAudioStreams { public int Handle; diff --git a/VocaluxeLib/CFading.cs b/VocaluxeLib/CFading.cs index 5f04e647..0b6761cb 100644 --- a/VocaluxeLib/CFading.cs +++ b/VocaluxeLib/CFading.cs @@ -34,6 +34,8 @@ namespace VocaluxeLib /// Duration of the fading in seconds public CFading(float fromValue, float toValue, float duration) { + if (duration < 0) + duration = 0; _FromValue = fromValue; _ToValue = toValue; _Duration = duration * 1000f; diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs index 211da48f..9cdd19dd 100644 --- a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs +++ b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs @@ -17,7 +17,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Xml; using VocaluxeLib.Draw; @@ -99,7 +98,7 @@ namespace VocaluxeLib.Menu.SongMenu protected SThemeSongMenu _Theme; private bool _ThemeLoaded; - private readonly Stopwatch _VideoFadeTimer = new Stopwatch(); + private CFading _VideoFading; private readonly List _Streams = new List(); protected CTexture _Vidtex; @@ -388,12 +387,12 @@ namespace VocaluxeLib.Menu.SongMenu { if (_Vidtex != null) { - if (_VideoFadeTimer.ElapsedMilliseconds <= 3000L) - _Vidtex.Color.A = _VideoFadeTimer.ElapsedMilliseconds / 3000f; - else + if (_VideoFading != null) { - _Vidtex.Color.A = 1f; - _VideoFadeTimer.Stop(); + bool finished; + _Vidtex.Color.A = _VideoFading.GetValue(out finished); + if (finished) + _VideoFading = null; } } } @@ -563,9 +562,7 @@ namespace VocaluxeLib.Menu.SongMenu if (_PreviewVideoStream == -1) return; CBase.Video.Skip(_PreviewVideoStream, startposition, song.VideoGap); - _VideoFadeTimer.Stop(); - _VideoFadeTimer.Reset(); - _VideoFadeTimer.Start(); + _VideoFading = new CFading(0f, 1f, 3f); } } }