From 028eda099a0772c3cb89ee11b6e022f4a8d2e0a2 Mon Sep 17 00:00:00 2001 From: Stephan Sundermann Date: Sun, 22 Dec 2013 16:29:44 +0100 Subject: [PATCH] Playback: Added FadeAndStop --- Vocaluxe/Base/CBackgroundMusic.cs | 2 +- Vocaluxe/Base/CMain.cs | 2 +- Vocaluxe/Base/CSound.cs | 9 ++++++-- Vocaluxe/Lib/Sound/CGstreamerAudio.cs | 6 +++++ Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs | 17 ++++++++++++++ Vocaluxe/Lib/Sound/COpenALPlay.cs | 6 +++++ Vocaluxe/Lib/Sound/CPortAudioPlay.cs | 27 +++++++++++++++++++++- Vocaluxe/Lib/Sound/IPlayback.cs | 1 + Vocaluxe/Screens/CScreenSing.cs | 2 +- 9 files changed, 66 insertions(+), 6 deletions(-) diff --git a/Vocaluxe/Base/CBackgroundMusic.cs b/Vocaluxe/Base/CBackgroundMusic.cs index 4f315e97..d92118d3 100644 --- a/Vocaluxe/Base/CBackgroundMusic.cs +++ b/Vocaluxe/Base/CBackgroundMusic.cs @@ -166,7 +166,7 @@ namespace Vocaluxe.Base CDraw.RemoveTexture(ref _CurrentVideoTexture); _Video = -1; } - CSound.FadeAndStop(_CurrentMusicStream, 0f, CSettings.BackgroundMusicFadeTime); + CSound.FadeAndClose(_CurrentMusicStream, 0f, CSettings.BackgroundMusicFadeTime); _CurrentMusicStream = -1; _CurrentPlaylistElement = new CPlaylistElement(); diff --git a/Vocaluxe/Base/CMain.cs b/Vocaluxe/Base/CMain.cs index ff9f0f5d..df9cf03d 100644 --- a/Vocaluxe/Base/CMain.cs +++ b/Vocaluxe/Base/CMain.cs @@ -785,7 +785,7 @@ namespace Vocaluxe.Base public void FadeAndStop(int soundStream, float targetVolume, float duration) { - CSound.FadeAndStop(soundStream, targetVolume, duration); + CSound.FadeAndClose(soundStream, targetVolume, duration); } public void SetStreamVolume(int soundStream, float volume) diff --git a/Vocaluxe/Base/CSound.cs b/Vocaluxe/Base/CSound.cs index c3f354da..7df51ad7 100644 --- a/Vocaluxe/Base/CSound.cs +++ b/Vocaluxe/Base/CSound.cs @@ -122,11 +122,16 @@ namespace Vocaluxe.Base _Playback.FadeAndPause(stream, targetVolume, seconds); } - public static void FadeAndStop(int stream, float targetVolume, float seconds) + public static void FadeAndClose(int stream, float targetVolume, float seconds) { _Playback.FadeAndClose(stream, targetVolume, seconds); } + public static void FadeAndStop(int stream, float targetVolume, float seconds) + { + _Playback.FadeAndStop(stream, targetVolume, seconds); + } + public static void SetStreamVolume(int stream, float volume) { _Playback.SetStreamVolume(stream, volume); @@ -192,7 +197,7 @@ namespace Vocaluxe.Base int stream = Load(file); float length = GetLength(stream); Play(stream); - FadeAndStop(stream, 100f, length); + FadeAndClose(stream, 100f, length); return stream; } #endregion Sounds diff --git a/Vocaluxe/Lib/Sound/CGstreamerAudio.cs b/Vocaluxe/Lib/Sound/CGstreamerAudio.cs index 334800ba..d9aeea6e 100644 --- a/Vocaluxe/Lib/Sound/CGstreamerAudio.cs +++ b/Vocaluxe/Lib/Sound/CGstreamerAudio.cs @@ -159,5 +159,11 @@ namespace Vocaluxe.Lib.Sound { CGstreamerAudioWrapper.Update(); } + + + public void FadeAndStop(int stream, float targetVolume, float seconds) + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs b/Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs index 49e3a6ef..8424eef5 100644 --- a/Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs +++ b/Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs @@ -124,6 +124,13 @@ namespace Vocaluxe.Lib.Sound Streams[stream].FadeAndClose(targetVolume, seconds); } + public void FadeAndStop(int stream, float targetVolume, float seconds) + { + if (!Streams.ContainsKey(stream)) + return; + Streams[stream].FadeAndStop(targetVolume, seconds); + } + public void SetStreamVolume(int stream, float volume) { if (!Streams.ContainsKey(stream)) @@ -205,6 +212,7 @@ namespace Vocaluxe.Lib.Sound private bool _Fading; private bool _CloseStreamAfterFade; private bool _PauseStreamAfterFade; + private bool _StopStreamAfterFade; private Stopwatch _FadeTimer = new Stopwatch(); private float _FadeTime; private float _FadeVolume; @@ -312,6 +320,12 @@ namespace Vocaluxe.Lib.Sound _CloseStreamAfterFade = true; } + public void FadeAndStop(float targetVolume, float seconds) + { + Fade(targetVolume, seconds); + _StopStreamAfterFade = true; + } + public float Volume { get @@ -412,9 +426,12 @@ namespace Vocaluxe.Lib.Sound Close(); if (_PauseStreamAfterFade) Paused = true; + if (_StopStreamAfterFade) + Stop(); _CloseStreamAfterFade = false; _PauseStreamAfterFade = false; + _StopStreamAfterFade = false; _Fading = false; _FadeTimer.Reset(); } diff --git a/Vocaluxe/Lib/Sound/COpenALPlay.cs b/Vocaluxe/Lib/Sound/COpenALPlay.cs index 45a17fd1..131a7ff7 100644 --- a/Vocaluxe/Lib/Sound/COpenALPlay.cs +++ b/Vocaluxe/Lib/Sound/COpenALPlay.cs @@ -345,6 +345,12 @@ namespace Vocaluxe.Lib.Sound _Context.Dispose(); _Context = null; } + + + public void FadeAndStop(int stream, float targetVolume, float seconds) + { + throw new NotImplementedException(); + } } class COpenAlStream : IDisposable diff --git a/Vocaluxe/Lib/Sound/CPortAudioPlay.cs b/Vocaluxe/Lib/Sound/CPortAudioPlay.cs index 651d2a9e..6cbf218b 100644 --- a/Vocaluxe/Lib/Sound/CPortAudioPlay.cs +++ b/Vocaluxe/Lib/Sound/CPortAudioPlay.cs @@ -179,6 +179,18 @@ namespace Vocaluxe.Lib.Sound } public void FadeAndClose(int stream, float targetVolume, float seconds) + { + if (_Initialized) + { + lock (_MutexDecoder) + { + if (_AlreadyAdded(stream)) + _Decoder[_GetStreamIndex(stream)].FadeAndClose(targetVolume, seconds, _Closeproc, stream); + } + } + } + + public void FadeAndStop(int stream, float targetVolume, float seconds) { if (_Initialized) { @@ -346,6 +358,7 @@ namespace Vocaluxe.Lib.Sound private float _StartVolume = 1f; private bool _CloseStreamAfterFade; private bool _PauseStreamAfterFade; + private bool _StopStreamAfterFade; private bool _Fading; private static CPortAudio.SPaHostApiInfo _ApiInfo; @@ -510,7 +523,7 @@ namespace Vocaluxe.Lib.Sound Fade(targetVolume, fadeTime); } - public void FadeAndStop(float targetVolume, float fadeTime, Closeproc closeProc, int streamID) + public void FadeAndClose(float targetVolume, float fadeTime, Closeproc closeProc, int streamID) { _Closeproc = closeProc; _StreamID = streamID; @@ -519,10 +532,20 @@ namespace Vocaluxe.Lib.Sound Fade(targetVolume, fadeTime); } + public void FadeAndStop(float targetVolume, float fadeTime, Closeproc closeProc, int streamID) + { + _Closeproc = closeProc; + _StreamID = streamID; + _StopStreamAfterFade = true; + + Fade(targetVolume, fadeTime); + } + public void Play() { Paused = false; _PauseStreamAfterFade = false; + _StopStreamAfterFade = false; lock (_Mutex) { _ErrorCheck("StartStream", CPortAudio.Pa_StartStream(_Ptr)); @@ -921,6 +944,8 @@ namespace Vocaluxe.Lib.Sound if (_PauseStreamAfterFade) Paused = true; + if (_StopStreamAfterFade) + Stop(); } } } diff --git a/Vocaluxe/Lib/Sound/IPlayback.cs b/Vocaluxe/Lib/Sound/IPlayback.cs index b7aed2f3..935956f5 100644 --- a/Vocaluxe/Lib/Sound/IPlayback.cs +++ b/Vocaluxe/Lib/Sound/IPlayback.cs @@ -48,6 +48,7 @@ namespace Vocaluxe.Lib.Sound void Fade(int stream, float targetVolume, float seconds); void FadeAndPause(int stream, float targetVolume, float seconds); void FadeAndClose(int stream, float targetVolume, float seconds); + void FadeAndStop(int stream, float targetVolume, float seconds); void SetStreamVolume(int stream, float volume); void SetStreamVolumeMax(int stream, float volume); diff --git a/Vocaluxe/Screens/CScreenSing.cs b/Vocaluxe/Screens/CScreenSing.cs index e5c610d3..0f5847e5 100644 --- a/Vocaluxe/Screens/CScreenSing.cs +++ b/Vocaluxe/Screens/CScreenSing.cs @@ -551,7 +551,7 @@ namespace Vocaluxe.Screens private void _CloseSong() { if (_CurrentStream > -1) - CSound.FadeAndStop(_CurrentStream, 0f, 0.5f); + CSound.FadeAndClose(_CurrentStream, 0f, 0.5f); CSound.RecordStop(); if (_CurrentVideo != -1) {