From 23364c3bcb9c890e317c70885c536d5f3d77b035 Mon Sep 17 00:00:00 2001 From: Flamefire Date: Fri, 14 Mar 2014 16:27:12 +0100 Subject: [PATCH] Add a class for fading (we don't have to implement this multiple times) --- Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs | 65 +++++++++++----------- VocaluxeLib/CFading.cs | 64 +++++++++++++++++++++ VocaluxeLib/VocaluxeLib.csproj | 1 + 3 files changed, 98 insertions(+), 32 deletions(-) create mode 100644 VocaluxeLib/CFading.cs diff --git a/Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs b/Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs index b7795c0a..2b43716f 100644 --- a/Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs +++ b/Vocaluxe/Lib/Sound/CGstreamerSharpAudio.cs @@ -20,8 +20,8 @@ using System.Collections.Generic; using Gst; using GLib; using System.Runtime.InteropServices; -using System.Diagnostics; using Vocaluxe.Base; +using VocaluxeLib; using Thread = System.Threading.Thread; namespace Vocaluxe.Lib.Sound @@ -213,18 +213,21 @@ namespace Vocaluxe.Lib.Sound private class CGstreamerSharpAudioStream { + private enum EStreamAction + { + Nothing, + Pause, + Stop, + Close + } + private Element _Element; private bool _Loop; public volatile bool Closed = true; public volatile bool Finished; - private bool _Fading; - private bool _CloseStreamAfterFade; - private bool _PauseStreamAfterFade; - private bool _StopStreamAfterFade; - private readonly Stopwatch _FadeTimer = new Stopwatch(); - private float _FadeTime; - private float _FadeVolume; + private CFading _Fading; + private EStreamAction _AfterFadeAction; private float _Volume = 1f; private float _MaxVolume = 1f; @@ -358,28 +361,26 @@ namespace Vocaluxe.Lib.Sound public void Fade(float targetVolume, float seconds) { - _Fading = true; - _FadeTimer.Restart(); - _FadeTime = seconds; - _FadeVolume = targetVolume; + _Fading = new CFading(_Volume, targetVolume, seconds); + _AfterFadeAction = EStreamAction.Nothing; } public void FadeAndPause(float targetVolume, float seconds) { Fade(targetVolume, seconds); - _PauseStreamAfterFade = true; + _AfterFadeAction = EStreamAction.Pause; } public void FadeAndClose(float targetVolume, float seconds) { Fade(targetVolume, seconds); - _CloseStreamAfterFade = true; + _AfterFadeAction = EStreamAction.Close; } public void FadeAndStop(float targetVolume, float seconds) { Fade(targetVolume, seconds); - _StopStreamAfterFade = true; + _AfterFadeAction = EStreamAction.Stop; } public float Volume @@ -460,25 +461,25 @@ namespace Vocaluxe.Lib.Sound while (_Element != null && _Element.Bus != null && _Element.Bus.HavePending()) _OnMessage(_Element.Bus.Pop()); - if (_Fading) + if (_Fading != null) { - if (_FadeTimer.ElapsedMilliseconds < (_FadeTime * 1000f)) - Volume = ((_FadeTimer.ElapsedMilliseconds) / (_FadeTime * 1000f)) * _FadeVolume; - else + bool finished; + Volume = _Fading.GetValue(out finished); + if (finished) { - Volume = _FadeVolume; - if (_CloseStreamAfterFade) - Close(); - if (_PauseStreamAfterFade) - Paused = true; - if (_StopStreamAfterFade) - Stop(); - - _CloseStreamAfterFade = false; - _PauseStreamAfterFade = false; - _StopStreamAfterFade = false; - _Fading = false; - _FadeTimer.Reset(); + switch (_AfterFadeAction) + { + case EStreamAction.Pause: + Paused = true; + break; + case EStreamAction.Stop: + Stop(); + break; + case EStreamAction.Close: + Close(); + break; + } + _Fading = null; } } } diff --git a/VocaluxeLib/CFading.cs b/VocaluxeLib/CFading.cs new file mode 100644 index 00000000..5f04e647 --- /dev/null +++ b/VocaluxeLib/CFading.cs @@ -0,0 +1,64 @@ +#region license +// This file is part of Vocaluxe. +// +// Vocaluxe is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Vocaluxe is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Vocaluxe. If not, see . +#endregion + +using System.Diagnostics; + +namespace VocaluxeLib +{ + public class CFading + { + private readonly float _FromValue; + private readonly float _ToValue; + private readonly float _Duration; //in ms + private readonly Stopwatch _Timer = new Stopwatch(); + + /// + /// Starts a fading process adjusting between 2 values over a given amount of time + /// + /// Start value + /// Target value + /// Duration of the fading in seconds + public CFading(float fromValue, float toValue, float duration) + { + _FromValue = fromValue; + _ToValue = toValue; + _Duration = duration * 1000f; + _Timer.Start(); + } + + /// + /// Gets the current value and sets finished + /// + /// Set to whether fading has finished + /// Current value (between from and to values) + public float GetValue(out bool finished) + { + float result; + if (_Timer.ElapsedMilliseconds < _Duration) + { + result = (_Timer.ElapsedMilliseconds / _Duration) * (_ToValue - _FromValue) + _FromValue; + finished = false; + } + else + { + result = _ToValue; + finished = true; + } + return result; + } + } +} \ No newline at end of file diff --git a/VocaluxeLib/VocaluxeLib.csproj b/VocaluxeLib/VocaluxeLib.csproj index d44d9b74..22d6a2b1 100644 --- a/VocaluxeLib/VocaluxeLib.csproj +++ b/VocaluxeLib/VocaluxeLib.csproj @@ -130,6 +130,7 @@ +