diff --git a/Output/Profiles/guest1.xml b/Output/Profiles/guest1.xml index 92f0b29d..a3c68568 100644 --- a/Output/Profiles/guest1.xml +++ b/Output/Profiles/guest1.xml @@ -1,5 +1,6 @@  + 600352d6-d975-4945-9758-e6b379972a12 Guest 1 TR_CONFIG_EASY TR_USERROLE_GUEST diff --git a/Output/Profiles/guest2.xml b/Output/Profiles/guest2.xml index 55c2c971..c4e6e421 100644 --- a/Output/Profiles/guest2.xml +++ b/Output/Profiles/guest2.xml @@ -1,5 +1,6 @@  + abeb987f-bf44-4d6d-b922-e5deb608a1ab Guest 2 TR_CONFIG_EASY TR_USERROLE_GUEST diff --git a/Output/Profiles/guest3.xml b/Output/Profiles/guest3.xml index f8b196f8..9cb86c18 100644 --- a/Output/Profiles/guest3.xml +++ b/Output/Profiles/guest3.xml @@ -1,5 +1,6 @@  + fd433fc4-60c0-4521-87ef-53aa7d252337 Guest 3 TR_CONFIG_EASY TR_USERROLE_GUEST diff --git a/PartyModes/PartyModeChallenge/CPartyModeChallenge.cs b/PartyModes/PartyModeChallenge/CPartyModeChallenge.cs index b37636e3..ce808dec 100644 --- a/PartyModes/PartyModeChallenge/CPartyModeChallenge.cs +++ b/PartyModes/PartyModeChallenge/CPartyModeChallenge.cs @@ -30,7 +30,7 @@ namespace VocaluxeLib.PartyModes.Challenge public class CResultTableRow : IComparable { public int Position; - public int PlayerID; + public Guid PlayerID; public int NumPlayed; public int NumWon; public int NumSingPoints; @@ -121,7 +121,7 @@ namespace VocaluxeLib.PartyModes.Challenge public int NumJokers; public bool RefillJokers; public int[] Jokers; - public List ProfileIDs; + public List ProfileIDs; public ESongSource SongSource; public ESongSorting Sorting; @@ -143,7 +143,7 @@ namespace VocaluxeLib.PartyModes.Challenge private struct SStats { - public int ProfileID; + public Guid ProfileID; public int SingPoints; public int GamePoints; public int Won; @@ -173,7 +173,7 @@ namespace VocaluxeLib.PartyModes.Challenge NumJokers = 5, RefillJokers = true, CurrentRoundNr = 1, - ProfileIDs = new List(), + ProfileIDs = new List(), Sorting = CBase.Config.GetSongSorting(), SongSource = ESongSource.TR_SONGSOURCE_ALLSONGS, PlaylistID = 0, @@ -479,7 +479,7 @@ namespace VocaluxeLib.PartyModes.Challenge if (c != null) players[i].ProfileID = GameData.ProfileIDs[c.Players[i]]; else - players[i].ProfileID = -1; + players[i].ProfileID = Guid.Empty; } #endregion PlayerNames diff --git a/PartyModes/PartyModeChallenge/CPartyScreenChallengeMain.cs b/PartyModes/PartyModeChallenge/CPartyScreenChallengeMain.cs index 5e10bcff..39b6fd51 100644 --- a/PartyModes/PartyModeChallenge/CPartyScreenChallengeMain.cs +++ b/PartyModes/PartyModeChallenge/CPartyScreenChallengeMain.cs @@ -125,6 +125,7 @@ namespace VocaluxeLib.PartyModes.Challenge _AddText(_NextPlayerTexts[_NextPlayerTexts.Count - 1]); _NextPlayerStatics.Add(GetNewStatic(_Statics[_StaticNextPlayer])); _AddStatic(_NextPlayerStatics[_NextPlayerStatics.Count - 1]); + _NextPlayerStatics[_NextPlayerStatics.Count - 1].Aspect = EAspect.Crop; } _Statics[_StaticNextPlayer].Visible = false; } @@ -340,7 +341,7 @@ namespace VocaluxeLib.PartyModes.Challenge _Texts[_TextNextPlayerMessage].Visible = true; for (int i = 0; i < _PartyMode.GameData.NumPlayerAtOnce; i++) { - int id = _PartyMode.GameData.ProfileIDs[_PartyMode.GameData.Rounds[_PartyMode.GameData.CurrentRoundNr - 1].Players[i]]; + Guid id = _PartyMode.GameData.ProfileIDs[_PartyMode.GameData.Rounds[_PartyMode.GameData.CurrentRoundNr - 1].Players[i]]; _NextPlayerStatics[i].Texture = CBase.Profiles.GetAvatar(id); _NextPlayerTexts[i].Text = CBase.Profiles.GetPlayerName(id); _NextPlayerTexts[i].Color = CBase.Themes.GetPlayerColor(i + 1); diff --git a/PartyModes/PartyModeChallenge/CPartyScreenChallengeNames.cs b/PartyModes/PartyModeChallenge/CPartyScreenChallengeNames.cs index 46d354aa..bddb2940 100644 --- a/PartyModes/PartyModeChallenge/CPartyScreenChallengeNames.cs +++ b/PartyModes/PartyModeChallenge/CPartyScreenChallengeNames.cs @@ -15,6 +15,7 @@ // along with Vocaluxe. If not, see . #endregion +using System; using System.Collections.Generic; using VocaluxeLib.Menu; @@ -47,7 +48,7 @@ namespace VocaluxeLib.PartyModes.Challenge while (_PartyMode.GameData.ProfileIDs.Count > _NumPlayer) _PartyMode.GameData.ProfileIDs.RemoveAt(_PartyMode.GameData.ProfileIDs.Count - 1); - List[] ids = new List[] {_PartyMode.GameData.ProfileIDs}; + List[] ids = new List[] {_PartyMode.GameData.ProfileIDs}; SetPartyModeProfiles(ids); } diff --git a/PartyModes/PartyModeChallenge/PartyModeChallenge.csproj b/PartyModes/PartyModeChallenge/PartyModeChallenge.csproj index c2ecf5b3..0d1764d8 100644 --- a/PartyModes/PartyModeChallenge/PartyModeChallenge.csproj +++ b/PartyModes/PartyModeChallenge/PartyModeChallenge.csproj @@ -1,5 +1,5 @@  - + DebugWin AnyCPU @@ -10,8 +10,9 @@ Properties VocaluxeLib.PartyModes.Challenge Challenge - v4.0 - Client + v4.7.1 + + 512 @@ -25,6 +26,7 @@ 4 Off ..\..\CheckingRules.ruleset + false AnyCPU @@ -36,6 +38,7 @@ false WIN Off + false AnyCPU @@ -47,6 +50,7 @@ prompt 4 Off + false AnyCPU @@ -58,6 +62,7 @@ false LINUX Off + false bin @@ -68,6 +73,7 @@ Off prompt ManagedMinimumRules.ruleset + false diff --git a/PartyModes/PartyModeTicTacToe/CPartyModeTicTacToe.cs b/PartyModes/PartyModeTicTacToe/CPartyModeTicTacToe.cs index fa99918c..b8f3c757 100644 --- a/PartyModes/PartyModeTicTacToe/CPartyModeTicTacToe.cs +++ b/PartyModes/PartyModeTicTacToe/CPartyModeTicTacToe.cs @@ -104,8 +104,8 @@ namespace VocaluxeLib.PartyModes.TicTacToe public int NumPlayerTeam2; public int NumFields; public int Team; - public List ProfileIDsTeam1; - public List ProfileIDsTeam2; + public List ProfileIDsTeam1; + public List ProfileIDsTeam2; public List PlayerTeam1; public List PlayerTeam2; @@ -148,8 +148,8 @@ namespace VocaluxeLib.PartyModes.TicTacToe NumPlayerTeam1 = 2, NumPlayerTeam2 = 2, NumFields = 9, - ProfileIDsTeam1 = new List(), - ProfileIDsTeam2 = new List(), + ProfileIDsTeam1 = new List(), + ProfileIDsTeam2 = new List(), PlayerTeam1 = new List(), PlayerTeam2 = new List(), CurrentRoundNr = 0, @@ -491,7 +491,7 @@ namespace VocaluxeLib.PartyModes.TicTacToe for (int i = 0; i < 2; i++) { //default values - players[i].ProfileID = -1; + players[i].ProfileID = Guid.Empty; } //try to fill with the right data diff --git a/PartyModes/PartyModeTicTacToe/CPartyScreenTicTacToeMain.cs b/PartyModes/PartyModeTicTacToe/CPartyScreenTicTacToeMain.cs index 6f7eab3c..a0ec0798 100644 --- a/PartyModes/PartyModeTicTacToe/CPartyScreenTicTacToeMain.cs +++ b/PartyModes/PartyModeTicTacToe/CPartyScreenTicTacToeMain.cs @@ -98,6 +98,9 @@ namespace VocaluxeLib.PartyModes.TicTacToe _CreateFields(); _Buttons[_ButtonField].Visible = false; + + _Statics[_StaticAvatarT1].Aspect = EAspect.Crop; + _Statics[_StaticAvatarT2].Aspect = EAspect.Crop; } public override bool HandleInput(SKeyEvent keyEvent) diff --git a/PartyModes/PartyModeTicTacToe/CPartyScreenTicTacToeNames.cs b/PartyModes/PartyModeTicTacToe/CPartyScreenTicTacToeNames.cs index 8d0e6cae..c0e7cc1c 100644 --- a/PartyModes/PartyModeTicTacToe/CPartyScreenTicTacToeNames.cs +++ b/PartyModes/PartyModeTicTacToe/CPartyScreenTicTacToeNames.cs @@ -15,6 +15,7 @@ // along with Vocaluxe. If not, see . #endregion +using System; using System.Collections.Generic; using VocaluxeLib.Menu; @@ -49,7 +50,7 @@ namespace VocaluxeLib.PartyModes.TicTacToe SetPartyModeData(2, _PartyMode.GameData.NumPlayerTeam1 + _PartyMode.GameData.NumPlayerTeam2, new int[] {_PartyMode.GameData.NumPlayerTeam1, _PartyMode.GameData.NumPlayerTeam2}); - List[] ids = new List[] {_PartyMode.GameData.ProfileIDsTeam1, _PartyMode.GameData.ProfileIDsTeam2}; + List[] ids = new List[] {_PartyMode.GameData.ProfileIDsTeam1, _PartyMode.GameData.ProfileIDsTeam2}; SetPartyModeProfiles(ids); } diff --git a/PartyModes/PartyModeTicTacToe/PartyModeTicTacToe.csproj b/PartyModes/PartyModeTicTacToe/PartyModeTicTacToe.csproj index 2c6f46d4..6e812ce8 100644 --- a/PartyModes/PartyModeTicTacToe/PartyModeTicTacToe.csproj +++ b/PartyModes/PartyModeTicTacToe/PartyModeTicTacToe.csproj @@ -1,5 +1,5 @@  - + DebugWin AnyCPU @@ -10,8 +10,9 @@ Properties VocaluxeLib.PartyModes.TicTacToe TicTacToe - v4.0 - Client + v4.7.1 + + 512 @@ -25,6 +26,7 @@ 4 Off ..\..\CheckingRules.ruleset + false AnyCPU @@ -36,6 +38,7 @@ false WIN Off + false AnyCPU @@ -47,6 +50,7 @@ prompt 4 Off + false AnyCPU @@ -58,6 +62,7 @@ false LINUX Off + false bin @@ -68,6 +73,7 @@ Off prompt ManagedMinimumRules.ruleset + false diff --git a/Vocaluxe/Base/CBackgroundMusic.cs b/Vocaluxe/Base/CBackgroundMusic.cs index 65165cf4..f9146f12 100644 --- a/Vocaluxe/Base/CBackgroundMusic.cs +++ b/Vocaluxe/Base/CBackgroundMusic.cs @@ -51,6 +51,7 @@ namespace Vocaluxe.Base private static Task _PreviewStartHelperTask; private static int _PreviewStartWaitCounter; private const int _PreviewStartWaitMaxTries = 10; + private static readonly object _PreviewStartHelperTaskLock = new Object(); public static bool VideoEnabled { @@ -256,10 +257,17 @@ namespace Vocaluxe.Base { if (_PreviewStartHelperTask != null && ( _PreviewPlayer.Length > 0 || _PreviewStartWaitCounter++ >= _PreviewStartWaitMaxTries)) { - _PreviewStartHelperTask.RunSynchronously(TaskScheduler.FromCurrentSynchronizationContext()); - _PreviewStartHelperTask.Dispose(); - _PreviewStartHelperTask = null; - _PreviewStartWaitCounter = 0; + lock (_PreviewStartHelperTaskLock) + { + // Recheck the condition as it cloud have change before we got the lock + if (_PreviewStartHelperTask != null && (_PreviewPlayer.Length > 0 || _PreviewStartWaitCounter++ >= _PreviewStartWaitMaxTries)) + { + _PreviewStartHelperTask.RunSynchronously(TaskScheduler.FromCurrentSynchronizationContext()); + _PreviewStartHelperTask.Dispose(); + _PreviewStartHelperTask = null; + _PreviewStartWaitCounter = 0; + } + } } if (!IsPlaying) @@ -317,28 +325,46 @@ namespace Vocaluxe.Base //Change song position only if song is changed or near to end if (songChanged || _CurPlayer.Position + 30 < _CurPlayer.Length) { - _PreviewStartHelperTask = new Task(() => + lock (_PreviewStartHelperTaskLock) { - float length = _PreviewPlayer.Length; - if (length < 1) - length = 30; // If length is unknow or invalid assume a length of 30s + // Check if the old _PreviewStartHelperTask needs to disposed + if (_PreviewStartHelperTask != null) + { + _PreviewStartHelperTask.Dispose(); + } + _PreviewStartHelperTask = new Task(() => + { + float length = _PreviewPlayer.Length; + if (length < 1) + length = 30; // If length is unknow or invalid assume a length of 30s - if (start < 0) - start = (song.Preview.Source == EDataSource.None) ? length / 4f : song.Preview.StartTime; - if (start > length - 5f) - start = Math.Max(0f, Math.Min(length / 4f, length - 5f)); - if (start >= 0.5f) - start -= 0.5f; + if (start < 0) + start = (song.Preview.Source == EDataSource.None) ? length / 4f : song.Preview.StartTime; + if (start > length - 5f) + start = Math.Max(0f, Math.Min(length / 4f, length - 5f)); + if (start >= 0.5f) + start -= 0.5f; - _PreviewPlayer.Position = start; - Play(); - }); + _PreviewPlayer.Position = start; + Play(); + }); + } _CurPlayer = _PreviewPlayer; } else { - _PreviewStartHelperTask.Dispose(); - _PreviewStartHelperTask = null; + if (_PreviewStartHelperTask != null) + { + lock (_PreviewStartHelperTaskLock) + { + // Recheck the condition as it cloud have change before we got the lock + if (_PreviewStartHelperTask != null) + { + _PreviewStartHelperTask.Dispose(); + _PreviewStartHelperTask = null; + } + } + } _PreviewPlayer.Position = _CurPlayer.Position; _CurPlayer = _PreviewPlayer; Play(); diff --git a/Vocaluxe/Base/CConfig.cs b/Vocaluxe/Base/CConfig.cs index d80e0024..a552974b 100644 --- a/Vocaluxe/Base/CConfig.cs +++ b/Vocaluxe/Base/CConfig.cs @@ -236,13 +236,14 @@ namespace Vocaluxe.Base public static event OnSongMenuChanged SongMenuChanged; //Folders + //We need full path for folders for matching folder path with textfile path when loading public static readonly List SongFolders = new List { #if INSTALLER Path.Combine(CSettings.DataFolder, CSettings.FolderNameSongs), - CSettings.FolderNameSongs + Path.Combine(CSettings.ProgramFolder, FolderNameSongs) #elif WIN - CSettings.FolderNameSongs + Path.Combine(CSettings.ProgramFolder, CSettings.FolderNameSongs) #elif LINUX Path.Combine(CSettings.DataFolder, CSettings.FolderNameSongs) #endif @@ -380,15 +381,7 @@ namespace Vocaluxe.Base else Config = xml.DeserializeString(""); - if (Config.Game.SongFolder.Length > 0 && Config.Game.SongFolder[0] != "") - { - SongFolders.Clear(); - SongFolders.AddRange(Config.Game.SongFolder); - } - else - { - Config.Game.SongFolder = SongFolders.ToArray(); - } + NormalizeSongPaths(); if (Config.Game.MinLineBreakTime < 0) Config.Game.MinLineBreakTime = 0.1f; @@ -680,6 +673,29 @@ namespace Vocaluxe.Base return false; } + /// + /// Set song path if none is find in config and check if every path exists + /// + public static void NormalizeSongPaths() + { + //Check if there are configured songfolders + if (Config.Game.SongFolder.Length > 0 && Config.Game.SongFolder[0] != "") + { + SongFolders.Clear(); + + foreach (string folder in Config.Game.SongFolder) + { + //Check if folder exists + if (Directory.Exists(folder)) + SongFolders.Add(folder); + } + } + + //Test if songfolders are still empty or now empty + if(Config.Game.SongFolder.Length == 0) + Config.Game.SongFolder = SongFolders.ToArray(); + } + /// /// Load command-line-parameters and their values to lists. /// @@ -821,7 +837,7 @@ namespace Vocaluxe.Base for (int j = 0; j < CSettings.MaxNumPlayer; j++) { - CGame.Players[j].ProfileID = -1; + CGame.Players[j].ProfileID = Guid.Empty; if (string.IsNullOrEmpty(Config.Game.Players[j])) continue; diff --git a/Vocaluxe/Base/CMain.cs b/Vocaluxe/Base/CMain.cs index 41f79bb2..61bfcf69 100644 --- a/Vocaluxe/Base/CMain.cs +++ b/Vocaluxe/Base/CMain.cs @@ -656,17 +656,22 @@ namespace Vocaluxe.Base return CProfiles.GetProfiles(); } - public EGameDifficulty GetDifficulty(int profileID) + public int GetNum() + { + return CProfiles.NumProfiles; + } + + public EGameDifficulty GetDifficulty(Guid profileID) { return CProfiles.GetDifficulty(profileID); } - public string GetPlayerName(int profileID, int playerNum = 0) + public string GetPlayerName(Guid profileID, int playerNum = 0) { return CProfiles.GetPlayerName(profileID, playerNum); } - public CTextureRef GetAvatar(int profileID) + public CTextureRef GetAvatar(Guid profileID) { return CProfiles.GetAvatarTextureFromProfile(profileID); } @@ -676,12 +681,12 @@ namespace Vocaluxe.Base return CProfiles.GetAvatarByFilename(fileName); } - public bool IsProfileIDValid(int profileID) + public bool IsProfileIDValid(Guid profileID) { return CProfiles.IsProfileIDValid(profileID); } - public bool IsGuest(int profileID) + public bool IsGuest(Guid profileID) { return CProfiles.IsGuestProfile(profileID); } @@ -837,7 +842,14 @@ namespace Vocaluxe.Base public void Close(ref CVideoStream stream) { - CVideo.Close(ref stream); + try + { + CVideo.Close(ref stream); + } + catch (NotSupportedException e) + { + CLog.LogError($"Clould not close the background video: {e.Message}"); + } } public void SetLoop(CVideoStream stream, bool loop = true) @@ -847,12 +859,26 @@ namespace Vocaluxe.Base public void Pause(CVideoStream stream) { - CVideo.Pause(stream); + try + { + CVideo.Pause(stream); + } + catch (NotSupportedException e) + { + CLog.LogError($"Clould not pause the background video: {e.Message}"); + } } public void Resume(CVideoStream stream) { - CVideo.Resume(stream); + try + { + CVideo.Resume(stream); + } + catch (NotSupportedException e) + { + CLog.LogError($"Clould not resume the background video: {e.Message}"); + } } } diff --git a/Vocaluxe/Base/CProfiles.cs b/Vocaluxe/Base/CProfiles.cs index 43841704..9e454ffe 100644 --- a/Vocaluxe/Base/CProfiles.cs +++ b/Vocaluxe/Base/CProfiles.cs @@ -45,13 +45,12 @@ namespace Vocaluxe.Base public CProfile Profile; public CAvatar Avatar; public EAction Action; - public int ProfileID; + public Guid ProfileID; } #endregion enums and structs #region private vars - private static Dictionary _Profiles; - private static Queue _ProfileIDs; + private static Dictionary _Profiles; private static Dictionary _Avatars; private static Queue _AvatarIDs; @@ -84,10 +83,7 @@ namespace Vocaluxe.Base for (int i = 0; i < 1000; i++) _AvatarIDs.Enqueue(i); - _Profiles = new Dictionary(); - _ProfileIDs = new Queue(100); - for (int i = 0; i < 100; i++) - _ProfileIDs.Enqueue(i); + _Profiles = new Dictionary(); LoadProfiles(); } @@ -117,7 +113,7 @@ namespace Vocaluxe.Base if (newProf == null) break; - newProf.ID = _ProfileIDs.Dequeue(); + newProf.ID = Guid.NewGuid(); if (newProf.Avatar == null) newProf.Avatar = _Avatars.Values.First(); else if (newProf.Avatar.ID < 0) @@ -256,7 +252,7 @@ namespace Vocaluxe.Base } } - public static void DeleteProfile(int profileID) + public static void DeleteProfile(Guid profileID) { if (!IsProfileIDValid(profileID)) return; @@ -305,7 +301,7 @@ namespace Vocaluxe.Base return list.ToArray(); } - public static CProfile GetProfile(int profileID) + public static CProfile GetProfile(Guid profileID) { if (!IsProfileIDValid(profileID)) return null; @@ -324,7 +320,7 @@ namespace Vocaluxe.Base return result; } - public static int NewProfile(string fileName = "") + public static Guid NewProfile(string fileName = "") { var profile = new CProfile { @@ -332,9 +328,9 @@ namespace Vocaluxe.Base }; if (File.Exists(profile.FilePath)) - return -1; + return Guid.Empty; - profile.ID = _ProfileIDs.Dequeue(); + profile.ID = Guid.NewGuid(); _Profiles.Add(profile.ID, profile); _ProfilesChanged = true; return profile.ID; @@ -354,11 +350,11 @@ namespace Vocaluxe.Base public static void SaveProfiles() { - foreach (int id in _Profiles.Keys) + foreach (Guid id in _Profiles.Keys) _Profiles[id].SaveProfile(); } - public static bool IsProfileIDValid(int profileID) + public static bool IsProfileIDValid(Guid profileID) { return _Profiles.ContainsKey(profileID); } @@ -370,7 +366,7 @@ namespace Vocaluxe.Base #endregion public methods #region profile properties - public static string GetPlayerName(int profileID, int playerNum = 0) + public static string GetPlayerName(Guid profileID, int playerNum = 0) { if (IsProfileIDValid(profileID)) return _Profiles[profileID].PlayerName; @@ -381,7 +377,7 @@ namespace Vocaluxe.Base return playerName; } - public static void SetPlayerName(int profileID, string playerName) + public static void SetPlayerName(Guid profileID, string playerName) { if (!IsProfileIDValid(profileID)) return; @@ -389,7 +385,7 @@ namespace Vocaluxe.Base _Profiles[profileID].PlayerName = playerName; } - public static string GetProfileFileName(int profileID) + public static string GetProfileFileName(Guid profileID) { if (!IsProfileIDValid(profileID)) return String.Empty; @@ -397,7 +393,7 @@ namespace Vocaluxe.Base return Path.GetFileName(_Profiles[profileID].FilePath); } - public static string AddGetPlayerName(int profileID, char chr) + public static string AddGetPlayerName(Guid profileID, char chr) { if (!IsProfileIDValid(profileID)) return String.Empty; @@ -406,7 +402,7 @@ namespace Vocaluxe.Base return _Profiles[profileID].PlayerName; } - public static string GetDeleteCharInPlayerName(int profileID) + public static string GetDeleteCharInPlayerName(Guid profileID) { if (!IsProfileIDValid(profileID)) return String.Empty; @@ -418,12 +414,12 @@ namespace Vocaluxe.Base return profile.PlayerName; } - public static EGameDifficulty GetDifficulty(int profileID) + public static EGameDifficulty GetDifficulty(Guid profileID) { return IsProfileIDValid(profileID) ? _Profiles[profileID].Difficulty : EGameDifficulty.TR_CONFIG_NORMAL; } - public static void SetDifficulty(int profileID, EGameDifficulty difficulty) + public static void SetDifficulty(Guid profileID, EGameDifficulty difficulty) { if (!IsProfileIDValid(profileID)) return; @@ -431,12 +427,12 @@ namespace Vocaluxe.Base _Profiles[profileID].Difficulty = difficulty; } - public static EUserRole GetUserRoleProfile(int profileID) + public static EUserRole GetUserRoleProfile(Guid profileID) { return IsProfileIDValid(profileID) ? _Profiles[profileID].UserRole : EUserRole.TR_USERROLE_GUEST; } - public static void SetUserRoleProfile(int profileID, EUserRole option) + public static void SetUserRoleProfile(Guid profileID, EUserRole option) { if (!IsProfileIDValid(profileID)) return; @@ -446,12 +442,12 @@ namespace Vocaluxe.Base _Profiles[profileID].UserRole = (_Profiles[profileID].UserRole & ~mask) | option; } - public static EOffOn GetActive(int profileID) + public static EOffOn GetActive(Guid profileID) { return IsProfileIDValid(profileID) ? _Profiles[profileID].Active : EOffOn.TR_CONFIG_OFF; } - public static void SetActive(int profileID, EOffOn option) + public static void SetActive(Guid profileID, EOffOn option) { if (!IsProfileIDValid(profileID)) return; @@ -459,7 +455,7 @@ namespace Vocaluxe.Base _Profiles[profileID].Active = option; } - public static bool IsGuestProfile(int profileID) + public static bool IsGuestProfile(Guid profileID) { if (!IsProfileIDValid(profileID)) return true; // this will prevent from saving dummy profiles to highscore db @@ -467,14 +463,14 @@ namespace Vocaluxe.Base return _Profiles[profileID].UserRole <= EUserRole.TR_USERROLE_GUEST; } - public static bool IsActive(int profileID) + public static bool IsActive(Guid profileID) { if (!IsProfileIDValid(profileID)) return false; return _Profiles[profileID].Active == EOffOn.TR_CONFIG_ON; } - public static void SetAvatar(int profileID, int avatarID) + public static void SetAvatar(Guid profileID, int avatarID) { if (!IsProfileIDValid(profileID) || !IsAvatarIDValid(avatarID)) return; @@ -482,7 +478,7 @@ namespace Vocaluxe.Base _Profiles[profileID].Avatar = _Avatars[avatarID]; } - public static int GetAvatarID(int profileID) + public static int GetAvatarID(Guid profileID) { if (!IsProfileIDValid(profileID) || _Profiles[profileID].Avatar == null) return -1; @@ -490,7 +486,7 @@ namespace Vocaluxe.Base return _Profiles[profileID].Avatar.ID; } - public static CAvatar GetAvatar(int profileID) + public static CAvatar GetAvatar(Guid profileID) { if (!IsProfileIDValid(profileID)) return null; @@ -498,7 +494,8 @@ namespace Vocaluxe.Base return _Profiles[profileID].Avatar; } - public static int GetProfileID(int num) + //TODO: Remove this? + public static Guid GetProfileID(Guid num) { return _Profiles[num].ID; } @@ -513,7 +510,7 @@ namespace Vocaluxe.Base return _Avatars[avatarID].Texture; } - public static CTextureRef GetAvatarTextureFromProfile(int profileID) + public static CTextureRef GetAvatarTextureFromProfile(Guid profileID) { if (!IsProfileIDValid(profileID) || _Profiles[profileID].Avatar == null) return null; @@ -530,9 +527,9 @@ namespace Vocaluxe.Base var knownFiles = new List(); if (_Profiles.Count > 0) { - var ids = new int[_Profiles.Keys.Count]; + var ids = new Guid[_Profiles.Keys.Count]; _Profiles.Keys.CopyTo(ids, 0); - foreach (int id in ids) + foreach (Guid id in ids) { if (_Profiles[id].LoadProfile()) knownFiles.Add(Path.GetFileName(_Profiles[id].FilePath)); @@ -554,10 +551,7 @@ namespace Vocaluxe.Base var profile = new CProfile(); if (profile.LoadProfile(file)) - { - profile.ID = _ProfileIDs.Dequeue(); _Profiles.Add(profile.ID, profile); - } } _ProfilesChanged = true; } @@ -597,7 +591,7 @@ namespace Vocaluxe.Base _ProfilesChanged = true; } - private static void _DeleteProfile(int profileID) + private static void _DeleteProfile(Guid profileID) { if (!IsProfileIDValid(profileID)) return; @@ -625,10 +619,8 @@ namespace Vocaluxe.Base //Check if profile is selected in game for (int i = 0; i < CGame.Players.Length; i++) { - if (CGame.Players[i].ProfileID > profileID) - CGame.Players[i].ProfileID--; - else if (CGame.Players[i].ProfileID == profileID) - CGame.Players[i].ProfileID = -1; + if (CGame.Players[i].ProfileID == profileID) + CGame.Players[i].ProfileID = Guid.Empty; } } catch (Exception) @@ -638,7 +630,7 @@ namespace Vocaluxe.Base _ProfilesChanged = true; } - private static void _RemoveProfile(int profileID) + private static void _RemoveProfile(Guid profileID) { if (!IsProfileIDValid(profileID)) return; diff --git a/Vocaluxe/Base/CVideo.cs b/Vocaluxe/Base/CVideo.cs index d9400cc8..d9af124b 100644 --- a/Vocaluxe/Base/CVideo.cs +++ b/Vocaluxe/Base/CVideo.cs @@ -15,6 +15,7 @@ // along with Vocaluxe. If not, see . #endregion +using System; using Vocaluxe.Lib.Video; using VocaluxeLib; @@ -61,6 +62,10 @@ namespace Vocaluxe.Base public static CVideoStream Load(string videoFileName) { + if (_VideoDecoder == null) + { + throw new NotSupportedException("_VideoDecoder is null (already closed?)"); + } return _VideoDecoder.Load(videoFileName); } @@ -73,41 +78,109 @@ namespace Vocaluxe.Base public static float GetLength(CVideoStream stream) { + if (stream == null) + { + throw new ArgumentException("stream is null"); + } + if (_VideoDecoder == null) + { + throw new NotSupportedException("_VideoDecoder is null (already closed?)"); + } + return _VideoDecoder.GetLength(stream); } public static bool GetFrame(CVideoStream stream, float time) { + if (stream == null) + { + throw new ArgumentException("stream is null"); + } + if (_VideoDecoder == null) + { + throw new NotSupportedException("_VideoDecoder is null (already closed?)"); + } + return _VideoDecoder.GetFrame(stream, time); } public static bool Skip(CVideoStream stream, float start, float gap) { + if (stream == null) + { + throw new ArgumentException("stream is null"); + } + if (_VideoDecoder == null) + { + throw new NotSupportedException("_VideoDecoder is null (already closed?)"); + } + return _VideoDecoder.Skip(stream, start, gap); } public static void SetLoop(CVideoStream stream, bool loop) { + if (stream == null) + { + throw new ArgumentException("stream is null"); + } + if (_VideoDecoder == null) + { + throw new NotSupportedException("_VideoDecoder is null (already closed?)"); + } + _VideoDecoder.SetLoop(stream, loop); } public static void Pause(CVideoStream stream) { + if (stream == null) + { + throw new ArgumentException("stream is null"); + } + if (_VideoDecoder == null) + { + throw new NotSupportedException("_VideoDecoder is null (already closed?)"); + } + _VideoDecoder.Pause(stream); } public static void Resume(CVideoStream stream) { + if (stream == null) + { + throw new ArgumentException("stream is null"); + } + if (_VideoDecoder == null) + { + throw new NotSupportedException("_VideoDecoder is null (already closed?)"); + } + _VideoDecoder.Resume(stream); } public static bool Finished(CVideoStream stream) { + if (stream == null) + { + throw new ArgumentException("stream is null"); + } + if (_VideoDecoder == null) + { + throw new NotSupportedException("_VideoDecoder is null (already closed?)"); + } + return _VideoDecoder.Finished(stream); } public static void Update() { + if (_VideoDecoder == null) + { + throw new NotSupportedException("_VideoDecoder is null (already closed?)"); + } + _VideoDecoder.Update(); } #endregion Interface diff --git a/Vocaluxe/Base/CVideoPlayer.cs b/Vocaluxe/Base/CVideoPlayer.cs index 3e0762f6..1f451396 100644 --- a/Vocaluxe/Base/CVideoPlayer.cs +++ b/Vocaluxe/Base/CVideoPlayer.cs @@ -53,6 +53,10 @@ namespace Vocaluxe.Base { _VideoTimer.Reset(); _Finished = false; + if (_VideoStream == null) + { + return; + } //CVideo.VdSkip(_VideoStream, 0f, 0f); _VideoTimer.Start(); CVideo.Resume(_VideoStream); @@ -60,12 +64,19 @@ namespace Vocaluxe.Base public void Pause() { - CVideo.Pause(_VideoStream); + if (_VideoStream != null) + { + CVideo.Pause(_VideoStream); + } _VideoTimer.Stop(); } public void Resume() { + if (_VideoStream == null) + { + return; + } CVideo.Resume(_VideoStream); _VideoTimer.Start(); } @@ -92,7 +103,7 @@ namespace Vocaluxe.Base public void PreLoad() { - if (!_Loaded) + if (!_Loaded || _VideoStream == null) { return; } @@ -111,7 +122,10 @@ namespace Vocaluxe.Base public void Close() { - CVideo.Close(ref _VideoStream); + if (_VideoStream != null) + { + CVideo.Close(ref _VideoStream); + } _Loaded = false; _Finished = false; _VideoTimer.Reset(); diff --git a/Vocaluxe/Base/Server/CVocaluxeServer.cs b/Vocaluxe/Base/Server/CVocaluxeServer.cs index 477713b6..a377245c 100644 --- a/Vocaluxe/Base/Server/CVocaluxeServer.cs +++ b/Vocaluxe/Base/Server/CVocaluxeServer.cs @@ -388,7 +388,7 @@ namespace Vocaluxe.Base.Server } #region profile - public static SProfileData GetProfileData(int profileId, bool isReadonly) + public static SProfileData GetProfileData(Guid profileId, bool isReadonly) { CProfile profile = CProfiles.GetProfile(profileId); if (profile == null) @@ -807,7 +807,7 @@ namespace Vocaluxe.Base.Server #endregion #region user management - public static bool ValidatePassword(int profileId, string password) + public static bool ValidatePassword(Guid profileId, string password) { CProfile profile = CProfiles.GetProfile(profileId); if (profile == null) @@ -824,7 +824,7 @@ namespace Vocaluxe.Base.Server return _Hash((new UTF8Encoding()).GetBytes(password), salt).SequenceEqual(profile.PasswordHash); } - public static bool ValidatePassword(int profileId, byte[] hashedPassword) + public static bool ValidatePassword(Guid profileId, byte[] hashedPassword) { CProfile profile = CProfiles.GetProfile(profileId); if (profile == null) @@ -841,7 +841,7 @@ namespace Vocaluxe.Base.Server return hashedPassword.SequenceEqual(profile.PasswordHash); } - private static byte[] _GetPasswordSalt(int profileId) + private static byte[] _GetPasswordSalt(Guid profileId) { CProfile profile = CProfiles.GetProfile(profileId); if (profile == null) @@ -853,7 +853,7 @@ namespace Vocaluxe.Base.Server return profile.PasswordSalt; } - public static int GetUserRole(int profileId) + public static int GetUserRole(Guid profileId) { CProfile profile = CProfiles.GetProfile(profileId); if (profile == null) @@ -865,7 +865,7 @@ namespace Vocaluxe.Base.Server return (int)(profile.UserRole); } - public static void SetUserRole(int profileId, int userRole) + public static void SetUserRole(Guid profileId, int userRole) { CProfile profile = CProfiles.GetProfile(profileId); if (profile == null) @@ -884,9 +884,9 @@ namespace Vocaluxe.Base.Server CProfiles.SaveProfiles(); } - public static int GetUserIdFromUsername(string username) + public static Guid GetUserIdFromUsername(string username) { - IEnumerable playerIds = (from p in CProfiles.GetProfiles() + IEnumerable playerIds = (from p in CProfiles.GetProfiles() where String.Equals(p.PlayerName, username, StringComparison.OrdinalIgnoreCase) select p.ID); try diff --git a/Vocaluxe/Base/Server/CWebservice.cs b/Vocaluxe/Base/Server/CWebservice.cs index 471caf34..e44606a1 100644 --- a/Vocaluxe/Base/Server/CWebservice.cs +++ b/Vocaluxe/Base/Server/CWebservice.cs @@ -61,7 +61,7 @@ namespace Vocaluxe.Base.Server } #region profile - public int GetOwnProfileId() + public Guid GetOwnProfileId() { Guid sessionKey = _GetSession(); if (sessionKey == Guid.Empty) @@ -71,17 +71,17 @@ namespace Vocaluxe.Base.Server WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Forbidden; WebOperationContext.Current.OutgoingResponse.StatusDescription = "No session"; } - return -1; + return Guid.Empty; } - int profileId = CSessionControl.GetUserIdFromSession(sessionKey); - if (profileId < 0) + Guid profileId = CSessionControl.GetUserIdFromSession(sessionKey); + if (profileId == Guid.Empty) { if (WebOperationContext.Current != null) { WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Forbidden; WebOperationContext.Current.OutgoingResponse.StatusDescription = "No session"; } - return -1; + return Guid.Empty; } return profileId; } @@ -90,7 +90,7 @@ namespace Vocaluxe.Base.Server { Guid sessionKey = _GetSession(); - if (profile.ProfileId != -1) //-1 is the id for a new profile + if (profile.ProfileId != Guid.Empty) //-1 is the id for a new profile { if (CSessionControl.GetUserIdFromSession(sessionKey) != profile.ProfileId && !(_CheckRight(EUserRights.EditAllProfiles))) @@ -100,7 +100,7 @@ namespace Vocaluxe.Base.Server CVocaluxeServer.DoTask(CVocaluxeServer.SendProfileData, profile); } - public SProfileData GetProfile(int profileId) + public SProfileData GetProfile(Guid profileId) { Guid sessionKey = _GetSession(); if (CSessionControl.GetUserIdFromSession(sessionKey) == profileId || _CheckRight(EUserRights.ViewOtherProfiles)) @@ -146,7 +146,7 @@ namespace Vocaluxe.Base.Server public void Logout() { Guid sessionKey = _GetSession(); - CSessionControl.InvalidateSessions(sessionKey); + CSessionControl.InvalidateSessionByID(sessionKey); } public Stream Index() @@ -501,12 +501,12 @@ namespace Vocaluxe.Base.Server #endregion #region user management - public int GetUserRole(int profileId) + public int GetUserRole(Guid profileId) { return CVocaluxeServer.DoTask(CVocaluxeServer.GetUserRole, profileId); } - public void SetUserRole(int profileId, int userRole) + public void SetUserRole(Guid profileId, int userRole) { if (_CheckRight(EUserRights.EditAllProfiles)) CVocaluxeServer.DoTaskWithoutReturn(CVocaluxeServer.SetUserRole, profileId, userRole); diff --git a/Vocaluxe/Base/Server/ICWebservice.cs b/Vocaluxe/Base/Server/ICWebservice.cs index c34c12de..62fdb3d5 100644 --- a/Vocaluxe/Base/Server/ICWebservice.cs +++ b/Vocaluxe/Base/Server/ICWebservice.cs @@ -39,7 +39,7 @@ namespace Vocaluxe.Base.Server [OperationContract, WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "/getOwnProfileId")] - int GetOwnProfileId(); + Guid GetOwnProfileId(); [OperationContract, WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, @@ -49,7 +49,7 @@ namespace Vocaluxe.Base.Server [OperationContract, WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "/getProfile?profileId={profileId}")] - SProfileData GetProfile(int profileId); + SProfileData GetProfile(Guid profileId); [OperationContract, WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, @@ -195,12 +195,12 @@ namespace Vocaluxe.Base.Server [OperationContract, WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "/getUserRole?profileId={profileId}")] - int GetUserRole(int profileId); + int GetUserRole(Guid profileId); [OperationContract, WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "/setUserRole?profileId={profileId}&userRole={userRole}")] - void SetUserRole(int profileId, int userRole); + void SetUserRole(Guid profileId, int userRole); [OperationContract, WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, diff --git a/Vocaluxe/Base/Server/Session.cs b/Vocaluxe/Base/Server/Session.cs index b2493d4c..43ff2ae8 100644 --- a/Vocaluxe/Base/Server/Session.cs +++ b/Vocaluxe/Base/Server/Session.cs @@ -27,8 +27,8 @@ namespace Vocaluxe.Base.Server get { return _ID; } } - private readonly int _ProfileId; - public int ProfileId + private readonly Guid _ProfileId; + public Guid ProfileId { get { return _ProfileId; } } @@ -46,7 +46,7 @@ namespace Vocaluxe.Base.Server internal set { _LastSeen = value; } } - public CSession(Guid id, int profileId, EUserRoles roles) + public CSession(Guid id, Guid profileId, EUserRoles roles) { _ID = id; _ProfileId = profileId; diff --git a/Vocaluxe/Base/Server/SessionControl.cs b/Vocaluxe/Base/Server/SessionControl.cs index 13d674b2..e0ee47db 100644 --- a/Vocaluxe/Base/Server/SessionControl.cs +++ b/Vocaluxe/Base/Server/SessionControl.cs @@ -44,7 +44,7 @@ namespace Vocaluxe.Base.Server foreach (var sessionToRemove in sessionIdsToRemove) { - InvalidateSessions(sessionToRemove); + InvalidateSessionByID(sessionToRemove); } } @@ -54,7 +54,7 @@ namespace Vocaluxe.Base.Server return Guid.Empty; Guid newId = Guid.NewGuid(); - int id = _GetProfileIdFormUsername(userName); + Guid id = _GetProfileIdFormUsername(userName); EUserRoles roles = _GetUserRoles(id); CSession session = new CSession(newId, id, roles); //InvalidateSessions(id); @@ -68,17 +68,17 @@ namespace Vocaluxe.Base.Server return CVocaluxeServer.ValidatePassword(_GetProfileIdFormUsername(userName), password); } - private static int _GetProfileIdFormUsername(string username) + private static Guid _GetProfileIdFormUsername(string username) { return CVocaluxeServer.GetUserIdFromUsername(username); } - private static EUserRoles _GetUserRoles(int profileId) + private static EUserRoles _GetUserRoles(Guid profileId) { return (EUserRoles)CVocaluxeServer.GetUserRole(profileId); } - internal static void InvalidateSessions(int profileId) + internal static void InvalidateSessionByProfile(Guid profileId) { foreach (KeyValuePair s in (from kv in _ActiveSessions where kv.Value.ProfileId == profileId @@ -86,7 +86,7 @@ namespace Vocaluxe.Base.Server _ActiveSessions.Remove(s.Key); } - internal static void InvalidateSessions(Guid sessionId) + internal static void InvalidateSessionByID(Guid sessionId) { if (_ActiveSessions.ContainsKey(sessionId)) { @@ -100,10 +100,10 @@ namespace Vocaluxe.Base.Server .HasFlag(requestedRight))); } - internal static int GetUserIdFromSession(Guid sessionId) + internal static Guid GetUserIdFromSession(Guid sessionId) { if (!_ActiveSessions.ContainsKey(sessionId)) - return -1; + return Guid.Empty; return _ActiveSessions[sessionId].ProfileId; } diff --git a/Vocaluxe/Base/Server/VocaluxeStructs.cs b/Vocaluxe/Base/Server/VocaluxeStructs.cs index 9cc5b327..3467f81d 100644 --- a/Vocaluxe/Base/Server/VocaluxeStructs.cs +++ b/Vocaluxe/Base/Server/VocaluxeStructs.cs @@ -56,7 +56,7 @@ namespace Vocaluxe.Base.Server [DataMember] public int Difficulty; [DataMember] - public int ProfileId; + public Guid ProfileId; [DataMember] public bool IsEditable; [DataMember] diff --git a/Vocaluxe/Lib/Sound/CPortAudioHandle.cs b/Vocaluxe/Lib/Sound/CPortAudioHandle.cs index 217afafa..81c4d9b0 100644 --- a/Vocaluxe/Lib/Sound/CPortAudioHandle.cs +++ b/Vocaluxe/Lib/Sound/CPortAudioHandle.cs @@ -74,12 +74,23 @@ namespace Vocaluxe.Lib.Sound } lock (_Mutex) { + if (_Disposed) + return; Debug.Assert(_RefCount > 0); _RefCount--; if (_RefCount == 0) - PortAudio.Pa_Terminate(); + { + try + { + PortAudio.Pa_Terminate(); + } + catch (Exception ex) + { + CLog.LogError(errorText: $"Error disposing PortAudio: {ex.Message}", e: ex); + } + } + _Disposed = true; } - _Disposed = true; } public void Dispose() @@ -100,11 +111,11 @@ namespace Vocaluxe.Lib.Sound double sampleRate, uint framesPerBuffer, PortAudio.PaStreamFlags streamFlags, PortAudio.PaStreamCallbackDelegate streamCallback, IntPtr userData) { - if (_Disposed) - throw new ObjectDisposedException("PortAudioHandle already disposed"); - lock (_Mutex) { + if (_Disposed) + throw new ObjectDisposedException("PortAudioHandle already disposed"); + PortAudio.PaError res = PortAudio.Pa_OpenStream(out stream, ref inputParameters, ref outputParameters, sampleRate, framesPerBuffer, streamFlags, streamCallback, userData); if (res == PortAudio.PaError.paNoError) @@ -157,12 +168,19 @@ namespace Vocaluxe.Lib.Sound public void CloseStream(IntPtr stream) { - if (_Disposed) - throw new ObjectDisposedException("PortAudioHandle already disposed"); - lock (_Mutex) { - PortAudio.Pa_CloseStream(stream); + if (_Disposed) + throw new ObjectDisposedException("PortAudioHandle already disposed"); + + try + { + PortAudio.Pa_CloseStream(stream); + } + catch (Exception ex) + { + CLog.LogError(errorText:$"Error closing stream: {ex.Message}", e:ex); + } _Streams.Remove(stream); } } diff --git a/Vocaluxe/Lib/Sound/Record/PortAudio/CPortAudioRecord.cs b/Vocaluxe/Lib/Sound/Record/PortAudio/CPortAudioRecord.cs index 4702e400..cfc8818c 100644 --- a/Vocaluxe/Lib/Sound/Record/PortAudio/CPortAudioRecord.cs +++ b/Vocaluxe/Lib/Sound/Record/PortAudio/CPortAudioRecord.cs @@ -16,6 +16,8 @@ #endregion using System; +using System.Collections.Generic; +using System.Linq; using System.Runtime.InteropServices; using System.Threading; using Vocaluxe.Base; @@ -142,9 +144,13 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio foreach (IntPtr handle in _RecHandle) { - PortAudioSharp.PortAudio.Pa_StopStream(handle); - PortAudioSharp.PortAudio.Pa_CloseStream(handle); + if (handle != IntPtr.Zero) + { + PortAudioSharp.PortAudio.Pa_StopStream(handle); + PortAudioSharp.PortAudio.Pa_CloseStream(handle); + } } + _RecHandle = new IntPtr[_Devices.Count]; return true; } @@ -153,13 +159,17 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio /// public override void Close() { - if (_RecHandle != null) + if (_RecHandle != null && _RecHandle.Length > 0) { foreach (IntPtr handle in _RecHandle) { if (handle != IntPtr.Zero) + { _PaHandle.CloseStream(handle); + } } + + _RecHandle = new IntPtr[_Devices.Count]; } if (_PaHandle != null) { diff --git a/Vocaluxe/Lib/Video/Acinerella/CDecoderThread.cs b/Vocaluxe/Lib/Video/Acinerella/CDecoderThread.cs index 38275210..3d7229d0 100644 --- a/Vocaluxe/Lib/Video/Acinerella/CDecoderThread.cs +++ b/Vocaluxe/Lib/Video/Acinerella/CDecoderThread.cs @@ -429,7 +429,18 @@ namespace Vocaluxe.Lib.Video.Acinerella private bool _CopyDecodedFrameToBuffer() { bool result; - var decoder = (SACDecoder)Marshal.PtrToStructure(_Videodecoder, typeof(SACDecoder)); + SACDecoder decoder; + + try + { + decoder = (SACDecoder)Marshal.PtrToStructure(_Videodecoder, typeof(SACDecoder)); + } + catch (Exception e) + { + CLog.LogError("Couldn't copy the frame to the managed environment.", false, false, e); + return false; + } + if (decoder.Buffer != IntPtr.Zero) { _LastDecodedTime = (float)decoder.Timecode; diff --git a/Vocaluxe/Program.cs b/Vocaluxe/Program.cs index d18660db..136508fd 100644 --- a/Vocaluxe/Program.cs +++ b/Vocaluxe/Program.cs @@ -285,23 +285,120 @@ namespace Vocaluxe try { CController.Close(); + } + catch (Exception e) + { + CLog.LogError("Error during shutdown! (CController)", false, false, e); + } + + try + { CVocaluxeServer.Close(); + } + catch (Exception e) + { + CLog.LogError("Error during shutdown! (CVocaluxeServer)", false, false, e); + } + + try + { CGraphics.Close(); + } + catch (Exception e) + { + CLog.LogError("Error during shutdown! (CGraphics)", false, false, e); + } + + try + { CThemes.Close(); + } + catch (Exception e) + { + CLog.LogError("Error during shutdown! (CThemes)", false, false, e); + } + + try + { CCover.Close(); + } + catch (Exception e) + { + CLog.LogError("Error during shutdown! (CCover)", false, false, e); + } + + try + { CFonts.Close(); + } + catch (Exception e) + { + CLog.LogError("Error during shutdown! (CFonts)", false, false, e); + } + + try + { CBackgroundMusic.Close(); + } + catch (Exception e) + { + CLog.LogError("Error during shutdown! (CBackgroundMusic)", false, false, e); + } + + try + { CWebcam.Close(); + } + catch (Exception e) + { + CLog.LogError("Error during shutdown! (CWebcam)", false, false, e); + } + + try + { CDataBase.Close(); + } + catch (Exception e) + { + CLog.LogError("Error during shutdown! (CDataBase)", false, false, e); + } + + try + { CVideo.Close(); + } + catch (Exception e) + { + CLog.LogError("Error during shutdown! (CVideo)", false, false, e); + } + + try + { CRecord.Close(); + } + catch (Exception e) + { + CLog.LogError("Error during shutdown! (CRecord)", false, false, e); + } + + try + { CSound.Close(); + } + catch (Exception e) + { + CLog.LogError("Error during shutdown! (CSound)", false, false, e); + } + + try + { CDraw.Close(); } catch (Exception e) { - CLog.LogError("Error during shutdown!", false, false, e); + CLog.LogError("Error during shutdown! (CDraw)", false, false, e); } + GC.Collect(); // Do a GC run here before we close logs to have finalizers run try { diff --git a/Vocaluxe/Screens/CScreenNames.cs b/Vocaluxe/Screens/CScreenNames.cs index 3d573d35..3dd334a9 100644 --- a/Vocaluxe/Screens/CScreenNames.cs +++ b/Vocaluxe/Screens/CScreenNames.cs @@ -61,7 +61,7 @@ namespace Vocaluxe.Screens private bool _SelectingFast; private int _SelectingSwitchNr = -1; private int _SelectingFastPlayerNr; - private int _SelectedProfileID = -1; + private Guid _SelectedProfileID = Guid.Empty; private bool _AvatarsChanged; private bool _ProfilesChanged; @@ -177,9 +177,9 @@ namespace Vocaluxe.Screens { case Keys.Enter: //Check, if a player is selected - if (_NameSelections[_NameSelection].Selection > -1) + if (_NameSelections[_NameSelection].SelectedID != Guid.Empty) { - _SelectedProfileID = _NameSelections[_NameSelection].Selection; + _SelectedProfileID = _NameSelections[_NameSelection].SelectedID; if (!CProfiles.IsProfileIDValid(_SelectedProfileID)) return true; @@ -359,7 +359,7 @@ namespace Vocaluxe.Screens base.HandleMouse(mouseEvent); //Check if LeftButton is hold and Select-Mode inactive - if (mouseEvent.LBH && _SelectedProfileID < 0 && !_SelectingFast) + if (mouseEvent.LBH && _SelectedProfileID == Guid.Empty && !_SelectingFast) { //Save mouse-coords _OldMouseX = mouseEvent.X; @@ -368,8 +368,8 @@ namespace Vocaluxe.Screens if (_NameSelections[_NameSelection].IsOverTile(mouseEvent)) { //Get player-number of tile - _SelectedProfileID = _NameSelections[_NameSelection].TilePlayerNr(mouseEvent); - if (_SelectedProfileID != -1) + _SelectedProfileID = _NameSelections[_NameSelection].TilePlayerID(mouseEvent); + if (_SelectedProfileID != Guid.Empty) { //Update of Drag/Drop-Texture CStatic selectedPlayer = _NameSelections[_NameSelection].TilePlayerAvatar(mouseEvent); @@ -402,7 +402,7 @@ namespace Vocaluxe.Screens } //Check if LeftButton is hold and Select-Mode active - if (mouseEvent.LBH && _SelectedProfileID >= 0 && !_SelectingFast) + if (mouseEvent.LBH && _SelectedProfileID != Guid.Empty && !_SelectingFast) { //Update coords for Drag/Drop-Texture _ChooseAvatarStatic.X += mouseEvent.X - _OldMouseX; @@ -411,7 +411,7 @@ namespace Vocaluxe.Screens _OldMouseY = mouseEvent.Y; } // LeftButton isn't hold anymore, but Select-Mode is still active -> "Drop" of Avatar - else if (_SelectedProfileID >= 0 && !_SelectingFast) + else if (_SelectedProfileID != Guid.Empty && !_SelectingFast) { //Foreach Drop-Area for (int i = 0; i < _StaticPlayer.Length; i++) @@ -422,7 +422,7 @@ namespace Vocaluxe.Screens //Check if Mouse is in area if (CHelper.IsInBounds(_Statics[_StaticPlayer[i]].Rect, mouseEvent)) { - if (_SelectingSwitchNr > -1 && CGame.Players[i].ProfileID > -1) + if (_SelectingSwitchNr > -1 && CGame.Players[i].ProfileID != Guid.Empty) _UpdateSelectedProfile(_SelectingSwitchNr, CGame.Players[i].ProfileID); else if (_SelectingSwitchNr > -1) _ResetPlayerSelection(_SelectingSwitchNr); @@ -438,7 +438,7 @@ namespace Vocaluxe.Screens _ResetPlayerSelection(_SelectingSwitchNr); } _SelectingSwitchNr = -1; - _SelectedProfileID = -1; + _SelectedProfileID = Guid.Empty; //Reset variables _ChooseAvatarStatic.Visible = false; } @@ -448,8 +448,8 @@ namespace Vocaluxe.Screens if (_NameSelections[_NameSelection].IsOverTile(mouseEvent)) { //Get player-number of tile - _SelectedProfileID = _NameSelections[_NameSelection].TilePlayerNr(mouseEvent); - if (_SelectedProfileID != -1) + _SelectedProfileID = _NameSelections[_NameSelection].TilePlayerID(mouseEvent); + if (_SelectedProfileID != Guid.Empty) { if (!CProfiles.IsProfileIDValid(_SelectedProfileID)) return true; @@ -480,12 +480,12 @@ namespace Vocaluxe.Screens if (mouseEvent.LD && _NameSelections[_NameSelection].IsOverTile(mouseEvent) && !_SelectingFast) { - _SelectedProfileID = _NameSelections[_NameSelection].TilePlayerNr(mouseEvent); - if (_SelectedProfileID > -1) + _SelectedProfileID = _NameSelections[_NameSelection].TilePlayerID(mouseEvent); + if (_SelectedProfileID != Guid.Empty) { for (int i = 0; i < CGame.NumPlayers; i++) { - if (CGame.Players[i].ProfileID == -1) + if (CGame.Players[i].ProfileID == Guid.Empty) { if (!CProfiles.IsProfileIDValid(_SelectedProfileID)) return true; @@ -657,7 +657,7 @@ namespace Vocaluxe.Screens _Statics["StaticPlayerAvatar" + i].Visible = true; _Texts["TextPlayer" + i].Visible = true; if (_Texts["TextPlayer" + i].Text == "") - _Texts["TextPlayer" + i].Text = CProfiles.GetPlayerName(-1, i); + _Texts["TextPlayer" + i].Text = CProfiles.GetPlayerName(Guid.Empty, i); _Equalizers["EqualizerPlayer" + i].Visible = true; if (CGame.GetNumSongs() == 1 && CGame.GetSong(0).IsDuet) _SelectSlides["SelectSlideDuetPlayer" + i].Visible = true; @@ -677,7 +677,7 @@ namespace Vocaluxe.Screens _CheckPlayers(); } - private void _UpdateSelectedProfile(int playerNum, int profileId) + private void _UpdateSelectedProfile(int playerNum, Guid profileId) { _NameSelections[_NameSelection].RemoveUsedProfile(CGame.Players[playerNum].ProfileID); _NameSelections[_NameSelection].UseProfile(profileId); @@ -700,12 +700,12 @@ namespace Vocaluxe.Screens for (int i = 0; i < CGame.NumPlayers; i++) { _NameSelections[_NameSelection].RemoveUsedProfile(CGame.Players[i].ProfileID); - CGame.Players[i].ProfileID = -1; + CGame.Players[i].ProfileID = Guid.Empty; //Update config for default players. CConfig.Config.Game.Players[i] = String.Empty; //Update texture and name _Statics[_StaticPlayerAvatar[i]].Texture = _OriginalPlayerAvatarTextures[i]; - _Texts[_TextPlayer[i]].Text = CProfiles.GetPlayerName(-1, i + 1); + _Texts[_TextPlayer[i]].Text = CProfiles.GetPlayerName(Guid.Empty, i + 1); } _NameSelections[_NameSelection].UpdateList(); CConfig.SaveConfig(); @@ -714,13 +714,13 @@ namespace Vocaluxe.Screens private void _ResetPlayerSelection(int playerNum) { _NameSelections[_NameSelection].RemoveUsedProfile(CGame.Players[playerNum].ProfileID); - CGame.Players[playerNum].ProfileID = -1; + CGame.Players[playerNum].ProfileID = Guid.Empty; //Update config for default players. CConfig.Config.Game.Players[playerNum] = String.Empty; CConfig.SaveConfig(); //Update texture and name _Statics[_StaticPlayerAvatar[playerNum]].Texture = _OriginalPlayerAvatarTextures[playerNum]; - _Texts[_TextPlayer[playerNum]].Text = CProfiles.GetPlayerName(-1, playerNum + 1); + _Texts[_TextPlayer[playerNum]].Text = CProfiles.GetPlayerName(Guid.Empty, playerNum + 1); //Update profile-warning _CheckPlayers(); //Update Tiles-List @@ -770,7 +770,7 @@ namespace Vocaluxe.Screens var playerWithoutProfile = new List(); for (int player = 0; player < CConfig.Config.Game.NumPlayers; player++) { - if (CGame.Players[player].ProfileID < 0) + if (CGame.Players[player].ProfileID == Guid.Empty) playerWithoutProfile.Add(player + 1); } diff --git a/Vocaluxe/Screens/CScreenProfiles.cs b/Vocaluxe/Screens/CScreenProfiles.cs index f98a3c2e..a7365c0d 100644 --- a/Vocaluxe/Screens/CScreenProfiles.cs +++ b/Vocaluxe/Screens/CScreenProfiles.cs @@ -16,6 +16,7 @@ #endregion using System; +using System.Linq; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; @@ -62,6 +63,8 @@ namespace Vocaluxe.Screens private bool _ProfilesChanged; private bool _AvatarsChanged; + private Dictionary _SelectSlideGuids = new Dictionary(); + private EEditMode _EditMode; private CTextureRef _WebcamTexture; @@ -109,7 +112,7 @@ namespace Vocaluxe.Screens break; case EEditMode.PlayerName: _SelectSlides[_SelectSlideProfiles].RenameValue( - CProfiles.AddGetPlayerName(_SelectSlides[_SelectSlideProfiles].SelectedTag, keyEvent.Unicode)); + CProfiles.AddGetPlayerName(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), keyEvent.Unicode)); _ProfilesChanged = true; break; } @@ -155,7 +158,7 @@ namespace Vocaluxe.Screens if (_EditMode == EEditMode.PlayerName) { _SelectSlides[_SelectSlideProfiles].RenameValue( - CProfiles.GetDeleteCharInPlayerName(_SelectSlides[_SelectSlideProfiles].SelectedTag)); + CProfiles.GetDeleteCharInPlayerName(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag))); _ProfilesChanged = true; } else @@ -168,22 +171,22 @@ namespace Vocaluxe.Screens } if (_SelectSlides[_SelectSlideDifficulty].Selected) { - CProfiles.SetDifficulty(_SelectSlides[_SelectSlideProfiles].SelectedTag, + CProfiles.SetDifficulty(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), (EGameDifficulty)_SelectSlides[_SelectSlideDifficulty].Selection); } else if (_SelectSlides[_SelectSlideAvatars].Selected) { - CProfiles.SetAvatar(_SelectSlides[_SelectSlideProfiles].SelectedTag, + CProfiles.SetAvatar(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), _SelectSlides[_SelectSlideAvatars].SelectedTag); } else if (_SelectSlides[_SelectSlideUserRole].Selected) { - CProfiles.SetUserRoleProfile(_SelectSlides[_SelectSlideProfiles].SelectedTag, + CProfiles.SetUserRoleProfile(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), (EUserRole)_SelectSlides[_SelectSlideUserRole].Selection); } else if (_SelectSlides[_SelectSlideActive].Selected) { - CProfiles.SetActive(_SelectSlides[_SelectSlideProfiles].SelectedTag, + CProfiles.SetActive(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), (EOffOn)_SelectSlides[_SelectSlideActive].Selection); } } @@ -215,24 +218,24 @@ namespace Vocaluxe.Screens } else if (_SelectSlides[_SelectSlideDifficulty].Selected) { - CProfiles.SetDifficulty(_SelectSlides[_SelectSlideProfiles].SelectedTag, + CProfiles.SetDifficulty(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), (EGameDifficulty)_SelectSlides[_SelectSlideDifficulty].Selection); } else if (_SelectSlides[_SelectSlideAvatars].Selected) { - CProfiles.SetAvatar(_SelectSlides[_SelectSlideProfiles].SelectedTag, + CProfiles.SetAvatar(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), _SelectSlides[_SelectSlideAvatars].SelectedTag); if (CWebcam.IsDeviceAvailable() && _WebcamTexture != null) _OnDiscardSnapshot(); } else if (_SelectSlides[_SelectSlideUserRole].Selected) { - CProfiles.SetUserRoleProfile(_SelectSlides[_SelectSlideProfiles].SelectedTag, + CProfiles.SetUserRoleProfile(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), (EUserRole)_SelectSlides[_SelectSlideUserRole].Selection); } else if (_SelectSlides[_SelectSlideActive].Selected) { - CProfiles.SetActive(_SelectSlides[_SelectSlideProfiles].SelectedTag, + CProfiles.SetActive(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), (EOffOn)_SelectSlides[_SelectSlideActive].Selection); } else if (_Buttons[_ButtonWebcam].Selected) @@ -260,15 +263,15 @@ namespace Vocaluxe.Screens if (_SelectSlides[_SelectSlideProfiles].Selection > -1) { - _Buttons[_ButtonPlayerName].Text.Text = CProfiles.GetPlayerName(_SelectSlides[_SelectSlideProfiles].SelectedTag); + _Buttons[_ButtonPlayerName].Text.Text = CProfiles.GetPlayerName(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag)); if (_EditMode == EEditMode.PlayerName) _Buttons[_ButtonPlayerName].Text.Text += "|"; - _SelectSlides[_SelectSlideDifficulty].Selection = (int)CProfiles.GetDifficulty(_SelectSlides[_SelectSlideProfiles].SelectedTag); - _SelectSlides[_SelectSlideUserRole].Selection = (int)CProfiles.GetUserRoleProfile(_SelectSlides[_SelectSlideProfiles].SelectedTag); - _SelectSlides[_SelectSlideActive].Selection = (int)CProfiles.GetActive(_SelectSlides[_SelectSlideProfiles].SelectedTag); + _SelectSlides[_SelectSlideDifficulty].Selection = (int)CProfiles.GetDifficulty(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag)); + _SelectSlides[_SelectSlideUserRole].Selection = (int)CProfiles.GetUserRoleProfile(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag)); + _SelectSlides[_SelectSlideActive].Selection = (int)CProfiles.GetActive(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag)); - int avatarID = CProfiles.GetAvatarID(_SelectSlides[_SelectSlideProfiles].SelectedTag); + int avatarID = CProfiles.GetAvatarID(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag)); _SelectSlides[_SelectSlideAvatars].SelectedTag = avatarID; if (_Snapshot == null) { @@ -363,7 +366,7 @@ namespace Vocaluxe.Screens _Buttons[_ButtonWebcam].Visible = CWebcam.IsDeviceAvailable(); int id = CProfiles.NewAvatar(file); - CProfiles.SetAvatar(_SelectSlides[_SelectSlideProfiles].SelectedTag, id); + CProfiles.SetAvatar(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), id); _LoadAvatars(false); _SelectElement(_Buttons[_ButtonSave]); @@ -389,11 +392,13 @@ namespace Vocaluxe.Screens private void _NewProfile() { _EditMode = EEditMode.None; - int id = CProfiles.NewProfile(); + Guid id = CProfiles.NewProfile(); _LoadProfiles(false); - _SelectSlides[_SelectSlideProfiles].SelectedTag = id; + int num = CProfiles.NumProfiles; + _SelectSlides[_SelectSlideProfiles].SelectedTag = num; + _SelectSlideGuids.Add(num, id); - CProfiles.SetAvatar(_SelectSlides[_SelectSlideProfiles].SelectedTag, _SelectSlides[_SelectSlideAvatars].SelectedTag); + CProfiles.SetAvatar(id, _SelectSlides[_SelectSlideAvatars].SelectedTag); _SelectElement(_Buttons[_ButtonPlayerName]); _EditMode = EEditMode.PlayerName; @@ -409,7 +414,8 @@ namespace Vocaluxe.Screens { _EditMode = EEditMode.None; - CProfiles.DeleteProfile(_SelectSlides[_SelectSlideProfiles].SelectedTag); + CProfiles.DeleteProfile(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag)); + _SelectSlideGuids.Remove(_SelectSlides[_SelectSlideProfiles].SelectedTag); int selection = _SelectSlides[_SelectSlideProfiles].Selection; if (_SelectSlides[_SelectSlideProfiles].NumValues - 1 > selection) @@ -422,23 +428,29 @@ namespace Vocaluxe.Screens { string name = String.Empty; if (_EditMode == EEditMode.PlayerName) - name = CProfiles.GetPlayerName(_SelectSlides[_SelectSlideProfiles].SelectedTag); + name = CProfiles.GetPlayerName(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag)); - int selectedProfileID = _SelectSlides[_SelectSlideProfiles].SelectedTag; + Guid selectedProfileID = _GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag); _SelectSlides[_SelectSlideProfiles].Clear(); + _SelectSlideGuids.Clear(); CProfile[] profiles = CProfiles.GetProfiles(); + int i = 0; foreach (CProfile profile in profiles) - _SelectSlides[_SelectSlideProfiles].AddValue(profile.PlayerName, null, profile.ID); + { + _SelectSlides[_SelectSlideProfiles].AddValue(profile.PlayerName, null, i); + _SelectSlideGuids.Add(i, profile.ID); + i++; + } if (CProfiles.NumProfiles > 0 && CProfiles.NumAvatars > 0) { - if (selectedProfileID != -1) - _SelectSlides[_SelectSlideProfiles].SelectedTag = selectedProfileID; + if (selectedProfileID != Guid.Empty) + _SelectSlides[_SelectSlideProfiles].SelectedTag = _SelectSlideGuids.FirstOrDefault(x => x.Value.Equals(selectedProfileID)).Key; else { _SelectSlides[_SelectSlideProfiles].Selection = 0; - selectedProfileID = _SelectSlides[_SelectSlideProfiles].SelectedTag; + selectedProfileID = _GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag); } if (!keep) @@ -450,7 +462,7 @@ namespace Vocaluxe.Screens } if (_EditMode == EEditMode.PlayerName) - CProfiles.SetPlayerName(_SelectSlides[_SelectSlideProfiles].SelectedTag, name); + CProfiles.SetPlayerName(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), name); } _ProfilesChanged = false; } @@ -469,12 +481,20 @@ namespace Vocaluxe.Screens if (keep) { _SelectSlides[_SelectSlideAvatars].SelectedTag = selectedAvatarID; - CProfiles.SetAvatar(_SelectSlides[_SelectSlideProfiles].SelectedTag, selectedAvatarID); + CProfiles.SetAvatar(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag), selectedAvatarID); } else - _SelectSlides[_SelectSlideAvatars].SelectedTag = CProfiles.GetAvatarID(_SelectSlides[_SelectSlideProfiles].SelectedTag); + _SelectSlides[_SelectSlideAvatars].SelectedTag = CProfiles.GetAvatarID(_GetIdFromTag(_SelectSlides[_SelectSlideProfiles].SelectedTag)); _AvatarsChanged = false; } + + private Guid _GetIdFromTag(int tag) + { + if (tag == -1 || !_SelectSlideGuids.ContainsKey(tag)) + return Guid.Empty; + else + return _SelectSlideGuids[tag]; + } } } \ No newline at end of file diff --git a/Vocaluxe/Screens/CScreenScore.cs b/Vocaluxe/Screens/CScreenScore.cs index 33bc3983..c9b77e4d 100644 --- a/Vocaluxe/Screens/CScreenScore.cs +++ b/Vocaluxe/Screens/CScreenScore.cs @@ -138,6 +138,9 @@ namespace Vocaluxe.Screens _SetVisibility(); _UpdateRatings(); _SlideShowBG.Visible = _UpdateBackground(); + + for (int p = 0; p < CGame.NumPlayers; p++) + _Statics[_StaticAvatar[p, CGame.NumPlayers - 1]].Aspect = EAspect.Crop; } public override bool UpdateGame() diff --git a/Vocaluxe/Screens/CScreenSing.cs b/Vocaluxe/Screens/CScreenSing.cs index 4c37016e..d2e4f120 100644 --- a/Vocaluxe/Screens/CScreenSing.cs +++ b/Vocaluxe/Screens/CScreenSing.cs @@ -50,12 +50,12 @@ namespace Vocaluxe.Screens private const string _TextSongName = "TextSongName"; private const string _TextTime = "TextTime"; - private const string _TextPause = "TextPause"; private const string _TextDuetName1 = "TextDuetName1"; private const string _TextDuetName2 = "TextDuetName2"; private const string _TextMedleyCountdown = "TextMedleyCountdown"; private string[,,] _TextScores; private string[,,] _TextNames; + private List _TextsPause; private const string _StaticSongText = "StaticSongText"; private const string _StaticLyrics = "StaticLyrics"; @@ -69,7 +69,7 @@ namespace Vocaluxe.Screens private const string _StaticLyricHelper = "StaticLyricHelper"; private const string _StaticLyricHelperDuet = "StaticLyricHelperDuet"; private const string _StaticLyricHelperTop = "StaticLyricHelperTop"; - private const string _StaticPauseBG = "StaticPauseBG"; + private List _StaticsPause; private string[,,] _StaticScores; private string[,,] _StaticAvatars; @@ -139,7 +139,7 @@ namespace Vocaluxe.Screens { base.Init(); - var texts = new List { _TextSongName, _TextTime, _TextPause, _TextDuetName1, _TextDuetName2, _TextMedleyCountdown }; + var texts = new List { _TextSongName, _TextTime, _TextDuetName1, _TextDuetName2, _TextMedleyCountdown }; _BuildTextStrings(texts); _ThemeTexts = texts.ToArray(); @@ -156,9 +156,8 @@ namespace Vocaluxe.Screens _StaticTimePointer, _StaticLyricHelper, _StaticLyricHelperDuet, - _StaticLyricHelperTop, - _StaticPauseBG - }; + _StaticLyricHelperTop + }; _BuildStaticStrings(ref statics); _ThemeStatics = statics.ToArray(); @@ -181,6 +180,21 @@ namespace Vocaluxe.Screens _TimerDuetText2 = new Stopwatch(); } + public override void LoadTheme(string xmlPath) + { + base.LoadTheme(xmlPath); + + _StaticsPause = new List(); + _TextsPause = new List(); + + //Automatically find statics and texts with pause prefix + foreach (CStatic s in _Statics.Where(s => s.ThemeLoaded && s.GetThemeName().StartsWith("StaticPause"))) + _StaticsPause.Add(s.GetThemeName()); + + foreach (CText t in _Texts.Where(s => s.ThemeLoaded && s.GetThemeName().StartsWith("TextPause"))) + _TextsPause.Add(t.GetThemeName()); + } + public override bool HandleInput(SKeyEvent keyEvent) { base.HandleInput(keyEvent); @@ -220,15 +234,13 @@ namespace Vocaluxe.Screens CConfig.Config.Theme.PlayerInfo = (EPlayerInfo)mode; CConfig.SaveConfig(); _SetVisibility(); - if (CGame.GetSong() != null) - _SetDuetLyricsVisibility(CGame.GetSong().IsDuet); //make sure duet lyrics remain visible break; case Keys.S: if (CGame.NumRounds > CGame.RoundNr) { if (keyEvent.ModCtrl) - _LoadNextSong(); + _NextSong(); } break; case Keys.W: @@ -250,7 +262,7 @@ namespace Vocaluxe.Screens _Stop(); if (_Buttons[_ButtonSkip].Selected) { - _LoadNextSong(); + _NextSong(); _SetPause(false); } } @@ -295,7 +307,7 @@ namespace Vocaluxe.Screens if (_Buttons[_ButtonSkip].Selected) { - _LoadNextSong(); + _NextSong(); _SetPause(false); } } @@ -318,7 +330,7 @@ namespace Vocaluxe.Screens finish = true; if (finish && !_FadeOut) - _LoadNextSong(); + _NextSong(); _UpdateSongText(); _UpdateDuetNames(); @@ -451,7 +463,7 @@ namespace Vocaluxe.Screens base.OnShowFinish(); CGame.Start(); - _LoadNextSong(); + _NextSong(); } public override void Draw() @@ -535,12 +547,40 @@ namespace Vocaluxe.Screens _Texts[_TextMedleyCountdown].Text = String.Empty; } - private void _LoadNextSong() + private void _RestartRound() + { + _CloseSong(); + + CGame.ResetPlayer(); + _LoadCurrentSong(); + + _StartSong(); + } + + private void _RestartGame() + { + _CloseSong(); + + CGame.Reset(); + CGame.ResetPlayer(); + CGame.NextRound(); + _LoadCurrentSong(); + + _StartSong(); + } + + private void _NextSong() { _CloseSong(); CGame.NextRound(); + _LoadCurrentSong(); + _StartSong(); + } + + private void _LoadCurrentSong() + { if (CGame.IsFinished()) { _FinishedSinging(); @@ -634,7 +674,6 @@ namespace Vocaluxe.Screens for (int p = 0; p < CGame.NumPlayers; p++) _ProgressBars[_PlayerProgressBarRating[p]].Reset(); - _SetDuetLyricsVisibility(song.IsDuet); _SetNormalLyricsVisibility(); _TimerSongText.Reset(); @@ -643,41 +682,38 @@ namespace Vocaluxe.Screens if (!song.IsDuet) _TimerSongText.Start(); - - _StartSong(); - } - - private void _SetDuetLyricsVisibility(bool isDuet) - { - _Statics[_StaticLyricsDuet].Visible = isDuet; - _Lyrics[_LyricMainDuet].Visible = isDuet; - _Lyrics[_LyricSubDuet].Visible = isDuet; - - if (isDuet) - { - _Lyrics[_LyricMainTop].Visible = false; - _Lyrics[_LyricSubTop].Visible = false; - _Statics[_StaticLyricsTop].Visible = false; - } - else - { - bool lyricsOnTop = CConfig.Config.Game.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_TOP - || CConfig.Config.Game.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_BOTH - || (CConfig.Config.Game.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_DYNAMIC && _DynamicLyricsTop); - _Lyrics[_LyricMainTop].Visible = lyricsOnTop; - _Lyrics[_LyricSubTop].Visible = lyricsOnTop; - _Statics[_StaticLyricsTop].Visible = lyricsOnTop; - } } private void _SetNormalLyricsVisibility() { - bool visible = CConfig.Config.Game.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_BOTTOM + bool bottomLyricsVisible = CConfig.Config.Game.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_BOTTOM || CConfig.Config.Game.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_BOTH || (CConfig.Config.Game.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_DYNAMIC && _DynamicLyricsBottom); - _Lyrics[_LyricMain].Visible = visible; - _Lyrics[_LyricSub].Visible = visible; - _Statics[_StaticLyrics].Visible = visible; + + bool topLyricsVisible = CConfig.Config.Game.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_TOP + || CConfig.Config.Game.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_BOTH + || (CConfig.Config.Game.LyricsPosition == ELyricsPosition.TR_CONFIG_LYRICSPOSITION_DYNAMIC && _DynamicLyricsTop); + + bool duetLyricsVisible = false; + + if (CGame.GetSong() != null && CGame.GetSong().IsDuet) + { + bottomLyricsVisible = true; + topLyricsVisible = false; + duetLyricsVisible = true; + } + + _Lyrics[_LyricMain].Visible = bottomLyricsVisible; + _Lyrics[_LyricSub].Visible = bottomLyricsVisible; + _Statics[_StaticLyrics].Visible = bottomLyricsVisible; + + _Lyrics[_LyricMainTop].Visible = topLyricsVisible; + _Lyrics[_LyricSubTop].Visible = topLyricsVisible; + _Statics[_StaticLyricsTop].Visible = topLyricsVisible; + + _Lyrics[_LyricMainDuet].Visible = duetLyricsVisible; + _Lyrics[_LyricSubDuet].Visible = duetLyricsVisible; + _Statics[_StaticLyricsDuet].Visible = duetLyricsVisible; } private void _StartSong() @@ -693,7 +729,10 @@ namespace Vocaluxe.Screens { //Need this to set other songs to points-var while (!CGame.IsFinished()) + { CGame.NextRound(); + CGame.ResetPlayer(); + } _FinishedSinging(); } @@ -830,11 +869,17 @@ namespace Vocaluxe.Screens private void _SetPause(bool paused) { _Pause = paused; - _Statics[_StaticPauseBG].Visible = _Pause; - _Texts[_TextPause].Visible = _Pause; + + foreach(String s in _StaticsPause) + _Statics[s].Visible = _Pause; + + foreach(String s in _TextsPause) + _Texts[s].Visible = _Pause; + _Buttons[_ButtonCancel].Visible = _Pause; _Buttons[_ButtonContinue].Visible = _Pause; _Buttons[_ButtonSkip].Visible = _Pause && CGame.NumRounds > CGame.RoundNr && CGame.NumRounds > 1; + if (_Pause) CSound.Pause(_CurrentStream); else diff --git a/Vocaluxe/Vocaluxe.csproj b/Vocaluxe/Vocaluxe.csproj index 248e7a46..e98af8cd 100644 --- a/Vocaluxe/Vocaluxe.csproj +++ b/Vocaluxe/Vocaluxe.csproj @@ -1,5 +1,5 @@  - + DebugWin x86 @@ -10,7 +10,7 @@ Properties Vocaluxe Vocaluxe - v4.0 + v4.7.1 512 false Vocaluxe.CMainProgram @@ -43,6 +43,7 @@ prompt 4 Off + false x86 @@ -54,6 +55,7 @@ false WIN;ARCH_X86 Off + false x64 @@ -66,6 +68,7 @@ 4 Off ..\CheckingRules.ruleset + false x64 @@ -77,6 +80,7 @@ false WIN;ARCH_X64 Off + false x86 @@ -88,6 +92,7 @@ prompt 4 Off + false x86 @@ -99,6 +104,7 @@ false LINUX;ARCH_X86 Off + false x64 @@ -110,6 +116,7 @@ prompt 4 Off + false x64 @@ -121,6 +128,7 @@ false LINUX;ARCH_X64 Off + false x86 @@ -132,6 +140,7 @@ false WIN;ARCH_X86;INSTALLER Off + false x64 @@ -143,6 +152,7 @@ false WIN;ARCH_X64;INSTALLER Off + false diff --git a/Vocaluxe/app.config b/Vocaluxe/app.config index d1480e79..bdab2be4 100644 --- a/Vocaluxe/app.config +++ b/Vocaluxe/app.config @@ -1,11 +1,11 @@ - + - +