diff --git a/Vocaluxe/Base/CBackgroundMusic.cs b/Vocaluxe/Base/CBackgroundMusic.cs index 65b2bc65..d4cf5f60 100644 --- a/Vocaluxe/Base/CBackgroundMusic.cs +++ b/Vocaluxe/Base/CBackgroundMusic.cs @@ -31,6 +31,7 @@ namespace Vocaluxe.Base private static bool _Initialized; private static CSongPlayer _SongPlayer; + private static CSongPlayer _PreviewPlayer; private static bool _OwnSongsAvailable; private static EBackgroundMusicSource _MusicSource; @@ -46,6 +47,7 @@ namespace Vocaluxe.Base private static bool _OwnMusicAdded; private static bool _BackgroundMusicAdded; private static bool _Disabled; + private static bool _PlaysPreview; public static bool VideoEnabled { @@ -83,18 +85,28 @@ namespace Vocaluxe.Base get { return _SongPlayer.SongHasVideo; } } - public static bool IsPlaying { get { return _SongPlayer.IsPlaying; } } + public static bool IsPlaying { get { return _PlaysPreview ? _PreviewPlayer.IsPlaying : _SongPlayer.IsPlaying; } } + + public static bool IsPlayingPreview { get { return _PlaysPreview; } } public static string ArtistAndTitle { - get { - return _BGMusicFiles.Contains(_CurrentPlaylistElement) ? Path.GetFileNameWithoutExtension(_CurrentPlaylistElement.MusicFilePath) :_SongPlayer.ArtistAndTitle; + get { + if (_PlaysPreview) + return _PreviewPlayer.ArtistAndTitle; + else + return _BGMusicFiles.Contains(_CurrentPlaylistElement) ? Path.GetFileNameWithoutExtension(_CurrentPlaylistElement.MusicFilePath) : _SongPlayer.ArtistAndTitle; } } + public static float Length + { + get { return _PlaysPreview ? _PreviewPlayer.Length : _SongPlayer.Length; } + } + public static CTexture Cover { - get { return _SongPlayer.Cover; } + get { return _PlaysPreview ? _PreviewPlayer.Cover : _SongPlayer.Cover; } } //Use this to set whether own songs are available for access @@ -129,6 +141,10 @@ namespace Vocaluxe.Base _SongPlayer = new CSongPlayer(); _SongPlayer.Volume = CConfig.BackgroundMusicVolume; + _PreviewPlayer = new CSongPlayer(); + _PreviewPlayer.Volume = CConfig.PreviewMusicVolume; + _PreviewPlayer.RepeatSong = true; + _VideoEnabled = (CConfig.VideoBackgrounds == EOffOn.TR_CONFIG_ON && CConfig.VideosToBackground == EOffOn.TR_CONFIG_ON); SetMusicSource(CConfig.BackgroundMusicSource); _Initialized = true; @@ -137,6 +153,7 @@ namespace Vocaluxe.Base public static void Close() { _SongPlayer.Close(); + _PreviewPlayer.Close(); _BGMusicFiles.Clear(); _NotPlayedFiles.Clear(); @@ -147,16 +164,17 @@ namespace Vocaluxe.Base public static void Play() { - if (IsPlaying || CConfig.BackgroundMusic == EOffOn.TR_CONFIG_OFF) + if (IsPlaying || (CConfig.BackgroundMusic == EOffOn.TR_CONFIG_OFF && !_PlaysPreview)) return; - if (_SongPlayer.SongLoaded) - { - //Resume - _SongPlayer.TogglePause(); - } + if (_PlaysPreview) + _PreviewPlayer.TogglePause(); else - Next(); + if (_SongPlayer.SongLoaded) + //Resume + _SongPlayer.TogglePause(); + else + Next(); } public static void Stop() @@ -164,9 +182,17 @@ namespace Vocaluxe.Base if (!IsPlaying) return; - _SongPlayer.Stop(); - - _CurrentPlaylistElement = null; + if (_PlaysPreview) + { + _PreviewPlayer.Stop(); + _PlaysPreview = false; + Play(); + } + else + { + _SongPlayer.Stop(); + _CurrentPlaylistElement = null; + } } public static void Pause() @@ -174,65 +200,79 @@ namespace Vocaluxe.Base if (!IsPlaying) return; - _SongPlayer.TogglePause(); + if (_PlaysPreview) + _PreviewPlayer.TogglePause(); + else + _SongPlayer.TogglePause(); } public static void Next() { - Stop(); //stop last song if any - if (_PreviousMusicIndex < _PreviousFiles.Count - 2) + if (!_PlaysPreview) { - //We are in the previous list and next element exists - _PreviousMusicIndex++; - _CurrentPlaylistElement = _PreviousFiles[_PreviousMusicIndex]; - } - else - { - //We are not in the previous list (anymore) - if (_NotPlayedFiles.Count == 0) + Stop(); //stop last song if any + if (_PreviousMusicIndex < _PreviousFiles.Count - 2) { - if (_PreviousFiles.Count == 0) - return; //No songs to play - _NotPlayedFiles.AddRange(_PreviousFiles); + //We are in the previous list and next element exists + _PreviousMusicIndex++; + _CurrentPlaylistElement = _PreviousFiles[_PreviousMusicIndex]; } + else + { + //We are not in the previous list (anymore) + if (_NotPlayedFiles.Count == 0) + { + if (_PreviousFiles.Count == 0) + return; //No songs to play + _NotPlayedFiles.AddRange(_PreviousFiles); + } - _CurrentPlaylistElement = _NotPlayedFiles[CGame.Rand.Next(_NotPlayedFiles.Count)]; - _NotPlayedFiles.Remove(_CurrentPlaylistElement); + _CurrentPlaylistElement = _NotPlayedFiles[CGame.Rand.Next(_NotPlayedFiles.Count)]; + _NotPlayedFiles.Remove(_CurrentPlaylistElement); - _PreviousFiles.Add(_CurrentPlaylistElement); - _PreviousMusicIndex = _PreviousFiles.Count - 1; + _PreviousFiles.Add(_CurrentPlaylistElement); + _PreviousMusicIndex = _PreviousFiles.Count - 1; + } + _StartSong(); } - _StartSong(); } public static void Previous() { - if (_PreviousMusicIndex < 0) - return; - Debug.Assert(_CurrentPlaylistElement != null); - if (_SongPlayer.Position <= 1.5f && _PreviousMusicIndex > 0) + if (!_PlaysPreview) { - Stop(); //stop last song - _PreviousMusicIndex--; + if (_PreviousMusicIndex < 0) + return; + Debug.Assert(_CurrentPlaylistElement != null); + if (_SongPlayer.Position <= 1.5f && _PreviousMusicIndex > 0) + { + Stop(); //stop last song + _PreviousMusicIndex--; - _CurrentPlaylistElement = _PreviousFiles[_PreviousMusicIndex]; + _CurrentPlaylistElement = _PreviousFiles[_PreviousMusicIndex]; + } + _StartSong(); } - _StartSong(); } public static void Update() { - if (!IsPlaying && !_SongPlayer.SongLoaded) + if (!IsPlaying && (!_SongPlayer.SongLoaded || !_PreviewPlayer.SongLoaded) ) return; - _SongPlayer.Update(); - if (_SongPlayer.IsFinished) - Next(); + if (_PlaysPreview) + _PreviewPlayer.Update(); + else + { + _SongPlayer.Update(); + if (_SongPlayer.IsFinished) + Next(); + } } public static CTexture GetVideoTexture() { - return _SongPlayer.GetVideoTexture(); + return _PlaysPreview ? _PreviewPlayer.GetVideoTexture() : _SongPlayer.GetVideoTexture(); } public static void SetMusicSource(EBackgroundMusicSource source) @@ -258,6 +298,28 @@ namespace Vocaluxe.Base } } + public static void LoadPreview(CSong song, float start = 0f) + { + Stop(); + + if (song == null) + return; + + if (start == 0f) + start = song.Preview.StartTime; + + _PlaysPreview = true; + _PreviewPlayer.Load(song, start); + } + + public static void PlayPreview(float start = -1f) + { + if (start > -1f) + _PreviewPlayer.Position = start; + + Play(); + } + /// /// (Re-)Starts the _CurrentPlaylistElement /// diff --git a/Vocaluxe/Base/CConfig.cs b/Vocaluxe/Base/CConfig.cs index fbf02ada..2e73bc8e 100644 --- a/Vocaluxe/Base/CConfig.cs +++ b/Vocaluxe/Base/CConfig.cs @@ -263,8 +263,6 @@ namespace Vocaluxe.Base xmlReader.TryGetEnumValue("//root/Sound/BackgroundMusicUseStart", ref BackgroundMusicUseStart); xmlReader.TryGetIntValueRange("//root/Sound/PreviewMusicVolume", ref _PreviewMusicVolume); xmlReader.TryGetIntValueRange("//root/Sound/GameMusicVolume", ref _GameMusicVolume); - - CPreviewPlayer.UpdateVolume(); #endregion Sound #region Game diff --git a/Vocaluxe/Base/CMain.cs b/Vocaluxe/Base/CMain.cs index f97120ee..9e724f2f 100644 --- a/Vocaluxe/Base/CMain.cs +++ b/Vocaluxe/Base/CMain.cs @@ -51,12 +51,11 @@ namespace Vocaluxe.Base private static readonly IDataBase _DataBase = new CBdataBase(); private static readonly IControllers _Controller = new CBcontrollers(); private static readonly IPlaylist _Playlist = new CBplaylist(); - private static readonly IPreviewPlayer _PreviewPlayer = new CBpreviewPlayer(); public static void Init() { CBase.Assign(_Config, _Settings, _Theme, _Log, _BackgroundMusic, _Draw, _Graphics, _Fonts, _Language, - _Game, _Profiles, _Record, _Songs, _Video, _Sound, _Cover, _DataBase, _Controller, _Playlist, _PreviewPlayer); + _Game, _Profiles, _Record, _Songs, _Video, _Sound, _Cover, _DataBase, _Controller, _Playlist); } } @@ -346,11 +345,21 @@ namespace Vocaluxe.Base return CBackgroundMusic.VideoEnabled; } + public bool IsPlayingPreview() + { + return CBackgroundMusic.IsPlayingPreview; + } + public void SetDisabled(bool disabled) { CBackgroundMusic.Disabled = disabled; } + public float GetLength() + { + return CBackgroundMusic.Length; + } + public void Next() { CBackgroundMusic.Next(); @@ -371,6 +380,21 @@ namespace Vocaluxe.Base CBackgroundMusic.Play(); } + public void Stop() + { + CBackgroundMusic.Stop(); + } + + public void LoadPreview(CSong song, float start = 0f) + { + CBackgroundMusic.LoadPreview(song, start); + } + + public void PlayPreview(float start = -1f) + { + CBackgroundMusic.PlayPreview(start); + } + public CTexture GetVideoTexture() { return CBackgroundMusic.GetVideoTexture(); @@ -971,47 +995,4 @@ namespace Vocaluxe.Base return CPlaylists.GetSong(playlistID, songIndex); } } - - class CBpreviewPlayer : IPreviewPlayer - { - public void Play(float start = -1) - { - CPreviewPlayer.Play(); - } - - public void Load(CSong song, float start = 0f) - { - CPreviewPlayer.Load(song, start); - } - - public void Stop() - { - CPreviewPlayer.Stop(); - } - - public void TogglePause() - { - CPreviewPlayer.TogglePause(); - } - - public CTexture GetCover() - { - return CPreviewPlayer.Cover; - } - - public CTexture GetVideoTexture() - { - return CPreviewPlayer.VideoTexture; - } - - public bool IsPlaying() - { - return CPreviewPlayer.IsPlaying; - } - - public float GetLength() - { - return CPreviewPlayer.Length; - } - } } \ No newline at end of file diff --git a/Vocaluxe/Base/CPreviewPlayer.cs b/Vocaluxe/Base/CPreviewPlayer.cs deleted file mode 100644 index 2daf7e1d..00000000 --- a/Vocaluxe/Base/CPreviewPlayer.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using VocaluxeLib.Utils.Player; -using VocaluxeLib.Draw; -using VocaluxeLib.Songs; - -namespace Vocaluxe.Base -{ - public static class CPreviewPlayer - { - private static CSongPlayer _Player = new CSongPlayer(true); - - public static CTexture VideoTexture - { - get { return _Player.GetVideoTexture(); } - } - - public static CTexture Cover - { - get { return _Player.Cover; } - } - - public static bool IsPlaying - { - get { return _Player.IsPlaying; } - } - - public static float Length - { - get { return _Player.Length; } - } - - public static void Load(CSong song, float start = 0f) - { - if (song == null) - return; - - if (start == 0f) - start = song.Preview.StartTime; - - _Player.Load(song, start); - } - - public static void Play(float start = -1) - { - if (start > -1) - _Player.Position = start; - _Player.Play(); - } - - public static void TogglePause() - { - _Player.TogglePause(); - } - - public static void Stop() - { - _Player.Stop(); - } - - public static void UpdateVolume() - { - _Player.Volume = CConfig.PreviewMusicVolume; - } - } -} diff --git a/Vocaluxe/Screens/CScreenNames.cs b/Vocaluxe/Screens/CScreenNames.cs index 07eaa297..945e6731 100644 --- a/Vocaluxe/Screens/CScreenNames.cs +++ b/Vocaluxe/Screens/CScreenNames.cs @@ -566,9 +566,6 @@ namespace Vocaluxe.Screens { base.OnClose(); CRecord.Stop(); - - if (CGraphics.NextScreen != EScreens.ScreenSong && CPreviewPlayer.IsPlaying) - CPreviewPlayer.TogglePause(); } public override bool Draw() diff --git a/Vocaluxe/Screens/CScreenScore.cs b/Vocaluxe/Screens/CScreenScore.cs index 19ec84ef..bbf4aaf4 100644 --- a/Vocaluxe/Screens/CScreenScore.cs +++ b/Vocaluxe/Screens/CScreenScore.cs @@ -123,8 +123,7 @@ namespace Vocaluxe.Screens public override void OnShow() { - if (CConfig.BackgroundMusic == EOffOn.TR_CONFIG_ON) - CPreviewPlayer.TogglePause(); + CBackgroundMusic.Disabled = false; base.OnShow(); //-1 --> Show average diff --git a/Vocaluxe/Screens/CScreenSong.cs b/Vocaluxe/Screens/CScreenSong.cs index ffc83c4e..94753053 100644 --- a/Vocaluxe/Screens/CScreenSong.cs +++ b/Vocaluxe/Screens/CScreenSong.cs @@ -662,11 +662,6 @@ namespace Vocaluxe.Screens _Texts[_TextCategory].Text = CSongs.GetCurrentCategoryName(); - if (CSongs.IsInCategory || CConfig.Tabs == EOffOn.TR_CONFIG_OFF) - CBackgroundMusic.Disabled = true; - else - CBackgroundMusic.Disabled = false; - string selectionText = ""; if (CSongs.IsInCategory) { diff --git a/Vocaluxe/Vocaluxe.csproj b/Vocaluxe/Vocaluxe.csproj index ca4e0c7b..b8276467 100644 --- a/Vocaluxe/Vocaluxe.csproj +++ b/Vocaluxe/Vocaluxe.csproj @@ -217,7 +217,6 @@ - diff --git a/VocaluxeLib/CBasic.cs b/VocaluxeLib/CBasic.cs index 348f61de..7a588ee1 100644 --- a/VocaluxeLib/CBasic.cs +++ b/VocaluxeLib/CBasic.cs @@ -38,12 +38,10 @@ namespace VocaluxeLib public static IDataBase DataBase; public static IControllers Controller; public static IPlaylist Playlist; - public static IPreviewPlayer PreviewPlayer; public static void Assign(IConfig config, ISettings settings, ITheme theme, ILog log, IBackgroundMusic backgroundMusic, IDrawing draw, IGraphics graphics, IFonts fonts, ILanguage language, IGame game, IProfiles profiles, IRecording record, - ISongs songs, IVideo video, ISound sound, ICover cover, IDataBase dataBase, IControllers controller, IPlaylist playlist, - IPreviewPlayer previewPlayer) + ISongs songs, IVideo video, ISound sound, ICover cover, IDataBase dataBase, IControllers controller, IPlaylist playlist) { Config = config; Settings = settings; @@ -64,7 +62,6 @@ namespace VocaluxeLib DataBase = dataBase; Controller = controller; Playlist = playlist; - PreviewPlayer = previewPlayer; } } } \ No newline at end of file diff --git a/VocaluxeLib/IBasic.cs b/VocaluxeLib/IBasic.cs index 2158cf62..e59634d7 100644 --- a/VocaluxeLib/IBasic.cs +++ b/VocaluxeLib/IBasic.cs @@ -119,16 +119,23 @@ namespace VocaluxeLib { bool IsDisabled(); bool IsPlaying(); + bool IsPlayingPreview(); bool SongHasVideo(); bool VideoEnabled(); + float GetLength(); void SetDisabled(bool disabled); void Next(); void Previous(); void Pause(); void Play(); + void Stop(); CTexture GetVideoTexture(); + + void LoadPreview(CSong song, float start = 0f); + void PlayPreview(float start = -1f); + } public interface IDrawing diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs index d1221877..b2cd1f92 100644 --- a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs +++ b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs @@ -117,7 +117,7 @@ namespace VocaluxeLib.Menu.SongMenu else if (value >= CBase.Songs.GetNumCategories()) { value = -1; - CBase.PreviewPlayer.Stop(); + CBase.BackgroundMusic.Stop(); } _PreviewNrInternal = value; @@ -395,8 +395,8 @@ namespace VocaluxeLib.Menu.SongMenu if (!_Initialized || !Visible) return; - if (CBase.PreviewPlayer.IsPlaying()) - CBase.Drawing.DrawTexture(CBase.PreviewPlayer.GetVideoTexture(), new SRectF(0, 0, 1280, 720, 0)); + if (CBase.BackgroundMusic.IsPlaying()) + CBase.Drawing.DrawTexture(CBase.BackgroundMusic.GetVideoTexture(), new SRectF(0, 0, 1280, 720, 0)); } public bool IsMouseOverSelectedSong(SMouseEvent mEvent) @@ -506,23 +506,23 @@ namespace VocaluxeLib.Menu.SongMenu if (song == null) return; - CBase.PreviewPlayer.Load(song); + CBase.BackgroundMusic.LoadPreview(song); float startposition = song.Preview.StartTime; - float length = CBase.PreviewPlayer.GetLength(); + float length = CBase.BackgroundMusic.GetLength(); if (song.Preview.Source == EDataSource.None) startposition = length / 4f; else if (startposition > length - 5f) startposition = Math.Max(0f, Math.Min(length / 4f, length - 5f)); - CBase.PreviewPlayer.Play(startposition); + CBase.BackgroundMusic.PlayPreview(startposition); } protected void _ResetPreview() { - CBase.PreviewPlayer.Stop(); + CBase.BackgroundMusic.Stop(); //Make sure we don't have a preview here otherwise a change won't be recognized //(e.g. leave a category with one song and set preview to 0 --> previewOld=previewNew=0 --> No change --> Old data shown diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs index f58d337f..281d9d2e 100644 --- a/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs +++ b/VocaluxeLib/Menu/SongMenu/CSongMenuTileBoard.cs @@ -111,8 +111,8 @@ namespace VocaluxeLib.Menu.SongMenu { if (value == base._PreviewNr) { - if (!CBase.PreviewPlayer.IsPlaying()) - CBase.PreviewPlayer.Play(); + if (!CBase.BackgroundMusic.IsPlaying()) + CBase.BackgroundMusic.PlayPreview(); return; } base._PreviewNr = value; @@ -183,7 +183,7 @@ namespace VocaluxeLib.Menu.SongMenu if (songOptions.Selection.RandomOnly) _PreviewNr = _SelectionNr; - if (_Length < 0 && CBase.Songs.IsInCategory() && CBase.PreviewPlayer.GetLength() > 0) + if (_Length < 0 && CBase.Songs.IsInCategory() && CBase.BackgroundMusic.GetLength() > 0) _UpdateLength(CBase.Songs.GetVisibleSong(_PreviewNr)); } @@ -248,7 +248,7 @@ namespace VocaluxeLib.Menu.SongMenu { if (song == null) return; - float time = CBase.PreviewPlayer.GetLength(); + float time = CBase.BackgroundMusic.GetLength(); if (Math.Abs(song.Finish) > 0.001) time = song.Finish; @@ -467,7 +467,7 @@ namespace VocaluxeLib.Menu.SongMenu _TextBG.Draw(); - CTexture vidtex = CBase.PreviewPlayer.GetVideoTexture(); + CTexture vidtex = CBase.BackgroundMusic.GetVideoTexture(); if (vidtex != null) {