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 @@
+