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/Output/Themes/Ambient/Skin Blue.xml b/Output/Themes/Ambient/Skin Blue.xml index 7be79a61..21f5418c 100644 --- a/Output/Themes/Ambient/Skin Blue.xml +++ b/Output/Themes/Ambient/Skin Blue.xml @@ -218,9 +218,9 @@ Invisible.png - [Blue]BG_Video.mkv - [Blue]IntroIn.mkv - [Blue]IntroMid.mkv - [Blue]IntroOut.mkv + [Blue]BG_Video.mp4 + [Blue]IntroIn.mp4 + [Blue]IntroMid.mp4 + [Blue]IntroOut.mp4 \ No newline at end of file diff --git a/Output/Themes/Ambient/Skin Green.xml b/Output/Themes/Ambient/Skin Green.xml index 2c4c0b60..63a3bdb3 100644 --- a/Output/Themes/Ambient/Skin Green.xml +++ b/Output/Themes/Ambient/Skin Green.xml @@ -218,9 +218,9 @@ Invisible.png - [Green]BG_Video.mkv - [Green]IntroIn.mkv - [Green]IntroMid.mkv - [Green]IntroOut.mkv + [Green]BG_Video.mp4 + [Green]IntroIn.mp4 + [Green]IntroMid.mp4 + [Green]IntroOut.mp4 \ No newline at end of file diff --git a/Output/Themes/Ambient/Skin Red.xml b/Output/Themes/Ambient/Skin Red.xml index 9d1d3cde..1e53d8d3 100644 --- a/Output/Themes/Ambient/Skin Red.xml +++ b/Output/Themes/Ambient/Skin Red.xml @@ -218,9 +218,9 @@ Invisible.png - [Red]BG_Video.mkv - [Red]IntroIn.mkv - [Red]IntroMid.mkv - [Red]IntroOut.mkv + [Red]BG_Video.mp4 + [Red]IntroIn.mp4 + [Red]IntroMid.mp4 + [Red]IntroOut.mp4 \ No newline at end of file diff --git a/Output/Themes/Ambient/Skin Yellow.xml b/Output/Themes/Ambient/Skin Yellow.xml index 126e40c2..ff096567 100644 --- a/Output/Themes/Ambient/Skin Yellow.xml +++ b/Output/Themes/Ambient/Skin Yellow.xml @@ -218,9 +218,9 @@ Invisible.png - [Yellow]BG_Video.mkv - [Yellow]IntroIn.mkv - [Yellow]IntroMid.mkv - [Yellow]IntroOut.mkv + [Yellow]BG_Video.mp4 + [Yellow]IntroIn.mp4 + [Yellow]IntroMid.mp4 + [Yellow]IntroOut.mp4 \ No newline at end of file diff --git a/Output/acinerella.dll b/Output/acinerella.dll index b9711290..22ef1d4e 100644 Binary files a/Output/acinerella.dll and b/Output/acinerella.dll differ 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/Lib/Video/CVideoDecoderFFmpeg.cs b/Vocaluxe/Lib/Video/CVideoDecoderFFmpeg.cs index 9238243f..2ecdcc7b 100644 --- a/Vocaluxe/Lib/Video/CVideoDecoderFFmpeg.cs +++ b/Vocaluxe/Lib/Video/CVideoDecoderFFmpeg.cs @@ -244,6 +244,7 @@ namespace Vocaluxe.Lib.Video private bool _Paused = false; private bool _NoMoreFrames = false; private bool _Finished = false; + private bool _BeforeLoop = false; private int _Width = 0; @@ -314,7 +315,10 @@ namespace Vocaluxe.Lib.Video public bool Finished { - get { return _Finished; } + get + { + return _Finished; + } } public bool Open(string FileName) @@ -395,6 +399,7 @@ namespace Vocaluxe.Lib.Video _VideoSkipTime = _Gap; _NegativeSkipTime = _Start + _Gap; _SkipTime = _Start + _Gap; + _BeforeLoop = false; } if (_SkipTime > 0) @@ -575,7 +580,7 @@ namespace Vocaluxe.Lib.Video return; int FrameFinished = 0; - if (DropFrame) + if (DropFrame && !_BeforeLoop) { try { @@ -588,7 +593,7 @@ namespace Vocaluxe.Lib.Video } - if (!DropFrame || FrameFinished != 0) + if (!_BeforeLoop && (!DropFrame || FrameFinished != 0)) { lock (MutexFrame) { @@ -608,14 +613,15 @@ namespace Vocaluxe.Lib.Video { if (_Loop) { - bool doskip = false; + _BeforeLoop = true; + bool doskip = true; float tm = 0f; int num = -1; lock (MutexFramebuffer) { for (int i = 0; i < _FrameBuffer.Length; i++) { - if (_FrameBuffer[i].time > tm) + if (_FrameBuffer[i].time > tm && !_FrameBuffer[i].displayed) { tm = _FrameBuffer[i].time; num = i; 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 1fd9f2a2..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() @@ -206,13 +208,13 @@ namespace Vocaluxe.Screens if (_CurrentIntroVideoNr == 0 && _Intros[0].IsFinished) { _CurrentIntroVideoNr = 1; + _Intros[1].Loop = true; _Intros[1].Start(); } if (_CurrentIntroVideoNr == 1 && CSongs.CoverLoaded) { _CurrentIntroVideoNr = 2; - _Intros[2].Loop = true; _Intros[2].Start(); } @@ -277,7 +279,7 @@ namespace Vocaluxe.Screens { float VideoTime = _VideoTimer.ElapsedMilliseconds / 1000f; - _Finished = (VideoTime >= CVideo.VdGetLength(_VideoStream)); + _Finished = CVideo.VdFinished(_VideoStream); STexture tex = new STexture(-1); CVideo.VdGetFrame(_VideoStream, ref tex, VideoTime, ref VideoTime); 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(); } }