diff --git a/Vocaluxe/Base/CBackgroundMusic.cs b/Vocaluxe/Base/CBackgroundMusic.cs index bfea2893..aa5eef5c 100644 --- a/Vocaluxe/Base/CBackgroundMusic.cs +++ b/Vocaluxe/Base/CBackgroundMusic.cs @@ -4,6 +4,7 @@ using System.Text; using System.IO; using Vocaluxe.Base; +using System.Diagnostics; namespace Vocaluxe.Base { @@ -11,6 +12,10 @@ namespace Vocaluxe.Base { private static CHelper Helper = new CHelper(); private static List _BackgroundMusicStreams = new List(); + private static int _CurrentMusicStream; + private static int _CurrentStreamListIndex = 0; + private static bool _Fading; + private static Stopwatch _FadeTimer = new Stopwatch(); public static void init() { @@ -24,33 +29,62 @@ namespace Vocaluxe.Base { _BackgroundMusicStreams.Add(CSound.Load(file)); } + _CurrentMusicStream = _BackgroundMusicStreams[0]; } public static void Play() { if (CConfig.BackgroundMusic == EOffOn.TR_CONFIG_ON) { - foreach (int i in _BackgroundMusicStreams) + if(_BackgroundMusicStreams.Count == 1) { - CSound.Fade(i, CConfig.BackgroundMusicVolume, CConfig.FadeTime); - CSound.Play(i, true); + CSound.Fade(_BackgroundMusicStreams[0], CConfig.BackgroundMusicVolume, CConfig.FadeTime); + CSound.Play(_BackgroundMusicStreams[0], true); + } + else if (_BackgroundMusicStreams.Count > 1) + { + CSound.Fade(_CurrentMusicStream, CConfig.BackgroundMusicVolume, CConfig.FadeTime); + CSound.Play(_CurrentMusicStream); } } } public static void Stop() { - foreach (int i in _BackgroundMusicStreams) - { - CSound.FadeAndStop(i, CConfig.BackgroundMusicVolume, CConfig.FadeTime); - } + CSound.FadeAndStop(_BackgroundMusicStreams[_CurrentStreamListIndex], CConfig.BackgroundMusicVolume, CConfig.FadeTime); } public static void Pause() { - foreach (int i in _BackgroundMusicStreams) + CSound.Pause(_BackgroundMusicStreams[_CurrentStreamListIndex]); + } + + public static void Update() + { + if (_BackgroundMusicStreams.Count > 1) { - CSound.Pause(i); + float timeToPlay = CSound.GetLength(_CurrentMusicStream) - CSound.GetPosition(_CurrentMusicStream); + if (_FadeTimer.ElapsedMilliseconds >= CConfig.FadeTime * 1000) + { + _Fading = false; + _FadeTimer.Reset(); + } + if ((timeToPlay <= CConfig.FadeTime) && !_Fading) + { + _FadeTimer.Start(); + CSound.Fade(_CurrentMusicStream, 0, CConfig.FadeTime); + _CurrentStreamListIndex++; + if (_CurrentStreamListIndex + 1 > _BackgroundMusicStreams.Count) + { + _CurrentStreamListIndex = 0; + _CurrentMusicStream = _BackgroundMusicStreams[_CurrentStreamListIndex]; + } + else + _CurrentMusicStream = _BackgroundMusicStreams[_CurrentStreamListIndex]; + CSound.SetPosition(_CurrentStreamListIndex, 0); + Play(); + _Fading = true; + } } } } diff --git a/Vocaluxe/Menu/CGraphics.cs b/Vocaluxe/Menu/CGraphics.cs index e08c7cd7..cc05de5b 100644 --- a/Vocaluxe/Menu/CGraphics.cs +++ b/Vocaluxe/Menu/CGraphics.cs @@ -292,6 +292,7 @@ namespace Vocaluxe.Menu Keys.CopyEvents(); CSound.Update(); + CBackgroundMusic.Update(); if (CConfig.CoverLoading == ECoverLoading.TR_CONFIG_COVERLOADING_DYNAMIC && ActualScreen != EScreens.ScreenSing) CSongs.LoadCover(30L);