Added sound- and song-player to VocaluxeLib. Use it for Background-Music.
This commit is contained in:
1 parent
b2aefe8854
commit
3612b9244b
12 files changed
+423
-169
No files matched your search
@@ -288,6 +288,14 @@ namespace VocaluxeLib
|
||||
}
|
||||
#endregion Config
|
||||
|
||||
public enum EStreamAction
|
||||
{
|
||||
Nothing,
|
||||
Pause,
|
||||
Stop,
|
||||
Close
|
||||
}
|
||||
|
||||
public enum EProgramState
|
||||
{
|
||||
Start,
|
||||
|
||||
@@ -89,6 +89,8 @@ namespace VocaluxeLib
|
||||
|
||||
float GetSlideShowImageTime();
|
||||
float GetSlideShowFadeTime();
|
||||
|
||||
float GetSoundPlayerFadeTime();
|
||||
}
|
||||
|
||||
public interface ITheme
|
||||
@@ -253,6 +255,8 @@ namespace VocaluxeLib
|
||||
bool IsFinished(int streamID);
|
||||
bool Close(int streamID);
|
||||
void SetLoop(int streamID, bool loop = true);
|
||||
void Resume(int streamID);
|
||||
void Pause(int streamID);
|
||||
}
|
||||
|
||||
public interface ISound
|
||||
@@ -260,12 +264,12 @@ namespace VocaluxeLib
|
||||
int Load(string soundFile, bool loop = false, bool prescan = false);
|
||||
void SetPosition(int soundStream, float newPosition);
|
||||
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);
|
||||
float GetPosition(int soundStream);
|
||||
float GetLength(int soundStream);
|
||||
void FadeAndClose(int soundStream, float targetVolume, float duration);
|
||||
|
||||
void SetStreamVolume(int soundStream, float volume);
|
||||
}
|
||||
|
||||
@@ -561,7 +561,7 @@ namespace VocaluxeLib.Menu.SongMenu
|
||||
protected void _Reset()
|
||||
{
|
||||
foreach (int stream in _Streams)
|
||||
CBase.Sound.FadeAndClose(stream, 0f, 0.75f);
|
||||
CBase.Sound.Fade(stream, 0f, 0.75f, EStreamAction.Close);
|
||||
_Streams.Clear();
|
||||
|
||||
CBase.Video.Close(_PreviewVideoStream);
|
||||
|
||||
@@ -0,0 +1,182 @@
|
||||
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 bool CanSing { get; private set; }
|
||||
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 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;
|
||||
|
||||
_Song = song;
|
||||
_LoadVideo();
|
||||
base.Load(Path.Combine(song.Folder, song.MP3FileName), position, autoplay);
|
||||
}
|
||||
|
||||
public new void Close()
|
||||
{
|
||||
base.Close();
|
||||
|
||||
if (_Video != -1)
|
||||
{
|
||||
CBase.Video.Close(_Video);
|
||||
CBase.Drawing.RemoveTexture(ref _CurrentVideoTexture);
|
||||
_Video = -1;
|
||||
}
|
||||
}
|
||||
|
||||
public new void Play()
|
||||
{
|
||||
base.Play();
|
||||
|
||||
if (_VideoEnabled && _Video != -1)
|
||||
CBase.Video.Resume(_Video);
|
||||
}
|
||||
|
||||
public new void Stop()
|
||||
{
|
||||
base.Stop();
|
||||
|
||||
if (_Video != -1)
|
||||
{
|
||||
CBase.Video.Close(_Video);
|
||||
CBase.Drawing.RemoveTexture(ref _CurrentVideoTexture);
|
||||
_Video = -1;
|
||||
}
|
||||
}
|
||||
|
||||
public new void TogglePause()
|
||||
{
|
||||
base.TogglePause();
|
||||
if (_Video != -1)
|
||||
{
|
||||
CBase.Video.Pause(_Video);
|
||||
CBase.Video.Skip(_Video, CBase.Sound.GetPosition(_StreamID) + _FadeTime, _Song.VideoGap);
|
||||
}
|
||||
}
|
||||
|
||||
public new 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)
|
||||
Play();
|
||||
else
|
||||
Stop();
|
||||
}
|
||||
}
|
||||
|
||||
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 + _StartPosition); //Use gap, otherwhise we will overwrite position in GetVideoTexture
|
||||
_VideoFading = new CFading(0f, 1f, 3f);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
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;
|
||||
CBase.Sound.SetPosition(_StreamID, value);
|
||||
_StartPosition = value;
|
||||
}
|
||||
get {
|
||||
if(_StreamID == -1)
|
||||
return -1;
|
||||
return CBase.Sound.GetPosition(_StreamID);
|
||||
}
|
||||
}
|
||||
|
||||
public bool RepeatSong;
|
||||
public bool IsPlaying { get; private set; }
|
||||
|
||||
public bool IsFinished { get { return 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)
|
||||
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.Stop);
|
||||
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)
|
||||
Play();
|
||||
else
|
||||
Stop();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
if (_StreamID == -1)
|
||||
return;
|
||||
|
||||
CBase.Sound.Close(_StreamID);
|
||||
_StreamID = -1;
|
||||
IsPlaying = false;
|
||||
}
|
||||
|
||||
private void _ApplyVolume()
|
||||
{
|
||||
if (_StreamID == -1)
|
||||
return;
|
||||
|
||||
CBase.Sound.SetStreamVolume(_StreamID, Volume);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -135,6 +135,8 @@
|
||||
<Compile Include="PartyModes\IPartyMode.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Utils\CWavFile.cs" />
|
||||
<Compile Include="Utils\Player\CSongPlayer.cs" />
|
||||
<Compile Include="Utils\Player\CSoundPlayer.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
|
||||
Reference in new issue
Block a user