Merge branch 'develop' of git://github.com/flokuep/Vocaluxe into develop

This commit is contained in:
Flamefire committed 2014-09-07 10:37:37 +02:00
commit a5ddeeee95
25 files changed
+722 -300

No files matched your search

+1
View File
@@ -76,6 +76,7 @@
<string name="TR_CONFIG_OWN_MUSIC">Own Music and Background Music</string> <string name="TR_CONFIG_OWN_MUSIC">Own Music and Background Music</string>
<string name="TR_CONFIG_NO_OWN_MUSIC">No own Music</string> <string name="TR_CONFIG_NO_OWN_MUSIC">No own Music</string>
<string name="TR_CONFIG_ONLY_OWN_MUSIC">Only own Music</string> <string name="TR_CONFIG_ONLY_OWN_MUSIC">Only own Music</string>
<string name="TR_CONFIG_ONLY_SONG">Only selected song</string>
<string name="TR_CONFIG_FADEPLAYERINFO_ALL">All</string> <string name="TR_CONFIG_FADEPLAYERINFO_ALL">All</string>
<string name="TR_CONFIG_FADEPLAYERINFO_INFO">Only names and avatars</string> <string name="TR_CONFIG_FADEPLAYERINFO_INFO">Only names and avatars</string>
<string name="TR_CONFIG_FADEPLAYERINFO_OFF">Nothing</string> <string name="TR_CONFIG_FADEPLAYERINFO_OFF">Nothing</string>
@@ -379,7 +379,7 @@ namespace VocaluxeLib.PartyModes.TicTacToe
{ {
base.OnClose(); base.OnClose();
CBase.BackgroundMusic.SetDisabled(false); CBase.BackgroundMusic.SetDisabled(false);
CBase.Sound.FadeAndClose(_PreviewStream, 0f, 0.5f); CBase.Sound.Fade(_PreviewStream, 0f, 0.5f, EStreamAction.Close);
} }
private void _CreateFields() private void _CreateFields()
@@ -574,7 +574,7 @@ namespace VocaluxeLib.PartyModes.TicTacToe
{ {
_GameData.NumJokerRandom[teamNr]--; _GameData.NumJokerRandom[teamNr]--;
if (!CBase.Sound.IsFinished(_PreviewStream)) if (!CBase.Sound.IsFinished(_PreviewStream))
CBase.Sound.FadeAndClose(_PreviewStream, 0, 1); CBase.Sound.Fade(_PreviewStream, 0, 1, EStreamAction.Close);
_FieldSelected(true); _FieldSelected(true);
} }
break; break;
@@ -586,7 +586,7 @@ namespace VocaluxeLib.PartyModes.TicTacToe
_GameData.NumJokerRetry[teamNr]--; _GameData.NumJokerRetry[teamNr]--;
_GameData.Team = teamNr; _GameData.Team = teamNr;
if (!CBase.Sound.IsFinished(_PreviewStream)) if (!CBase.Sound.IsFinished(_PreviewStream))
CBase.Sound.FadeAndClose(_PreviewStream, 0, 1); CBase.Sound.Fade(_PreviewStream, 0, 1, EStreamAction.Close);
_Status = EStatus.JokerRetry; _Status = EStatus.JokerRetry;
_OldSelectedField = _SelectedField; _OldSelectedField = _SelectedField;
_SelectedField = -1; _SelectedField = -1;
@@ -627,7 +627,7 @@ namespace VocaluxeLib.PartyModes.TicTacToe
private void _NextRound() private void _NextRound()
{ {
CBase.Sound.FadeAndClose(_PreviewStream, 0f, 0.5f); CBase.Sound.Fade(_PreviewStream, 0f, 0.5f, EStreamAction.Close);
_Data.ScreenMain.Rounds = _GameData.Rounds; _Data.ScreenMain.Rounds = _GameData.Rounds;
_Data.ScreenMain.FadeToNameSelection = false; _Data.ScreenMain.FadeToNameSelection = false;
_Data.ScreenMain.FadeToSinging = true; _Data.ScreenMain.FadeToSinging = true;
@@ -640,7 +640,7 @@ namespace VocaluxeLib.PartyModes.TicTacToe
private void _EndParty() private void _EndParty()
{ {
CBase.Sound.FadeAndClose(_PreviewStream, 0f, 0.5f); CBase.Sound.Fade(_PreviewStream, 0f, 0.5f, EStreamAction.Close);
_FadeTo(EScreens.ScreenParty); _FadeTo(EScreens.ScreenParty);
} }
@@ -659,7 +659,7 @@ namespace VocaluxeLib.PartyModes.TicTacToe
private void _Back() private void _Back()
{ {
CBase.Sound.FadeAndClose(_PreviewStream, 0f, 0.5f); CBase.Sound.Fade(_PreviewStream, 0f, 0.5f, EStreamAction.Close);
_Data.ScreenMain.FadeToNameSelection = true; _Data.ScreenMain.FadeToNameSelection = true;
_Data.ScreenMain.FadeToSinging = false; _Data.ScreenMain.FadeToSinging = false;
_Data.ScreenMain.SingRoundNr = _SelectedField; _Data.ScreenMain.SingRoundNr = _SelectedField;
+185 -175
View File
@@ -22,6 +22,7 @@ using System.IO;
using VocaluxeLib; using VocaluxeLib;
using VocaluxeLib.Songs; using VocaluxeLib.Songs;
using VocaluxeLib.Draw; using VocaluxeLib.Draw;
using VocaluxeLib.Utils.Player;
namespace Vocaluxe.Base namespace Vocaluxe.Base
{ {
@@ -29,89 +30,98 @@ namespace Vocaluxe.Base
{ {
private static bool _Initialized; private static bool _Initialized;
private static CSongPlayer _SongPlayer;
private static CSongPlayer _PreviewPlayer;
private static bool _OwnSongsAvailable; private static bool _OwnSongsAvailable;
private static EBackgroundMusicSource _MusicSource; private static EBackgroundMusicSource _MusicSource;
private static bool _VideoEnabled; private static bool _VideoEnabled;
private static CPlaylistElement _CurrentPlaylistElement; //Currently played music private static CPlaylistElement _CurrentPlaylistElement; //Currently played music
private static int _CurrentMusicStream = -1; //Current active music stream private static int _PreviousMusicIndex = -1;
private static int _PreviousMusicIndex; //Index of _CurrentPlaylistElement in _PreviousFiles (kept for performance)
private static readonly List<CPlaylistElement> _BGMusicFiles = new List<CPlaylistElement>(); //Background music files private static readonly List<CPlaylistElement> _BGMusicFiles = new List<CPlaylistElement>(); //Background music files
private static readonly List<CPlaylistElement> _NotPlayedFiles = new List<CPlaylistElement>(); //Not played files private static readonly List<CPlaylistElement> _NotPlayedFiles = new List<CPlaylistElement>(); //Not played files
private static readonly List<CPlaylistElement> _PreviousFiles = new List<CPlaylistElement>(); //Played files private static readonly List<CPlaylistElement> _PreviousFiles = new List<CPlaylistElement>(); //Played files
private static int _Video = -1;
private static CTexture _CurrentVideoTexture;
private static CFading _VideoFading;
private static bool _OwnMusicAdded; private static bool _OwnMusicAdded;
private static bool _BackgroundMusicAdded; private static bool _BackgroundMusicAdded;
private static bool _Disabled; private static bool _Disabled;
private static bool _PlaysPreview;
public static bool VideoEnabled public static bool VideoEnabled
{ {
get { return _VideoEnabled; } get { return _PlaysPreview ? _PreviewPlayer.VideoEnabled : _SongPlayer.VideoEnabled; }
set set {
{ if(_PlaysPreview)
if (_VideoEnabled == value) _PreviewPlayer.VideoEnabled = value;
return; else
_VideoEnabled = value; _SongPlayer.VideoEnabled = value;
if (_VideoEnabled)
_LoadVideo();
else if (_Video != -1)
{
CVideo.Close(_Video);
CDraw.RemoveTexture(ref _CurrentVideoTexture);
_Video = -1;
}
} }
} }
public static bool CanSing { get; private set; } public static bool CanSing
{
get
{
if (_PlaysPreview)
return false;
else
if (_BGMusicFiles.Contains(_CurrentPlaylistElement))
return false;
else return true;
}
}
public static bool Disabled public static bool Disabled
{ {
get { return _Disabled; } get { return _Disabled; }
set set
{ {
if (Disabled == value)
return;
_Disabled = value; _Disabled = value;
if (_Disabled) Pause();
Pause();
else
Play();
} }
} }
public static bool RepeatSong { get; set; } public static bool RepeatSong {
get { return _SongPlayer.RepeatSong; }
set { _SongPlayer.RepeatSong = value; }
}
public static int SongID public static int SongID
{ {
get { return _CurrentPlaylistElement == null ? -1 : _CurrentPlaylistElement.SongID; } get { return _SongPlayer.SongID; }
} }
public static bool SongHasVideo public static bool SongHasVideo
{ {
get { return _CurrentPlaylistElement != null && File.Exists(_CurrentPlaylistElement.VideoFilePath); } get { return _SongPlayer.SongHasVideo; }
} }
public static bool IsPlaying { get; private set; } public static bool IsPlaying { get { return _PlaysPreview ? _PreviewPlayer.IsPlaying : _SongPlayer.IsPlaying; } }
public static bool IsPlayingPreview { get { return _PlaysPreview; } }
public static string ArtistAndTitle public static string ArtistAndTitle
{ {
get get {
{ if (_PlaysPreview)
if (_CurrentPlaylistElement == null) return _PreviewPlayer.ArtistAndTitle;
return ""; else
if (_CurrentPlaylistElement.Artist != "" && _CurrentPlaylistElement.Title != "") return _BGMusicFiles.Contains(_CurrentPlaylistElement) ? Path.GetFileNameWithoutExtension(_CurrentPlaylistElement.MusicFilePath) : _SongPlayer.ArtistAndTitle;
return _CurrentPlaylistElement.Artist + " - " + _CurrentPlaylistElement.Title;
return Path.GetFileNameWithoutExtension(_CurrentPlaylistElement.MusicFilePath);
} }
} }
public static float Length
{
get { return _PlaysPreview ? _PreviewPlayer.Length : _SongPlayer.Length; }
}
public static CTexture Cover public static CTexture Cover
{ {
get { return _CurrentPlaylistElement == null ? CCover.NoCover : _CurrentPlaylistElement.Cover; } get { return _PlaysPreview ? _PreviewPlayer.Cover : _SongPlayer.Cover; }
} }
//Use this to set whether own songs are available for access //Use this to set whether own songs are available for access
@@ -143,8 +153,13 @@ namespace Vocaluxe.Base
_MusicSource = EBackgroundMusicSource.TR_CONFIG_NO_OWN_MUSIC; _MusicSource = EBackgroundMusicSource.TR_CONFIG_NO_OWN_MUSIC;
_AddBackgroundMusic(); _AddBackgroundMusic();
_PreviousMusicIndex = -1; _SongPlayer = new CSongPlayer();
IsPlaying = false; _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); _VideoEnabled = (CConfig.VideoBackgrounds == EOffOn.TR_CONFIG_ON && CConfig.VideosToBackground == EOffOn.TR_CONFIG_ON);
SetMusicSource(CConfig.BackgroundMusicSource); SetMusicSource(CConfig.BackgroundMusicSource);
_Initialized = true; _Initialized = true;
@@ -152,42 +167,29 @@ namespace Vocaluxe.Base
public static void Close() public static void Close()
{ {
if (_CurrentMusicStream >= 0) _SongPlayer.Stop();
{ _PreviewPlayer.Stop();
CSound.Close(_CurrentMusicStream);
_CurrentMusicStream = -1;
}
if (_Video != -1)
{
CVideo.Close(_Video);
CDraw.RemoveTexture(ref _CurrentVideoTexture);
_Video = -1;
}
_BGMusicFiles.Clear(); _BGMusicFiles.Clear();
_NotPlayedFiles.Clear(); _NotPlayedFiles.Clear();
_PreviousFiles.Clear(); _PreviousFiles.Clear();
IsPlaying = false;
_Initialized = false; _Initialized = false;
} }
public static void Play() public static void Play()
{ {
if (IsPlaying || CConfig.BackgroundMusic == EOffOn.TR_CONFIG_OFF) if (IsPlaying || (CConfig.BackgroundMusic != EBackgroundMusicOffOn.TR_CONFIG_ON && !_PlaysPreview))
return; return;
if (_CurrentMusicStream != -1) if (_PlaysPreview)
{ _PreviewPlayer.Play();
//Resume else if(CConfig.BackgroundMusic == EBackgroundMusicOffOn.TR_CONFIG_OFF)
CSound.SetStreamVolume(_CurrentMusicStream, 0f); if (_SongPlayer.SongLoaded)
CSound.Fade(_CurrentMusicStream, 100f, CSettings.BackgroundMusicFadeTime); //Resume
CSound.Play(_CurrentMusicStream); _SongPlayer.TogglePause();
if (_VideoEnabled && _Video != -1) else
CVideo.Resume(_Video); Next();
IsPlaying = true;
}
else
Next();
} }
public static void Stop() public static void Stop()
@@ -195,121 +197,103 @@ namespace Vocaluxe.Base
if (!IsPlaying) if (!IsPlaying)
return; return;
if (_Video != -1) if (_PlaysPreview)
{ {
CVideo.Close(_Video); _PreviewPlayer.Stop();
CDraw.RemoveTexture(ref _CurrentVideoTexture); _PlaysPreview = false;
_Video = -1; Pause();
}
else
{
_SongPlayer.Stop();
_CurrentPlaylistElement = null;
} }
CSound.FadeAndClose(_CurrentMusicStream, 0f, CSettings.BackgroundMusicFadeTime);
_CurrentMusicStream = -1;
_CurrentPlaylistElement = null;
IsPlaying = false;
} }
public static void Pause() public static void Pause()
{ {
if (!IsPlaying) if (_PlaysPreview)
return;
if (_Video != -1)
{ {
CVideo.Pause(_Video); if (!_PreviewPlayer.SongLoaded)
CVideo.Skip(_Video, CSound.GetPosition(_CurrentMusicStream) + CSettings.BackgroundMusicFadeTime, _CurrentPlaylistElement.VideoGap); return;
_PreviewPlayer.TogglePause();
}
else if (CConfig.BackgroundMusic == EBackgroundMusicOffOn.TR_CONFIG_ON)
{
if (!_SongPlayer.SongLoaded)
Next();
else
_SongPlayer.TogglePause();
} }
CSound.FadeAndPause(_CurrentMusicStream, 0f, CSettings.BackgroundMusicFadeTime);
IsPlaying = false;
} }
public static void Next() public static void Next()
{ {
Stop(); //stop last song if any if (!_PlaysPreview)
if (_PreviousMusicIndex < _PreviousFiles.Count - 2)
{ {
//We are in the previous list and next element exists Stop(); //stop last song if any
_PreviousMusicIndex++; if (_PreviousMusicIndex < _PreviousFiles.Count - 2)
_CurrentPlaylistElement = _PreviousFiles[_PreviousMusicIndex];
}
else
{
//We are not in the previous list (anymore)
if (_NotPlayedFiles.Count == 0)
{ {
if (_PreviousFiles.Count == 0) //We are in the previous list and next element exists
return; //No songs to play _PreviousMusicIndex++;
_NotPlayedFiles.AddRange(_PreviousFiles); _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)]; _CurrentPlaylistElement = _NotPlayedFiles[CGame.Rand.Next(_NotPlayedFiles.Count)];
_NotPlayedFiles.Remove(_CurrentPlaylistElement); _NotPlayedFiles.Remove(_CurrentPlaylistElement);
_PreviousFiles.Add(_CurrentPlaylistElement); _PreviousFiles.Add(_CurrentPlaylistElement);
_PreviousMusicIndex = _PreviousFiles.Count - 1; _PreviousMusicIndex = _PreviousFiles.Count - 1;
}
_StartSong();
} }
_StartSong();
CanSing = !_IsBackgroundFile(_CurrentPlaylistElement);
} }
public static void Previous() public static void Previous()
{ {
if (_PreviousMusicIndex < 0) if (!_PlaysPreview)
return;
Debug.Assert(_CurrentMusicStream != -1 && _CurrentPlaylistElement != null);
if (CSound.GetPosition(_CurrentMusicStream) <= 1.5f && _PreviousMusicIndex > 0)
{ {
Stop(); //stop last song if (_PreviousMusicIndex < 0)
_PreviousMusicIndex--; return;
Debug.Assert(_CurrentPlaylistElement != null);
if (_SongPlayer.Position <= 1.5f && _PreviousMusicIndex > 0)
{
Stop(); //stop last song
_PreviousMusicIndex--;
_CurrentPlaylistElement = _PreviousFiles[_PreviousMusicIndex]; _CurrentPlaylistElement = _PreviousFiles[_PreviousMusicIndex];
CanSing = !_IsBackgroundFile(_CurrentPlaylistElement); }
_StartSong();
} }
_StartSong();
} }
public static void Update() public static void Update()
{ {
if (!IsPlaying) if (!IsPlaying && (!_SongPlayer.SongLoaded || !_PreviewPlayer.SongLoaded) )
return; return;
Debug.Assert(_CurrentMusicStream != -1 && _CurrentPlaylistElement != null);
float timeToPlay; if (_PlaysPreview)
if (Math.Abs(_CurrentPlaylistElement.Finish) < 0.001) _PreviewPlayer.Update();
else
{ {
//No End-Tag defined _SongPlayer.Update();
float len = CSound.GetLength(_CurrentMusicStream); if (_SongPlayer.IsFinished)
timeToPlay = (len > 0f) ? len - CSound.GetPosition(_CurrentMusicStream) : CSettings.BackgroundMusicFadeTime + 1f;
}
else //End-Tag found
timeToPlay = _CurrentPlaylistElement.Finish - CSound.GetPosition(_CurrentMusicStream);
bool finished = CSound.IsFinished(_CurrentMusicStream);
if (timeToPlay <= CSettings.BackgroundMusicFadeTime || finished)
{
if (RepeatSong)
_StartSong();
else
Next(); Next();
} }
} }
public static CTexture GetVideoTexture() public static CTexture GetVideoTexture()
{ {
if (_Video == -1) return _PlaysPreview ? _PreviewPlayer.GetVideoTexture() : _SongPlayer.GetVideoTexture();
return null;
float vtime;
if (CVideo.GetFrame(_Video, ref _CurrentVideoTexture, CSound.GetPosition(_CurrentMusicStream), out vtime))
{
if (_VideoFading != null)
{
bool finished;
_CurrentVideoTexture.Color.A = _VideoFading.GetValue(out finished);
if (finished)
_VideoFading = null;
}
return _CurrentVideoTexture;
}
return null;
} }
public static void SetMusicSource(EBackgroundMusicSource source) public static void SetMusicSource(EBackgroundMusicSource source)
@@ -335,37 +319,74 @@ namespace Vocaluxe.Base
} }
} }
public static void LoadPreview(CSong song, float start = 0f)
{
if (!_PlaysPreview)
Pause();
else
StopPreview();
if (song == null)
return;
if (start == 0f)
start = song.Preview.StartTime;
_PlaysPreview = true;
_PreviewPlayer.Load(song, start);
float startposition = song.Preview.StartTime;
float length = _PreviewPlayer.Length;
if (song.Preview.Source == EDataSource.None)
startposition = length / 4f;
else if (startposition > length - 5f)
startposition = Math.Max(0f, Math.Min(length / 4f, length - 5f));
if (startposition >= 0.5f)
startposition -= 0.5f;
_PreviewPlayer.Position = startposition;
Play();
}
public static void PlayPreview(float start = -1f)
{
if (start > -1f)
_PreviewPlayer.Position = start;
Play();
}
public static void StopPreview()
{
_PreviewPlayer.Stop();
_PlaysPreview = false;
}
/// <summary> /// <summary>
/// (Re-)Starts the _CurrentPlaylistElement /// (Re-)Starts the _CurrentPlaylistElement
/// </summary> /// </summary>
private static void _StartSong() private static void _StartSong()
{ {
Debug.Assert(_CurrentPlaylistElement != null); Debug.Assert(_CurrentPlaylistElement != null);
//If we have an active stream, reuse it
if (_CurrentMusicStream < 0)
{
//otherwhise load
_CurrentMusicStream = CSound.Load(_CurrentPlaylistElement.MusicFilePath);
if (_CurrentMusicStream < 0)
return;
CSound.SetStreamVolume(_CurrentMusicStream, 0f);
CSound.Fade(_CurrentMusicStream, 100f, CSettings.BackgroundMusicFadeTime);
}
//Seek to #Start-Tag, if found
if (_CurrentPlaylistElement.Start > 0.001 && CConfig.BackgroundMusicUseStart == EOffOn.TR_CONFIG_ON)
CSound.SetPosition(_CurrentMusicStream, _CurrentPlaylistElement.Start);
if (_VideoEnabled) //If current song same as loaded restart only
if (_CurrentPlaylistElement.SongID == _SongPlayer.SongID && _SongPlayer.SongLoaded)
_SongPlayer.Play();
//otherwhise load
if (_BGMusicFiles.Contains(_CurrentPlaylistElement))
_SongPlayer.LoadFile(_CurrentPlaylistElement.MusicFilePath, 0f, true);
else
{ {
if (_Video != -1) //Seek to #Start-Tag, if found
{ float start = 0f;
if (_CurrentPlaylistElement.Start > 0.001 && CConfig.BackgroundMusicUseStart == EOffOn.TR_CONFIG_ON) if (_CurrentPlaylistElement.Start > 0.001 && CConfig.BackgroundMusicUseStart == EOffOn.TR_CONFIG_ON)
CVideo.Skip(_Video, 0f, _CurrentPlaylistElement.VideoGap + _CurrentPlaylistElement.Start); start = _CurrentPlaylistElement.Start;
else _SongPlayer.Load(CBase.Songs.GetSongByID(_CurrentPlaylistElement.SongID), start, true);
CVideo.Skip(_Video, 0f, _CurrentPlaylistElement.VideoGap);
}
else
_LoadVideo();
} }
} }
@@ -419,16 +440,5 @@ namespace Vocaluxe.Base
return _BGMusicFiles.Contains(element); return _BGMusicFiles.Contains(element);
} }
private static void _LoadVideo()
{
if (_Video != -1 || String.IsNullOrEmpty(_CurrentPlaylistElement.VideoFilePath))
return;
_Video = CVideo.Load(_CurrentPlaylistElement.VideoFilePath);
if (CConfig.BackgroundMusicUseStart == EOffOn.TR_CONFIG_ON)
CVideo.Skip(_Video, 0f, _CurrentPlaylistElement.VideoGap + _CurrentPlaylistElement.Start); //Use gap, otherwhise we will overwrite position in GetVideoTexture
else
CVideo.Skip(_Video, 0f, _CurrentPlaylistElement.VideoGap);
_VideoFading = new CFading(0f, 1f, 3f);
}
} }
} }
+3 -3
View File
@@ -97,7 +97,7 @@ namespace Vocaluxe.Base
public static EBufferSize AudioBufferSize = EBufferSize.B2048; public static EBufferSize AudioBufferSize = EBufferSize.B2048;
public static int AudioLatency; public static int AudioLatency;
private static int _BackgroundMusicVolume = 30; private static int _BackgroundMusicVolume = 30;
public static EOffOn BackgroundMusic = EOffOn.TR_CONFIG_ON; public static EBackgroundMusicOffOn BackgroundMusic = EBackgroundMusicOffOn.TR_CONFIG_ON;
public static EBackgroundMusicSource BackgroundMusicSource = EBackgroundMusicSource.TR_CONFIG_NO_OWN_MUSIC; public static EBackgroundMusicSource BackgroundMusicSource = EBackgroundMusicSource.TR_CONFIG_NO_OWN_MUSIC;
public static EOffOn BackgroundMusicUseStart = EOffOn.TR_CONFIG_ON; public static EOffOn BackgroundMusicUseStart = EOffOn.TR_CONFIG_ON;
private static int _PreviewMusicVolume = 50; private static int _PreviewMusicVolume = 50;
@@ -478,8 +478,8 @@ namespace Vocaluxe.Base
writer.WriteComment("AudioLatency from -500 to 500 ms"); writer.WriteComment("AudioLatency from -500 to 500 ms");
writer.WriteElementString("AudioLatency", AudioLatency.ToString()); writer.WriteElementString("AudioLatency", AudioLatency.ToString());
writer.WriteComment("Background Music: " + CHelper.ListStrings(Enum.GetNames(typeof(EOffOn)))); writer.WriteComment("Background Music: " + CHelper.ListStrings(Enum.GetNames(typeof(EBackgroundMusicOffOn))));
writer.WriteElementString("BackgroundMusic", Enum.GetName(typeof(EOffOn), BackgroundMusic)); writer.WriteElementString("BackgroundMusic", Enum.GetName(typeof(EBackgroundMusicOffOn), BackgroundMusic));
writer.WriteComment("Background Music Volume from 0 to 100"); writer.WriteComment("Background Music Volume from 0 to 100");
writer.WriteElementString("BackgroundMusicVolume", BackgroundMusicVolume.ToString()); writer.WriteElementString("BackgroundMusicVolume", BackgroundMusicVolume.ToString());
+9 -4
View File
@@ -60,6 +60,11 @@ namespace Vocaluxe.Base
get { return _CurrentScreen; } get { return _CurrentScreen; }
} }
public static EScreens NextScreen
{
get { return _NextScreen; }
}
#region public methods #region public methods
public static void Init() public static void Init()
{ {
@@ -335,7 +340,7 @@ namespace Vocaluxe.Base
bool popupVolumeControlAllowed = _CurrentScreen != EScreens.ScreenCredits && _CurrentScreen != EScreens.ScreenOptionsRecord; bool popupVolumeControlAllowed = _CurrentScreen != EScreens.ScreenCredits && _CurrentScreen != EScreens.ScreenOptionsRecord;
//Hide volume control for bg-music if bg-music is disabled //Hide volume control for bg-music if bg-music is disabled
if (popupVolumeControlAllowed && (_CurrentScreen != EScreens.ScreenSong || CSongs.Category == -1) if (popupVolumeControlAllowed && (_CurrentScreen != EScreens.ScreenSong || CSongs.Category == -1)
&& _CurrentScreen != EScreens.ScreenSing && CConfig.BackgroundMusic == EOffOn.TR_CONFIG_OFF) && _CurrentScreen != EScreens.ScreenSing && CConfig.BackgroundMusic == EBackgroundMusicOffOn.TR_CONFIG_OFF)
popupVolumeControlAllowed = false; popupVolumeControlAllowed = false;
@@ -391,13 +396,13 @@ namespace Vocaluxe.Base
if (popupPlayerControlAllowed && keyEvent.Key == Keys.Tab) if (popupPlayerControlAllowed && keyEvent.Key == Keys.Tab)
{ {
if (_CurrentPopupScreen == EPopupScreens.NoPopup && CConfig.BackgroundMusic == EOffOn.TR_CONFIG_ON) if (_CurrentPopupScreen == EPopupScreens.NoPopup && CConfig.BackgroundMusic == EBackgroundMusicOffOn.TR_CONFIG_ON)
ShowPopup(EPopupScreens.PopupPlayerControl); ShowPopup(EPopupScreens.PopupPlayerControl);
else else
HidePopup(EPopupScreens.PopupPlayerControl); HidePopup(EPopupScreens.PopupPlayerControl);
} }
if (popupPlayerControlAllowed && CConfig.BackgroundMusic == EOffOn.TR_CONFIG_ON) if (popupPlayerControlAllowed && CConfig.BackgroundMusic != EBackgroundMusicOffOn.TR_CONFIG_OFF)
{ {
if (keyEvent.Key == Keys.MediaNextTrack) if (keyEvent.Key == Keys.MediaNextTrack)
CBackgroundMusic.Next(); CBackgroundMusic.Next();
@@ -497,7 +502,7 @@ namespace Vocaluxe.Base
bool isOverPopupPlayerControl = CHelper.IsInBounds(_PopupScreens[(int)EPopupScreens.PopupPlayerControl].ScreenArea, mouseEvent); bool isOverPopupPlayerControl = CHelper.IsInBounds(_PopupScreens[(int)EPopupScreens.PopupPlayerControl].ScreenArea, mouseEvent);
if (popupPlayerControlAllowed && isOverPopupPlayerControl) if (popupPlayerControlAllowed && isOverPopupPlayerControl)
{ {
if (_CurrentPopupScreen == EPopupScreens.NoPopup && CConfig.BackgroundMusic == EOffOn.TR_CONFIG_ON) if (_CurrentPopupScreen == EPopupScreens.NoPopup && CConfig.BackgroundMusic == EBackgroundMusicOffOn.TR_CONFIG_ON)
ShowPopup(EPopupScreens.PopupPlayerControl); ShowPopup(EPopupScreens.PopupPlayerControl);
} }
+62 -7
View File
@@ -76,6 +76,11 @@ namespace Vocaluxe.Base
return CConfig.BackgroundMusicVolume; return CConfig.BackgroundMusicVolume;
} }
public EBackgroundMusicOffOn GetBackgroundMusicStatus()
{
return CConfig.BackgroundMusic;
}
public int GetPreviewMusicVolume() public int GetPreviewMusicVolume()
{ {
return CConfig.PreviewMusicVolume; return CConfig.PreviewMusicVolume;
@@ -243,6 +248,11 @@ namespace Vocaluxe.Base
{ {
return CSettings.SlideShowFadeTime; return CSettings.SlideShowFadeTime;
} }
public float GetSoundPlayerFadeTime()
{
return CSettings.SoundPlayerFadeTime;
}
} }
class CBtheme : ITheme class CBtheme : ITheme
@@ -335,11 +345,21 @@ namespace Vocaluxe.Base
return CBackgroundMusic.VideoEnabled; return CBackgroundMusic.VideoEnabled;
} }
public bool IsPlayingPreview()
{
return CBackgroundMusic.IsPlayingPreview;
}
public void SetDisabled(bool disabled) public void SetDisabled(bool disabled)
{ {
CBackgroundMusic.Disabled = disabled; CBackgroundMusic.Disabled = disabled;
} }
public float GetLength()
{
return CBackgroundMusic.Length;
}
public void Next() public void Next()
{ {
CBackgroundMusic.Next(); CBackgroundMusic.Next();
@@ -360,6 +380,26 @@ namespace Vocaluxe.Base
CBackgroundMusic.Play(); 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 void StopPreview()
{
CBackgroundMusic.StopPreview();
}
public CTexture GetVideoTexture() public CTexture GetVideoTexture()
{ {
return CBackgroundMusic.GetVideoTexture(); return CBackgroundMusic.GetVideoTexture();
@@ -430,6 +470,11 @@ namespace Vocaluxe.Base
{ {
return CGraphics.GlobalAlpha; return CGraphics.GlobalAlpha;
} }
public EScreens GetNextScreen()
{
return CGraphics.NextScreen;
}
} }
class CBlog : ILog class CBlog : ILog
@@ -784,6 +829,16 @@ namespace Vocaluxe.Base
{ {
CVideo.SetLoop(streamID, loop); CVideo.SetLoop(streamID, loop);
} }
public void Pause(int streamID)
{
CVideo.Pause(streamID);
}
public void Resume(int streamID)
{
CVideo.Resume(streamID);
}
} }
class CBsound : ISound class CBsound : ISound
@@ -803,9 +858,14 @@ namespace Vocaluxe.Base
CSound.Play(soundStream); CSound.Play(soundStream);
} }
public void Fade(int soundStream, float targetVolume, float duration) public void Fade(int soundStream, float targetVolume, float duration, EStreamAction afterFadeAction = EStreamAction.Nothing)
{ {
CSound.Fade(soundStream, targetVolume, duration); CSound.Fade(soundStream, targetVolume, duration, afterFadeAction);
}
public void Close(int soundStream)
{
CSound.Close(soundStream);
} }
public bool IsFinished(int soundStream) public bool IsFinished(int soundStream)
@@ -823,11 +883,6 @@ namespace Vocaluxe.Base
return CSound.GetLength(soundStream); return CSound.GetLength(soundStream);
} }
public void FadeAndClose(int soundStream, float targetVolume, float duration)
{
CSound.FadeAndClose(soundStream, targetVolume, duration);
}
public void SetStreamVolume(int soundStream, float volume) public void SetStreamVolume(int soundStream, float volume)
{ {
CSound.SetStreamVolume(soundStream, volume); CSound.SetStreamVolume(soundStream, volume);
+2
View File
@@ -151,6 +151,8 @@ namespace Vocaluxe.Base
public const float BackgroundMusicFadeTime = 0.5f; public const float BackgroundMusicFadeTime = 0.5f;
public const float PauseResetTime = 1f; public const float PauseResetTime = 1f;
public const float SoundPlayerFadeTime = 0.5f;
public const float SlideShowImageTime = 3500f; public const float SlideShowImageTime = 3500f;
public const float SlideShowFadeTime = 500f; public const float SlideShowFadeTime = 500f;
@@ -16,6 +16,7 @@
#endregion #endregion
using System; using System;
using VocaluxeLib;
namespace Vocaluxe.Lib.Sound.Playback namespace Vocaluxe.Lib.Sound.Playback
{ {
+2 -7
View File
@@ -15,15 +15,10 @@
// along with Vocaluxe. If not, see <http://www.gnu.org/licenses/>. // along with Vocaluxe. If not, see <http://www.gnu.org/licenses/>.
#endregion #endregion
using VocaluxeLib;
namespace Vocaluxe.Lib.Sound.Playback namespace Vocaluxe.Lib.Sound.Playback
{ {
public enum EStreamAction
{
Nothing,
Pause,
Stop,
Close
}
interface IPlayback interface IPlayback
{ {
+13 -2
View File
@@ -115,7 +115,7 @@ namespace Vocaluxe.Screens
if (_Buttons[_ButtonPrevious].Selected) if (_Buttons[_ButtonPrevious].Selected)
CBackgroundMusic.Previous(); CBackgroundMusic.Previous();
if (_Buttons[_ButtonPlay].Selected) if (_Buttons[_ButtonPlay].Selected)
CBackgroundMusic.Play(); CBackgroundMusic.Pause();
if (_Buttons[_ButtonPause].Selected) if (_Buttons[_ButtonPause].Selected)
CBackgroundMusic.Pause(); CBackgroundMusic.Pause();
if (_Buttons[_ButtonRepeat].Selected) if (_Buttons[_ButtonRepeat].Selected)
@@ -143,7 +143,7 @@ namespace Vocaluxe.Screens
if (_Buttons[_ButtonPrevious].Selected) if (_Buttons[_ButtonPrevious].Selected)
CBackgroundMusic.Previous(); CBackgroundMusic.Previous();
if (_Buttons[_ButtonPlay].Selected) if (_Buttons[_ButtonPlay].Selected)
CBackgroundMusic.Play(); CBackgroundMusic.Pause();
if (_Buttons[_ButtonPause].Selected) if (_Buttons[_ButtonPause].Selected)
CBackgroundMusic.Pause(); CBackgroundMusic.Pause();
if (_Buttons[_ButtonRepeat].Selected) if (_Buttons[_ButtonRepeat].Selected)
@@ -168,6 +168,17 @@ namespace Vocaluxe.Screens
return true; return true;
} }
public override void OnShow()
{
base.OnShow();
_Buttons[_ButtonNext].Visible = !CBackgroundMusic.IsPlayingPreview;
_Buttons[_ButtonPause].Visible = !CBackgroundMusic.IsPlayingPreview;
_Buttons[_ButtonPlay].Visible = !CBackgroundMusic.IsPlayingPreview;
_Buttons[_ButtonPrevious].Visible = !CBackgroundMusic.IsPlayingPreview;
_Buttons[_ButtonRepeat].Visible = !CBackgroundMusic.IsPlayingPreview;
_Buttons[_ButtonSing].Visible = !CBackgroundMusic.IsPlayingPreview;
}
public override bool UpdateGame() public override bool UpdateGame()
{ {
_Statics[_StaticCover].Visible = !_VideoPreviewInt || !CBackgroundMusic.SongHasVideo; _Statics[_StaticCover].Visible = !_VideoPreviewInt || !CBackgroundMusic.SongHasVideo;
+3
View File
@@ -152,6 +152,9 @@ namespace Vocaluxe.Screens
{ {
CBackgroundMusic.OwnSongsAvailable = true; CBackgroundMusic.OwnSongsAvailable = true;
if (CConfig.VideoBackgrounds == EOffOn.TR_CONFIG_ON || CConfig.VideosToBackground == EOffOn.TR_CONFIG_ON)
CBackgroundMusic.VideoEnabled = true;
CBackgroundMusic.Play(); CBackgroundMusic.Play();
} }
+3 -3
View File
@@ -52,7 +52,7 @@ namespace Vocaluxe.Screens
public override void LoadTheme(string xmlPath) public override void LoadTheme(string xmlPath)
{ {
base.LoadTheme(xmlPath); base.LoadTheme(xmlPath);
_SelectSlides[_SelectSlideBackgroundMusic].SetValues<EOffOn>((int)CConfig.BackgroundMusic); _SelectSlides[_SelectSlideBackgroundMusic].SetValues<EBackgroundMusicOffOn>((int)CConfig.BackgroundMusic);
_SelectSlides[_SelectSlideBackgroundMusicVolume].AddValues(new string[] _SelectSlides[_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"}); {"0", "5", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55", "60", "65", "70", "75", "80", "85", "90", "95", "100"});
_SelectSlides[_SelectSlideBackgroundMusicVolume].Selection = CConfig.BackgroundMusicVolume / 5; _SelectSlides[_SelectSlideBackgroundMusicVolume].Selection = CConfig.BackgroundMusicVolume / 5;
@@ -150,14 +150,14 @@ namespace Vocaluxe.Screens
{ {
CConfig.GameMusicVolume = _SelectSlides[_SelectSlideGameMusicVolume].Selection * 5; CConfig.GameMusicVolume = _SelectSlides[_SelectSlideGameMusicVolume].Selection * 5;
CConfig.PreviewMusicVolume = _SelectSlides[_SelectSlidePreviewMusicVolume].Selection * 5; CConfig.PreviewMusicVolume = _SelectSlides[_SelectSlidePreviewMusicVolume].Selection * 5;
CConfig.BackgroundMusic = (EOffOn)_SelectSlides[_SelectSlideBackgroundMusic].Selection; CConfig.BackgroundMusic = (EBackgroundMusicOffOn)_SelectSlides[_SelectSlideBackgroundMusic].Selection;
CConfig.BackgroundMusicSource = (EBackgroundMusicSource)_SelectSlides[_SelectSlideBackgroundMusicSource].Selection; CConfig.BackgroundMusicSource = (EBackgroundMusicSource)_SelectSlides[_SelectSlideBackgroundMusicSource].Selection;
CConfig.BackgroundMusicVolume = _SelectSlides[_SelectSlideBackgroundMusicVolume].Selection * 5; CConfig.BackgroundMusicVolume = _SelectSlides[_SelectSlideBackgroundMusicVolume].Selection * 5;
CConfig.SaveConfig(); CConfig.SaveConfig();
CBackgroundMusic.SetMusicSource(CConfig.BackgroundMusicSource); CBackgroundMusic.SetMusicSource(CConfig.BackgroundMusicSource);
CSound.SetGlobalVolume(CConfig.BackgroundMusicVolume); CSound.SetGlobalVolume(CConfig.BackgroundMusicVolume);
if (CConfig.BackgroundMusic == EOffOn.TR_CONFIG_ON) if (CConfig.BackgroundMusic == EBackgroundMusicOffOn.TR_CONFIG_ON)
CBackgroundMusic.Play(); CBackgroundMusic.Play();
else else
CBackgroundMusic.Pause(); CBackgroundMusic.Pause();
+2
View File
@@ -123,6 +123,8 @@ namespace Vocaluxe.Screens
public override void OnShow() public override void OnShow()
{ {
CBackgroundMusic.Disabled = false;
base.OnShow(); base.OnShow();
//-1 --> Show average //-1 --> Show average
_Round = CGame.NumRounds > 1 ? -1 : 0; _Round = CGame.NumRounds > 1 ? -1 : 0;
+2 -2
View File
@@ -537,8 +537,6 @@ namespace Vocaluxe.Screens
_CloseSong(); _CloseSong();
if (_Webcam) if (_Webcam)
CWebcam.Stop(); CWebcam.Stop();
CBackgroundMusic.Disabled = false;
CSound.SetGlobalVolume(CConfig.BackgroundMusicVolume);
} }
private void _CloseSong() private void _CloseSong()
@@ -569,6 +567,8 @@ namespace Vocaluxe.Screens
_Texts[_TextSongName].Text = String.Empty; _Texts[_TextSongName].Text = String.Empty;
_Texts[_TextDuetName1].Text = String.Empty; _Texts[_TextDuetName1].Text = String.Empty;
_Texts[_TextDuetName2].Text = String.Empty; _Texts[_TextDuetName2].Text = String.Empty;
_Texts[_TextMedleyCountdown].Visible = false;
_Texts[_TextMedleyCountdown].Text = String.Empty;
} }
private void _LoadNextSong() private void _LoadNextSong()
+7 -7
View File
@@ -662,11 +662,6 @@ namespace Vocaluxe.Screens
_Texts[_TextCategory].Text = CSongs.GetCurrentCategoryName(); _Texts[_TextCategory].Text = CSongs.GetCurrentCategoryName();
if (CSongs.IsInCategory || CConfig.Tabs == EOffOn.TR_CONFIG_OFF)
CBackgroundMusic.Disabled = true;
else
CBackgroundMusic.Disabled = false;
string selectionText = ""; string selectionText = "";
if (CSongs.IsInCategory) if (CSongs.IsInCategory)
{ {
@@ -716,9 +711,14 @@ namespace Vocaluxe.Screens
public override void OnClose() public override void OnClose()
{ {
base.OnClose(); base.OnClose();
CBackgroundMusic.Disabled = false;
CSound.SetGlobalVolume(CConfig.BackgroundMusicVolume);
_SongMenu.OnHide(); _SongMenu.OnHide();
if (CGraphics.NextScreen != EScreens.ScreenNames)
{
CBackgroundMusic.Disabled = false;
CSound.SetGlobalVolume(CConfig.BackgroundMusicVolume);
}
} }
private void _HandlePartySongSelection(int songNr) private void _HandlePartySongSelection(int songNr)
+15
View File
@@ -248,6 +248,13 @@ namespace VocaluxeLib
// ReSharper restore InconsistentNaming // ReSharper restore InconsistentNaming
} }
public enum EBackgroundMusicOffOn
{
TR_CONFIG_OFF,
TR_CONFIG_ONLY_SONG,
TR_CONFIG_ON
}
public enum EPlayerInfo public enum EPlayerInfo
{ {
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
@@ -288,6 +295,14 @@ namespace VocaluxeLib
} }
#endregion Config #endregion Config
public enum EStreamAction
{
Nothing,
Pause,
Stop,
Close
}
public enum EProgramState public enum EProgramState
{ {
Start, Start,
+31 -2
View File
@@ -35,6 +35,8 @@ namespace VocaluxeLib
void SetBackgroundMusicVolume(int newVolume); void SetBackgroundMusicVolume(int newVolume);
int GetBackgroundMusicVolume(); int GetBackgroundMusicVolume();
EBackgroundMusicOffOn GetBackgroundMusicStatus();
int GetPreviewMusicVolume(); int GetPreviewMusicVolume();
EOffOn GetVideosToBackground(); EOffOn GetVideosToBackground();
@@ -89,6 +91,8 @@ namespace VocaluxeLib
float GetSlideShowImageTime(); float GetSlideShowImageTime();
float GetSlideShowFadeTime(); float GetSlideShowFadeTime();
float GetSoundPlayerFadeTime();
} }
public interface ITheme public interface ITheme
@@ -115,16 +119,24 @@ namespace VocaluxeLib
{ {
bool IsDisabled(); bool IsDisabled();
bool IsPlaying(); bool IsPlaying();
bool IsPlayingPreview();
bool SongHasVideo(); bool SongHasVideo();
bool VideoEnabled(); bool VideoEnabled();
float GetLength();
void SetDisabled(bool disabled); void SetDisabled(bool disabled);
void Next(); void Next();
void Previous(); void Previous();
void Pause(); void Pause();
void Play(); void Play();
void Stop();
CTexture GetVideoTexture(); CTexture GetVideoTexture();
void LoadPreview(CSong song, float start = 0f);
void PlayPreview(float start = -1f);
void StopPreview();
} }
public interface IDrawing public interface IDrawing
@@ -148,6 +160,8 @@ namespace VocaluxeLib
void FadeTo(EScreens nextScreen); void FadeTo(EScreens nextScreen);
float GetGlobalAlpha(); float GetGlobalAlpha();
EScreens GetNextScreen();
} }
public interface ILog public interface ILog
@@ -255,6 +269,8 @@ namespace VocaluxeLib
bool IsFinished(int streamID); bool IsFinished(int streamID);
bool Close(int streamID); bool Close(int streamID);
void SetLoop(int streamID, bool loop = true); void SetLoop(int streamID, bool loop = true);
void Resume(int streamID);
void Pause(int streamID);
} }
public interface ISound public interface ISound
@@ -262,12 +278,12 @@ namespace VocaluxeLib
int Load(string soundFile, bool loop = false, bool prescan = false); int Load(string soundFile, bool loop = false, bool prescan = false);
void SetPosition(int soundStream, float newPosition); void SetPosition(int soundStream, float newPosition);
void Play(int soundStream); void Play(int soundStream);
void Fade(int soundStream, float targetVolume, float duration); void Fade(int soundStream, float targetVolume, float duration, EStreamAction afterFadeAction = EStreamAction.Nothing);
void Close(int soundStream);
bool IsFinished(int soundStream); bool IsFinished(int soundStream);
float GetPosition(int soundStream); float GetPosition(int soundStream);
float GetLength(int soundStream); float GetLength(int soundStream);
void FadeAndClose(int soundStream, float targetVolume, float duration);
void SetStreamVolume(int soundStream, float volume); void SetStreamVolume(int soundStream, float volume);
} }
@@ -311,4 +327,17 @@ namespace VocaluxeLib
int GetSongCount(int playlistID); int GetSongCount(int playlistID);
CPlaylistSong GetSong(int playlistID, int songIndex); CPlaylistSong GetSong(int playlistID, int songIndex);
} }
public interface IPreviewPlayer
{
void Play(float start = -1);
void Load(CSong song, float start = 0f);
void Stop();
void TogglePause();
CTexture GetCover();
CTexture GetVideoTexture();
bool IsPlaying();
float GetLength();
}
} }
+1 -1
View File
@@ -194,7 +194,7 @@ namespace VocaluxeLib.Menu
if (!String.IsNullOrEmpty(_Theme.TextureName) && if (!String.IsNullOrEmpty(_Theme.TextureName) &&
(_Theme.Type == EBackgroundTypes.Texture || (_Theme.Type == EBackgroundTypes.Texture ||
(_Theme.Type == EBackgroundTypes.Video && (CBase.Config.GetVideoBackgrounds() == EOffOn.TR_CONFIG_OFF || !ok)))) (_Theme.Type == EBackgroundTypes.Video && CBase.Config.GetVideoBackgrounds() == EOffOn.TR_CONFIG_OFF)))
ok = _DrawTexture(); ok = _DrawTexture();
if (_Theme.Type == EBackgroundTypes.Color || _Theme.Type == EBackgroundTypes.Texture && !ok || if (_Theme.Type == EBackgroundTypes.Color || _Theme.Type == EBackgroundTypes.Texture && !ok ||
+17 -74
View File
@@ -115,18 +115,15 @@ namespace VocaluxeLib.Menu.SongMenu
_PlaySong(value); _PlaySong(value);
} }
else if (value >= CBase.Songs.GetNumCategories()) else if (value >= CBase.Songs.GetNumCategories())
{
value = -1; value = -1;
CBase.BackgroundMusic.Stop();
}
_PreviewNrInternal = value; _PreviewNrInternal = value;
} }
} }
protected int _PreviewSongStream { get; private set; }
protected int _PreviewVideoStream { get; private set; }
private CFading _VideoFading;
protected CTexture _Vidtex;
private SColorF _ColorInternal; private SColorF _ColorInternal;
protected SColorF _Color protected SColorF _Color
{ {
@@ -160,8 +157,6 @@ namespace VocaluxeLib.Menu.SongMenu
{ {
Visible = true; Visible = true;
_PartyModeID = partyModeID; _PartyModeID = partyModeID;
_PreviewVideoStream = -1;
_PreviewSongStream = -1;
_Theme = new SThemeSongMenu _Theme = new SThemeSongMenu
{ {
SongMenuTileBoard = SongMenuTileBoard =
@@ -346,7 +341,7 @@ namespace VocaluxeLib.Menu.SongMenu
public virtual void Init() public virtual void Init()
{ {
_ResetPreview(); _ResetPreview(false);
_Initialized = true; _Initialized = true;
} }
@@ -354,40 +349,14 @@ namespace VocaluxeLib.Menu.SongMenu
{ {
if (!_Initialized) if (!_Initialized)
return; return;
if (_PreviewSongStream == -1 || _PreviewVideoStream == -1)
return;
if (CBase.Video.IsFinished(_PreviewVideoStream) || CBase.Sound.IsFinished(_PreviewSongStream))
{
CBase.Video.Close(_PreviewVideoStream);
_PreviewVideoStream = -1;
return;
}
float time = CBase.Sound.GetPosition(_PreviewSongStream);
float vtime;
if (CBase.Video.GetFrame(_PreviewVideoStream, ref _Vidtex, time, out vtime))
{
if (_Vidtex != null)
{
if (_VideoFading != null)
{
bool finished;
_Vidtex.Color.A = _VideoFading.GetValue(out finished);
if (finished)
_VideoFading = null;
}
}
}
} }
public virtual void OnShow() {} public virtual void OnShow() {}
public virtual void OnHide() public virtual void OnHide()
{ {
_ResetPreview(); if(CBase.Graphics.GetNextScreen() != EScreens.ScreenNames)
_ResetPreview();
} }
public abstract bool HandleInput(ref SKeyEvent keyEvent, SScreenSongOptions options); public abstract bool HandleInput(ref SKeyEvent keyEvent, SScreenSongOptions options);
@@ -399,8 +368,8 @@ namespace VocaluxeLib.Menu.SongMenu
if (!_Initialized || !Visible) if (!_Initialized || !Visible)
return; return;
if (_PreviewVideoStream != -1) if (CBase.BackgroundMusic.IsPlaying())
CBase.Drawing.DrawTexture(_Vidtex, new SRectF(0, 0, 1280, 720, 0)); CBase.Drawing.DrawTexture(CBase.BackgroundMusic.GetVideoTexture(), new SRectF(0, 0, 1280, 720, 0));
} }
public bool IsMouseOverSelectedSong(SMouseEvent mEvent) public bool IsMouseOverSelectedSong(SMouseEvent mEvent)
@@ -486,7 +455,7 @@ namespace VocaluxeLib.Menu.SongMenu
if (categoryNr >= CBase.Songs.GetNumCategories()) if (categoryNr >= CBase.Songs.GetNumCategories())
return; return;
_ResetPreview(); _ResetPreview(false);
CBase.Songs.SetCategory(categoryNr); CBase.Songs.SetCategory(categoryNr);
} }
@@ -504,50 +473,24 @@ namespace VocaluxeLib.Menu.SongMenu
private void _PlaySong(int nr) private void _PlaySong(int nr)
{ {
_ResetPreview(); _PreviewNrInternal = -1;
CSong song = CBase.Songs.GetVisibleSong(nr); CSong song = CBase.Songs.GetVisibleSong(nr);
if (song == null) if (song == null)
return; return;
//TODO: Using prescan here causes Vocaluxe to hang a bit on loading the song but we need the length below CBase.BackgroundMusic.LoadPreview(song);
_PreviewSongStream = CBase.Sound.Load(Path.Combine(song.Folder, song.MP3FileName), true, true);
float startposition = song.Preview.StartTime;
float length = CBase.Sound.GetLength(_PreviewSongStream);
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.Sound.SetPosition(_PreviewSongStream, startposition);
CBase.Sound.Play(_PreviewSongStream);
CBase.Sound.SetStreamVolume(_PreviewSongStream, 0f);
CBase.Sound.Fade(_PreviewSongStream, 100f, 3f);
if (song.VideoFileName != "" && CBase.Config.GetVideoPreview() == EOffOn.TR_CONFIG_ON)
{
_PreviewVideoStream = CBase.Video.Load(Path.Combine(song.Folder, song.VideoFileName));
if (_PreviewVideoStream == -1)
return;
CBase.Video.SetLoop(_PreviewVideoStream);
CBase.Video.Skip(_PreviewVideoStream, startposition, song.VideoGap);
_VideoFading = new CFading(0f, 1f, 3f);
}
} }
protected void _ResetPreview() protected void _ResetPreview(bool playBGagain = true)
{ {
if (_PreviewSongStream >= 0) if (_PreviewNrInternal == -1)
CBase.Sound.FadeAndClose(_PreviewSongStream, 0f, 0.75f); return;
_PreviewSongStream = -1; CBase.BackgroundMusic.StopPreview();
CBase.Video.Close(_PreviewVideoStream); if (playBGagain)
_PreviewVideoStream = -1; CBase.BackgroundMusic.Play();
CBase.Drawing.RemoveTexture(ref _Vidtex);
//Make sure we don't have a preview here otherwise a change won't be recognized //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 //(e.g. leave a category with one song and set preview to 0 --> previewOld=previewNew=0 --> No change --> Old data shown
@@ -110,7 +110,11 @@ namespace VocaluxeLib.Menu.SongMenu
set set
{ {
if (value == base._PreviewNr) if (value == base._PreviewNr)
{
if (!CBase.BackgroundMusic.IsPlaying() && value != -1)
CBase.BackgroundMusic.PlayPreview();
return; return;
}
base._PreviewNr = value; base._PreviewNr = value;
_UpdatePreview(); _UpdatePreview();
} }
@@ -179,7 +183,7 @@ namespace VocaluxeLib.Menu.SongMenu
if (songOptions.Selection.RandomOnly) if (songOptions.Selection.RandomOnly)
_PreviewNr = _SelectionNr; _PreviewNr = _SelectionNr;
if (_Length < 0 && CBase.Songs.IsInCategory() && CBase.Sound.GetLength(_PreviewSongStream) > 0) if (_Length < 0 && CBase.Songs.IsInCategory() && CBase.BackgroundMusic.GetLength() > 0)
_UpdateLength(CBase.Songs.GetVisibleSong(_PreviewNr)); _UpdateLength(CBase.Songs.GetVisibleSong(_PreviewNr));
} }
@@ -244,7 +248,7 @@ namespace VocaluxeLib.Menu.SongMenu
{ {
if (song == null) if (song == null)
return; return;
float time = CBase.Sound.GetLength(_PreviewSongStream); float time = CBase.BackgroundMusic.GetLength();
if (Math.Abs(song.Finish) > 0.001) if (Math.Abs(song.Finish) > 0.001)
time = song.Finish; time = song.Finish;
@@ -463,18 +467,20 @@ namespace VocaluxeLib.Menu.SongMenu
_TextBG.Draw(); _TextBG.Draw();
if (_Vidtex != null && _PreviewVideoStream != -1) CTexture vidtex = CBase.BackgroundMusic.IsPlayingPreview() ? CBase.BackgroundMusic.GetVideoTexture() : null;
if (vidtex != null)
{ {
if (_Vidtex.Color.A < 1) if (vidtex.Color.A < 1)
_CoverBig.Draw(EAspect.Crop); _CoverBig.Draw(EAspect.Crop);
var bounds = new RectangleF(_CoverBig.Rect.X, _CoverBig.Rect.Y, _CoverBig.Rect.W, _CoverBig.Rect.H); var bounds = new RectangleF(_CoverBig.Rect.X, _CoverBig.Rect.Y, _CoverBig.Rect.W, _CoverBig.Rect.H);
RectangleF rect; RectangleF rect;
CHelper.SetRect(bounds, out rect, _Vidtex.OrigAspect, EAspect.Crop); CHelper.SetRect(bounds, out rect, vidtex.OrigAspect, EAspect.Crop);
var vidRect = new SRectF(rect.X, rect.Y, rect.Width, rect.Height, _CoverBig.Rect.Z); var vidRect = new SRectF(rect.X, rect.Y, rect.Width, rect.Height, _CoverBig.Rect.Z);
var vidRectBounds = new SRectF(bounds.X, bounds.Y, bounds.Width, bounds.Height, 0f); var vidRectBounds = new SRectF(bounds.X, bounds.Y, bounds.Width, bounds.Height, 0f);
CBase.Drawing.DrawTexture(_Vidtex, vidRect, _Vidtex.Color, vidRectBounds); CBase.Drawing.DrawTexture(vidtex, vidRect, vidtex.Color, vidRectBounds);
CBase.Drawing.DrawTextureReflection(_Vidtex, vidRect, _Vidtex.Color, vidRectBounds, _CoverBig.ReflectionSpace, _CoverBig.ReflectionHeight); CBase.Drawing.DrawTextureReflection(vidtex, vidRect, vidtex.Color, vidRectBounds, _CoverBig.ReflectionSpace, _CoverBig.ReflectionHeight);
} }
else else
_CoverBig.Draw(EAspect.Crop); _CoverBig.Draw(EAspect.Crop);
+3
View File
@@ -458,7 +458,10 @@ namespace VocaluxeLib.Songs
if (Preview.Source == EDataSource.None) if (Preview.Source == EDataSource.None)
{ {
if (Medley.Source != EDataSource.None) if (Medley.Source != EDataSource.None)
{
Preview.StartTime = CBase.Game.GetTimeFromBeats(Medley.StartBeat, BPM); Preview.StartTime = CBase.Game.GetTimeFromBeats(Medley.StartBeat, BPM);
Preview.Source = EDataSource.Calculated;
}
} }
} }
+1
View File
@@ -416,6 +416,7 @@ namespace VocaluxeLib.Songs
{ {
//PreviewStart is not set or <=0 //PreviewStart is not set or <=0
_Song.Preview.StartTime = (headerFlags & EHeaderFlags.MedleyStartBeat) != 0 ? CBase.Game.GetTimeFromBeats(_Song.Medley.StartBeat, _Song.BPM) : 0f; _Song.Preview.StartTime = (headerFlags & EHeaderFlags.MedleyStartBeat) != 0 ? CBase.Game.GetTimeFromBeats(_Song.Medley.StartBeat, _Song.BPM) : 0f;
_Song.Preview.Source = _Song.Preview.StartTime == 0 ? EDataSource.None : EDataSource.Calculated;
} }
if ((headerFlags & EHeaderFlags.MedleyStartBeat) != 0 && (headerFlags & EHeaderFlags.MedleyEndBeat) != 0) if ((headerFlags & EHeaderFlags.MedleyStartBeat) != 0 && (headerFlags & EHeaderFlags.MedleyEndBeat) != 0)
+185
View File
@@ -0,0 +1,185 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using VocaluxeLib.Draw;
using VocaluxeLib.Songs;
namespace VocaluxeLib.Utils.Player
{
public class CSongPlayer : CSoundPlayer
{
private CSong _Song;
private bool _VideoEnabled;
private int _Video = -1;
private CTexture _CurrentVideoTexture;
private CFading _VideoFading;
public bool VideoEnabled
{
get { return _VideoEnabled; }
set
{
if (_VideoEnabled == value)
return;
_VideoEnabled = value;
if (_VideoEnabled)
_LoadVideo();
else if (_Video != -1)
{
CBase.Video.Close(_Video);
CBase.Drawing.RemoveTexture(ref _CurrentVideoTexture);
_Video = -1;
}
}
}
public int SongID
{
get { return _Song == null ? -1 : _Song.ID; }
}
public bool SongHasVideo
{
get { return _Song != null && File.Exists(Path.Combine(_Song.Folder,_Song.VideoFileName)); }
}
public string ArtistAndTitle
{
get
{
if (_Song == null)
return "";
if (_Song.Artist != "" && _Song.Title != "")
return _Song.Artist + " - " + _Song.Title;
return Path.GetFileNameWithoutExtension(_Song.MP3FileName);
}
}
public CTexture Cover
{
get { return _Song == null ? CBase.Cover.GetNoCover() : _Song.CoverTextureBig; }
}
public bool SongLoaded
{
get { return _StreamID != -1; }
}
public CSongPlayer(bool loop = false) : base(loop) { }
public CSongPlayer(CSong song, bool loop = false, float position = 0f, bool autoplay = false)
: base(Path.Combine(song.Folder,song.MP3FileName), loop, position, autoplay)
{
_Song = song;
_LoadVideo();
}
public CSongPlayer(string file, bool loop = false, float position = 0f, bool autoplay = false)
: base(file, loop, position, autoplay)
{
_Song = null;
}
public CTexture GetVideoTexture()
{
if (_Video == -1 || _Song == null)
return null;
float vtime;
if (CBase.Video.GetFrame(_Video, ref _CurrentVideoTexture, CBase.Sound.GetPosition(_StreamID), out vtime))
{
if (_VideoFading != null)
{
bool finished;
_CurrentVideoTexture.Color.A = _VideoFading.GetValue(out finished);
if (finished)
_VideoFading = null;
}
return _CurrentVideoTexture;
}
return null;
}
public void Load(CSong song, float position = 0f, bool autoplay = false)
{
if (song == null)
return;
Stop();
_Song = song;
base.Load(Path.Combine(song.Folder, song.MP3FileName), position, false);
_LoadVideo();
if (autoplay)
Play();
}
public void LoadFile(string file, float position = 0f, bool autoplay = false)
{
if (String.IsNullOrEmpty(file))
return;
Stop();
base.Load(file, position, autoplay);
}
public new void Play()
{
CBase.Sound.SetPosition(_StreamID, _StartPosition);
CBase.Video.Skip(_Video, _StartPosition, _Song.VideoGap);
TogglePause();
}
public new void Stop()
{
base.Stop();
_Song = null;
if (_Video != -1)
{
CBase.Video.Close(_Video);
CBase.Drawing.RemoveTexture(ref _CurrentVideoTexture);
_Video = -1;
}
}
public new void TogglePause()
{
if (IsPlaying && _Video != -1)
{
CBase.Video.Pause(_Video);
CBase.Video.Skip(_Video, CBase.Sound.GetPosition(_StreamID) + _FadeTime, _Song.VideoGap);
}
else if(_Video != -1)
{
CBase.Video.Resume(_Video);
}
base.TogglePause();
}
private void _LoadVideo()
{
if (_Song == null)
return;
string videoFilePath = Path.Combine(_Song.Folder, _Song.VideoFileName);
if (_Video != -1 || String.IsNullOrEmpty(videoFilePath))
return;
_Video = CBase.Video.Load(videoFilePath);
CBase.Video.Skip(_Video, 0f, _Song.VideoGap); //Use gap, otherwhise we will overwrite position in GetVideoTexture
_VideoFading = new CFading(0f, 1f, 3f);
if (IsPlaying)
{
CBase.Video.Skip(_Video, Position, _Song.VideoGap);
CBase.Video.Resume(_Video);
}
}
}
}
+153
View File
@@ -0,0 +1,153 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace VocaluxeLib.Utils.Player
{
public class CSoundPlayer
{
protected int _StreamID = -1;
protected float _Volume;
protected float _StartPosition;
protected float _FadeTime = CBase.Settings.GetSoundPlayerFadeTime();
public float Volume
{
set
{
_Volume = value;
_ApplyVolume();
}
get { return _Volume; }
}
public bool Loop;
public float Position
{
set {
if(_StreamID == -1)
return;
_StartPosition = value;
}
get {
if(_StreamID == -1)
return -1;
return CBase.Sound.GetPosition(_StreamID);
}
}
public float Length
{
get
{
if (_StreamID == -1)
return 0;
return CBase.Sound.GetLength(_StreamID);
}
}
public bool RepeatSong;
public bool IsPlaying { get; protected set; }
public bool IsFinished { get { return RepeatSong ? false : CBase.Sound.IsFinished(_StreamID); } }
public CSoundPlayer(bool loop = false)
{
Loop = loop;
}
public CSoundPlayer(string file, bool loop = false, float position = 0f, bool autoplay = false)
{
_StreamID = CBase.Sound.Load(file, false, true);
if(position > 0f)
Position = position;
Loop = loop;
if (autoplay)
Play();
}
public void Load(string file, float position = 0f, bool autoplay = false)
{
if (IsPlaying)
Stop();
_StreamID = CBase.Sound.Load(file, false, true);
if (position > 0f)
Position = position;
if (autoplay)
Play();
}
public void Play()
{
if (_StreamID == -1 || IsPlaying)
return;
CBase.Sound.SetPosition(_StreamID, _StartPosition);
CBase.Sound.SetStreamVolume(_StreamID, 0f);
CBase.Sound.Fade(_StreamID, Volume, _FadeTime);
CBase.Sound.Play(_StreamID);
IsPlaying = true;
}
public void TogglePause()
{
if (_StreamID == -1)
return;
if(IsPlaying)
CBase.Sound.Fade(_StreamID, 0f, _FadeTime, EStreamAction.Pause);
else
{
CBase.Sound.Fade(_StreamID, Volume, _FadeTime);
CBase.Sound.Play(_StreamID);
}
IsPlaying = !IsPlaying;
}
public void Stop()
{
if (_StreamID == -1 || !IsPlaying)
return;
CBase.Sound.Fade(_StreamID, 0f, _FadeTime, EStreamAction.Close);
_StreamID = -1;
IsPlaying = false;
}
public void Update()
{
if (_StreamID == -1 || !IsPlaying)
return;
float timeToPlay;
float len = CBase.Sound.GetLength(_StreamID);
timeToPlay = (len > 0f) ? len - CBase.Sound.GetPosition(_StreamID) : _FadeTime + 1f;
bool finished = CBase.Sound.IsFinished(_StreamID);
if (timeToPlay <= _FadeTime || finished)
{
if (RepeatSong)
{
//Set to false for restarting
IsPlaying = false;
Play();
}
else
Stop();
}
}
private void _ApplyVolume()
{
if (_StreamID == -1)
return;
CBase.Sound.SetStreamVolume(_StreamID, Volume);
}
}
}
+2
View File
@@ -135,6 +135,8 @@
<Compile Include="PartyModes\IPartyMode.cs" /> <Compile Include="PartyModes\IPartyMode.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Utils\CWavFile.cs" /> <Compile Include="Utils\CWavFile.cs" />
<Compile Include="Utils\Player\CSongPlayer.cs" />
<Compile Include="Utils\Player\CSoundPlayer.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>