diff --git a/Output/Languages/Deutsch.xml b/Output/Languages/Deutsch.xml index f6990785..be0b28c6 100644 --- a/Output/Languages/Deutsch.xml +++ b/Output/Languages/Deutsch.xml @@ -84,6 +84,10 @@ Normal Erweitert + + Eigene Musik und Hintergrundmusik + Keine eigene Musik + Nur eigene Musik Laden @@ -148,9 +152,6 @@ Kategorieren anzeigen Schwierigkeit Timer-Modus - - Hintergrundmusik - Hintergrundmusiklautstärke Aufnahmeeinstellungen Soundkarte @@ -162,6 +163,9 @@ Verzögerungs-Test Soundeinstellungen + Hintergrundmusik + Hintergrundmusiklautstärke + Hintergrundmusikquelle Designeinstellungen Design diff --git a/Output/Languages/English.xml b/Output/Languages/English.xml index 21a7b39f..25d2537b 100644 --- a/Output/Languages/English.xml +++ b/Output/Languages/English.xml @@ -84,6 +84,10 @@ Normal Expanded + + Own Music and Background Music + No own Musik + Only own Musik Loading @@ -148,9 +152,6 @@ Tabs Game Difficulty Timer-Mode - - Backgroundmusic - Backgroundmusic Volume Record Options Device @@ -162,6 +163,9 @@ Delay Test Options Sound + Backgroundmusic + Backgroundmusic Volume + Backgroundmusic Source Theme Options Theme diff --git a/Output/Languages/French.xml b/Output/Languages/French.xml index 287f3966..fd473b6a 100644 --- a/Output/Languages/French.xml +++ b/Output/Languages/French.xml @@ -84,6 +84,10 @@ Normal Développé + + TODO: Own Music and Background Music + TODO: No own Musik + TODO: Only own Musik Chargement @@ -148,9 +152,6 @@ Dossiers Difficulté du Jeu Mode du Minuteur - - TODO: Backgroundmusic - TODO: Backgroundmusic Volume Options d'Enregistrement Appareil @@ -162,6 +163,9 @@ Test du Retard Options du Son + TODO: Backgroundmusic + TODO: Backgroundmusic Volume + TODO: Backgroundmusic Source Options du Thème Thème diff --git a/Output/Themes/Ambient/Screens/ScreenOptionsSound.xml b/Output/Themes/Ambient/Screens/ScreenOptionsSound.xml index 31cafddc..018a2e36 100644 --- a/Output/Themes/Ambient/Screens/ScreenOptionsSound.xml +++ b/Output/Themes/Ambient/Screens/ScreenOptionsSound.xml @@ -115,7 +115,34 @@ - + + + + 75 + 225 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Left + + + + Normal + + TR_SCREENOSOUND_BACKGROUNDMUSICSOURCE + + + + Button @@ -302,5 +329,70 @@ 3 + + + Invisible + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + 500 + 220 + 0,00 + 700 + 50 + + 505 + 225 + 0,00 + 40 + 40 + + 1170 + 225 + 0,00 + 40 + 40 + + + SelectSlideColor + + + SelectSlideSColor + + + SelectSlideHColor + + + ArrowColor + + + ArrowSColor + + + TextColor + + + TextSColor + + 32,00 + + 205,33 + + Normal + + Bold + + 3 + \ No newline at end of file diff --git a/Vocaluxe/Base/CBackgroundMusic.cs b/Vocaluxe/Base/CBackgroundMusic.cs index 0df27f5c..374d8d5b 100644 --- a/Vocaluxe/Base/CBackgroundMusic.cs +++ b/Vocaluxe/Base/CBackgroundMusic.cs @@ -5,45 +5,33 @@ using System.IO; using Vocaluxe.Base; using System.Diagnostics; +using Vocaluxe.Lib.Song; namespace Vocaluxe.Base { static class CBackgroundMusic { private static CHelper Helper = new CHelper(); - private static List _BackgroundMusicStreams = new List(); - private static int _CurrentMusicStream; - private static int _CurrentStreamListIndex = 0; + private static int _CurrentMusicStream = -1; private static bool _Fading; private static Stopwatch _FadeTimer = new Stopwatch(); + private static Random _Random = new Random(); + private static List _BackgroundMusicFileNames = new List(); + private static int _CurrentBackgroundMusicFileNameIndex; + private static bool _OwnMusicAdded; + private static bool _BackgroundMusicAdded; public static void Init() { - List files = new List(); - files.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.mp3", true, true)); - files.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.wav", true, true)); - files.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.ogg", true, true)); - files.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.wma", true, true)); - - foreach (string file in files) - { - _BackgroundMusicStreams.Add(CSound.Load(file)); - } - - if(_BackgroundMusicStreams.Count > 0) - _CurrentMusicStream = _BackgroundMusicStreams[0]; + if(CConfig.BackgroundMusicSource == EBackgroundMusicSource.TR_CONFIG_NO_OWN_MUSIC || CConfig.BackgroundMusicSource == EBackgroundMusicSource.TR_CONFIG_OWN_MUSIC) + AddBackgroundMusic(); } public static void Play() { if (CConfig.BackgroundMusic == EOffOn.TR_CONFIG_ON) { - if(_BackgroundMusicStreams.Count == 1) - { - CSound.Fade(_BackgroundMusicStreams[0], CConfig.BackgroundMusicVolume, CConfig.FadeTime); - CSound.Play(_BackgroundMusicStreams[0], true); - } - else if (_BackgroundMusicStreams.Count > 1) + if (_BackgroundMusicFileNames.Count > 0) { CSound.Fade(_CurrentMusicStream, CConfig.BackgroundMusicVolume, CConfig.FadeTime); CSound.Play(_CurrentMusicStream); @@ -53,19 +41,19 @@ namespace Vocaluxe.Base public static void Stop() { - if(_BackgroundMusicStreams.Count > 0) - CSound.FadeAndStop(_BackgroundMusicStreams[_CurrentStreamListIndex], CConfig.BackgroundMusicVolume, CConfig.FadeTime); + if (_BackgroundMusicFileNames.Count > 0) + CSound.FadeAndStop(_CurrentMusicStream, CConfig.BackgroundMusicVolume, CConfig.FadeTime); } public static void Pause() { - if (_BackgroundMusicStreams.Count > 0) - CSound.FadeAndPause(_BackgroundMusicStreams[_CurrentStreamListIndex], 0, CConfig.FadeTime); + if (_BackgroundMusicFileNames.Count > 0) + CSound.FadeAndPause(_CurrentMusicStream, 0, CConfig.FadeTime); } public static void Update() { - if (_BackgroundMusicStreams.Count > 1) + if (_BackgroundMusicFileNames.Count > 0) { float timeToPlay = CSound.GetLength(_CurrentMusicStream) - CSound.GetPosition(_CurrentMusicStream); if (_FadeTimer.ElapsedMilliseconds >= CConfig.FadeTime * 1000) @@ -76,25 +64,85 @@ namespace Vocaluxe.Base 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(_CurrentMusicStream, 0); - Play(); + Next(); _Fading = true; } } } + public static void Next() + { + if (_BackgroundMusicFileNames.Count > 0) + { + if (_CurrentMusicStream != -1) + CSound.FadeAndStop(_CurrentMusicStream, 0, CConfig.FadeTime); + _CurrentBackgroundMusicFileNameIndex = _Random.Next(_BackgroundMusicFileNames.Count); + _CurrentMusicStream = CSound.Load(_BackgroundMusicFileNames[_CurrentBackgroundMusicFileNameIndex]); + Play(); + } + else if (_BackgroundMusicAdded || _OwnMusicAdded) + { + if (_CurrentMusicStream != -1) + CSound.FadeAndStop(_CurrentMusicStream, 0, CConfig.FadeTime); + } + } + public static void ApplyVolume() { - CSound.SetStreamVolume(_BackgroundMusicStreams[_CurrentStreamListIndex], CConfig.BackgroundMusicVolume); + CSound.Fade(_CurrentMusicStream, CConfig.BackgroundMusicVolume, CConfig.FadeTime); + } + + public static void AddOwnMusic() + { + if (!_OwnMusicAdded) + { + foreach (CSong song in CSongs.AllSongs) + { + _BackgroundMusicFileNames.Add(song.GetMP3()); + } + } + _OwnMusicAdded = true; + Next(); + } + + public static void RemoveOwnMusic() + { + foreach (CSong song in CSongs.AllSongs) + { + _BackgroundMusicFileNames.Remove(song.GetMP3()); + } + _OwnMusicAdded = false; + } + + public static void AddBackgroundMusic() + { + if (!_BackgroundMusicAdded) + { + _BackgroundMusicFileNames.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.mp3", true, true)); + _BackgroundMusicFileNames.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.wav", true, true)); + _BackgroundMusicFileNames.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.ogg", true, true)); + _BackgroundMusicFileNames.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.wma", true, true)); + _BackgroundMusicAdded = true; + Next(); + } + } + + public static void RemoveBackgroundMusic() + { + if (_BackgroundMusicAdded) + { + List removeList = new List(); + removeList.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.mp3", true, true)); + removeList.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.wav", true, true)); + removeList.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.ogg", true, true)); + removeList.AddRange(Helper.ListFiles(CSettings.sFolderBackgroundMusic, "*.wma", true, true)); + + foreach (string s in removeList) + { + _BackgroundMusicFileNames.Remove(s); + } + _BackgroundMusicAdded = false; + } } } } diff --git a/Vocaluxe/Base/CConfig.cs b/Vocaluxe/Base/CConfig.cs index 95f9fb6b..2854b90a 100644 --- a/Vocaluxe/Base/CConfig.cs +++ b/Vocaluxe/Base/CConfig.cs @@ -134,6 +134,14 @@ namespace Vocaluxe.Base TR_CONFIG_TIMERLOOK_NORMAL, TR_CONFIG_TIMERLOOK_EXPANDED } + + public enum EBackgroundMusicSource + { + TR_CONFIG_NO_OWN_MUSIC, + TR_CONFIG_ONLY_OWN_MUSIC, + TR_CONFIG_OWN_MUSIC + } + #endregion Enums static class CConfig @@ -175,6 +183,7 @@ namespace Vocaluxe.Base public static uint PortAudioBufferSize = 1024; public static int BackgroundMusicVolume = 50; public static EOffOn BackgroundMusic = EOffOn.TR_CONFIG_ON; + public static EBackgroundMusicSource BackgroundMusicSource = EBackgroundMusicSource.TR_CONFIG_NO_OWN_MUSIC; // Game public static List SongFolder = new List(); @@ -286,6 +295,7 @@ namespace Vocaluxe.Base CHelper.TryGetEnumValueFromXML("//root/Sound/RecordLib", navigator, ref RecordLib); CHelper.TryGetEnumValueFromXML("//root/Sound/BackgroundMusic", navigator, ref BackgroundMusic); CHelper.TryGetIntValueFromXML("//root/Sound/BackgroundMusicVolume", navigator, ref BackgroundMusicVolume); + CHelper.TryGetEnumValueFromXML("//root/Sound/BackgroundMusicSource", navigator, ref BackgroundMusicSource); #endregion Sound #region Game @@ -483,6 +493,9 @@ namespace Vocaluxe.Base writer.WriteComment("Background Music Volume from 0 to 100"); writer.WriteElementString("BackgroundMusicVolume", BackgroundMusicVolume.ToString()); + writer.WriteComment("Background Music Source"); + writer.WriteElementString("BackgroundMusicSource", Enum.GetName(typeof(EBackgroundMusicSource), BackgroundMusicSource)); + writer.WriteEndElement(); #endregion Sound diff --git a/Vocaluxe/Program.cs b/Vocaluxe/Program.cs index 6c65184e..0a8015dd 100644 --- a/Vocaluxe/Program.cs +++ b/Vocaluxe/Program.cs @@ -87,6 +87,8 @@ namespace Vocaluxe CBackgroundMusic.Init(); CLog.StopBenchmark(0, "Init Background Music"); + Application.DoEvents(); + // Init Profiles CLog.StartBenchmark(0, "Init Profiles"); CProfiles.Init(); diff --git a/Vocaluxe/Screens/CScreenLoad.cs b/Vocaluxe/Screens/CScreenLoad.cs index 24b5180d..ab4b2430 100644 --- a/Vocaluxe/Screens/CScreenLoad.cs +++ b/Vocaluxe/Screens/CScreenLoad.cs @@ -190,6 +190,8 @@ namespace Vocaluxe.Screens _Intros[2].Close(); CLog.StopBenchmark(3, "Load Cover"); + if(CConfig.BackgroundMusicSource == EBackgroundMusicSource.TR_CONFIG_ONLY_OWN_MUSIC || CConfig.BackgroundMusicSource == EBackgroundMusicSource.TR_CONFIG_OWN_MUSIC) + CBackgroundMusic.AddOwnMusic(); } private void CheckStartIntroVideos() diff --git a/Vocaluxe/Screens/CScreenOptionsSound.cs b/Vocaluxe/Screens/CScreenOptionsSound.cs index 1c3cca41..919f4c40 100644 --- a/Vocaluxe/Screens/CScreenOptionsSound.cs +++ b/Vocaluxe/Screens/CScreenOptionsSound.cs @@ -16,6 +16,7 @@ namespace Vocaluxe.Screens private const string SelectSlideBackgroundMusic = "SelectSlideBackgroundMusic"; private const string SelectSlideBackgroundMusicVolume = "SelectSlideBackgroundMusicVolume"; + private const string SelectSlideBackgroundMusicSource = "SelectSlideBackgroundMusicSource"; private const string ButtonExit = "ButtonExit"; @@ -35,7 +36,7 @@ namespace Vocaluxe.Screens _ScreenVersion = ScreenVersion; _ThemeButtons = new string[] { ButtonExit }; - _ThemeSelectSlides = new string[] { SelectSlideBackgroundMusic, SelectSlideBackgroundMusicVolume }; + _ThemeSelectSlides = new string[] { SelectSlideBackgroundMusic, SelectSlideBackgroundMusicVolume, SelectSlideBackgroundMusicSource }; } public override void LoadTheme() @@ -44,6 +45,8 @@ namespace Vocaluxe.Screens SelectSlides[htSelectSlides(SelectSlideBackgroundMusic)].SetValues((int)CConfig.BackgroundMusic); SelectSlides[htSelectSlides(SelectSlideBackgroundMusicVolume)].AddValues(new string[] { "0", "5", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55", "60", "65", "70", "75", "80", "85", "90", "95", "100"}); SelectSlides[htSelectSlides(SelectSlideBackgroundMusicVolume)].Selection = CConfig.BackgroundMusicVolume / 5; + SelectSlides[htSelectSlides(SelectSlideBackgroundMusicSource)].SetValues((int)CConfig.BackgroundMusicSource); + SelectSlides[htSelectSlides(SelectSlideBackgroundMusicSource)].Selection = (int)CConfig.BackgroundMusicSource; } public override bool HandleInput(KeyEvent KeyEvent) @@ -137,6 +140,24 @@ namespace Vocaluxe.Screens CConfig.BackgroundMusicVolume = SelectSlides[htSelectSlides(SelectSlideBackgroundMusicVolume)].Selection * 5; CBackgroundMusic.ApplyVolume(); + if (CConfig.BackgroundMusicSource != (EBackgroundMusicSource)SelectSlides[htSelectSlides(SelectSlideBackgroundMusicSource)].Selection) + { + CConfig.BackgroundMusicSource = (EBackgroundMusicSource)SelectSlides[htSelectSlides(SelectSlideBackgroundMusicSource)].Selection; + if (CConfig.BackgroundMusicSource == EBackgroundMusicSource.TR_CONFIG_NO_OWN_MUSIC) + { + CBackgroundMusic.RemoveOwnMusic(); + CBackgroundMusic.AddBackgroundMusic(); + } + if (CConfig.BackgroundMusicSource == EBackgroundMusicSource.TR_CONFIG_ONLY_OWN_MUSIC) + { + CBackgroundMusic.RemoveBackgroundMusic(); + CBackgroundMusic.AddOwnMusic(); + } + if (CConfig.BackgroundMusicSource == EBackgroundMusicSource.TR_CONFIG_OWN_MUSIC) + CBackgroundMusic.AddOwnMusic(); + + } + CConfig.SaveConfig(); } }