diff --git a/Vocaluxe/Lib/Sound/Playback/GstreamerSharp/CGstreamerSharpAudioStream.cs b/Vocaluxe/Lib/Sound/Playback/GstreamerSharp/CGstreamerSharpAudioStream.cs index 525061ac..bbcbd725 100644 --- a/Vocaluxe/Lib/Sound/Playback/GstreamerSharp/CGstreamerSharpAudioStream.cs +++ b/Vocaluxe/Lib/Sound/Playback/GstreamerSharp/CGstreamerSharpAudioStream.cs @@ -148,7 +148,8 @@ namespace Vocaluxe.Lib.Sound.Playback.GstreamerSharp public void Fade(float targetVolume, float seconds) { - _Fading = new CFading(_Volume, targetVolume, seconds); + targetVolume.Clamp(0f, 100f); + _Fading = new CFading(_Volume, targetVolume / 100f, seconds); _AfterFadeAction = EStreamAction.Nothing; } @@ -175,19 +176,26 @@ namespace Vocaluxe.Lib.Sound.Playback.GstreamerSharp get { return _Volume * 100f; } set { + value.Clamp(0f, 100f); _Volume = value / 100f; - if (_Element != null) - _Element["volume"] = (_Volume * _MaxVolume); + _SetElementVolume(); } } + private void _SetElementVolume() + { + if (_Element != null) + _Element["volume"] = (_Volume * _MaxVolume); + } + public float MaxVolume { get { return _MaxVolume * 100f; } set { + value.Clamp(0f, 100f); _MaxVolume = value / 100f; - Volume = _Volume; + _SetElementVolume(); } } @@ -251,7 +259,8 @@ namespace Vocaluxe.Lib.Sound.Playback.GstreamerSharp if (_Fading != null) { bool finished; - Volume = _Fading.GetValue(out finished); + _Volume = _Fading.GetValue(out finished); + _SetElementVolume(); if (finished) { switch (_AfterFadeAction) diff --git a/Vocaluxe/Lib/Sound/Playback/OpenAL/COpenAlStream.cs b/Vocaluxe/Lib/Sound/Playback/OpenAL/COpenAlStream.cs index 16fac938..f3742b7d 100644 --- a/Vocaluxe/Lib/Sound/Playback/OpenAL/COpenAlStream.cs +++ b/Vocaluxe/Lib/Sound/Playback/OpenAL/COpenAlStream.cs @@ -57,19 +57,13 @@ namespace Vocaluxe.Lib.Sound.Playback.OpenAL private bool _SetSkip; private bool _Terminated; - private readonly Thread _DecoderThread; + private Thread _DecoderThread; private AutoResetEvent _EventDecode = new AutoResetEvent(false); private readonly Object _MutexData = new Object(); private readonly Object _MutexSyncSignals = new Object(); - public COpenAlStream() - { - _Initialized = false; - _DecoderThread = new Thread(_Execute) {Name = "OpenAL Decode"}; - } - public void Free(Closeproc closeProc, int streamID, Object closeMutex) { _Closeproc = closeProc; @@ -107,12 +101,8 @@ namespace Vocaluxe.Lib.Sound.Playback.OpenAL { lock (_MutexData) { + value.Clamp(0f, 100f); _Volume = value / 100f; - if (_Volume < 0f) - _Volume = 0f; - - if (_Volume > 1f) - _Volume = 1f; } } } @@ -124,12 +114,8 @@ namespace Vocaluxe.Lib.Sound.Playback.OpenAL { lock (_MutexData) { + value.Clamp(0f, 100f); _VolumeMax = value / 100f; - if (_VolumeMax < 0f) - _VolumeMax = 0f; - - if (_VolumeMax > 1f) - _VolumeMax = 1f; } } } @@ -170,7 +156,8 @@ namespace Vocaluxe.Lib.Sound.Playback.OpenAL public void Fade(float targetVolume, float fadeTime) { - _Fading = new CFading(_Volume, targetVolume, fadeTime); + targetVolume.Clamp(0f, 100f); + _Fading = new CFading(_Volume, targetVolume / 100f, fadeTime); _AfterFadeAction = EStreamAction.Nothing; } @@ -251,8 +238,7 @@ namespace Vocaluxe.Lib.Sound.Playback.OpenAL _FileOpened = true; _Data = new CRingBuffer(_Bufsize); _NoMoreData = false; - _DecoderThread.Priority = ThreadPriority.Normal; - _DecoderThread.Name = Path.GetFileName(fileName); + _DecoderThread = new Thread(_Execute) {Priority = ThreadPriority.Normal, Name = Path.GetFileName(fileName)}; _DecoderThread.Start(); return stream.Handle; @@ -428,7 +414,7 @@ namespace Vocaluxe.Lib.Sound.Playback.OpenAL { AL.GetSource(_Source, ALGetSourcei.BuffersProcessed, out processedCount); doit = false; - Console.WriteLine("Buffers Processed on Stream " + _Source + " = " + processedCount); + //Console.WriteLine("Buffers Processed on Stream " + _Source + " = " + processedCount); if (processedCount < 1) return; } @@ -443,29 +429,15 @@ namespace Vocaluxe.Lib.Sound.Playback.OpenAL { _Data.Read(buf); - - var b = new byte[2]; - for (int i = 0; i < buf.Length; i += _ByteCount) + //We want to scale all values. No matter how many channels we have (_ByteCount=2 or 4) we have short values + //So just process 2 bytes a time + for (int i = 0; i < buf.Length; i += 2) { - b[0] = buf[i]; - b[1] = buf[i + 1]; - - b = BitConverter.GetBytes((Int16)(BitConverter.ToInt16(b, 0) * _Volume * _VolumeMax)); + byte[] b = BitConverter.GetBytes((Int16)(BitConverter.ToInt16(buf, i) * _Volume * _VolumeMax)); buf[i] = b[0]; buf[i + 1] = b[1]; - - if (_ByteCount == 4) - { - b[0] = buf[i + 2]; - b[1] = buf[i + 3]; - - b = BitConverter.GetBytes((Int16)(BitConverter.ToInt16(b, 0) * _Volume * _VolumeMax)); - buf[i + 2] = b[0]; - buf[i + 3] = b[1]; - } } - int buffer; if (!doit) buffer = AL.SourceUnqueueBuffer(_Source); @@ -479,7 +451,6 @@ namespace Vocaluxe.Lib.Sound.Playback.OpenAL { ALFormat alFormat = (_Format.ChannelCount == 2) ? ALFormat.Stereo16 : ALFormat.Mono16; AL.BufferData(buffer, alFormat, buf, buf.Length, _Format.SamplesPerSecond); - Console.WriteLine("Write to Buffer: " + buffer); AL.SourceQueueBuffer(_Source, buffer); } } @@ -491,8 +462,7 @@ namespace Vocaluxe.Lib.Sound.Playback.OpenAL } _CurrentTime = _TimeCode - _Data.BytesNotRead / _BytesPerSecond - 0.1f; - _Timer.Reset(); - _Timer.Start(); + _Timer.Restart(); } public void Dispose() diff --git a/Vocaluxe/Lib/Sound/Playback/PortAudio/CPortAudioStream.cs b/Vocaluxe/Lib/Sound/Playback/PortAudio/CPortAudioStream.cs index 48ee8776..d4cb57c5 100644 --- a/Vocaluxe/Lib/Sound/Playback/PortAudio/CPortAudioStream.cs +++ b/Vocaluxe/Lib/Sound/Playback/PortAudio/CPortAudioStream.cs @@ -54,7 +54,7 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio private bool _SetSkip; private bool _Terminated; - private readonly Thread _DecoderThread; + private Thread _DecoderThread; private AutoResetEvent _EventDecode = new AutoResetEvent(false); @@ -64,7 +64,6 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio public CPortAudioStream() { _SyncTimer = new CSyncTimer(0f, 1f, 0.02f); - _DecoderThread = new Thread(_Execute) {Name = "PortAudio Decode"}; } ~CPortAudioStream() @@ -108,12 +107,8 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio { lock (_LockData) { + value.Clamp(0f, 100f); _Volume = value / 100f; - if (_Volume < 0f) - _Volume = 0f; - - if (_Volume > 1f) - _Volume = 1f; } } } @@ -125,12 +120,8 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio { lock (_LockData) { + value.Clamp(0f, 100f); _VolumeMax = value / 100f; - if (_VolumeMax < 0f) - _VolumeMax = 0f; - - if (_VolumeMax > 1f) - _VolumeMax = 1f; } } } @@ -170,13 +161,15 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio public void Fade(float targetVolume, float fadeTime) { - _Fading = new CFading(_Volume, targetVolume, fadeTime); + targetVolume = targetVolume.Clamp(0f, 100f); + _Fading = new CFading(_Volume, targetVolume / 100f, fadeTime); _AfterFadeAction = EStreamAction.Nothing; } public void FadeAndPause(float targetVolume, float fadeTime) { Fade(targetVolume, fadeTime); + _AfterFadeAction = EStreamAction.Pause; } public void FadeAndClose(float targetVolume, float fadeTime, Closeproc closeProc, int streamID) @@ -228,9 +221,6 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio if (!File.Exists(fileName)) return -1; - if (_FileOpened) - return -1; - _Decoder = new CAudioDecoderFFmpeg(); _Decoder.Init(); @@ -310,8 +300,7 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio _FileOpened = true; _Data = new CRingBuffer(_Bufsize); _NoMoreData = false; - _DecoderThread.Priority = ThreadPriority.Normal; - _DecoderThread.Name = Path.GetFileName(fileName); + _DecoderThread = new Thread(_Execute) {Priority = ThreadPriority.Normal, Name = Path.GetFileName(fileName)}; _DecoderThread.Start(); return stream.Handle; @@ -490,26 +479,13 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio if (_NoMoreData || _Data.BytesNotRead >= buf.Length) { _Data.Read(buf); - - var b = new byte[2]; - for (int i = 0; i < buf.Length; i += _ByteCount) + //We want to scale all values. No matter how many channels we have (_ByteCount=2 or 4) we have short values + //So just process 2 bytes a time + for (int i = 0; i < buf.Length; i += 2) { - b[0] = buf[i]; - b[1] = buf[i + 1]; - - b = BitConverter.GetBytes((Int16)(BitConverter.ToInt16(b, 0) * _Volume * _VolumeMax)); + byte[] b = BitConverter.GetBytes((Int16)(BitConverter.ToInt16(buf, i) * _Volume * _VolumeMax)); buf[i] = b[0]; buf[i + 1] = b[1]; - - if (_ByteCount == 4) - { - b[0] = buf[i + 2]; - b[1] = buf[i + 3]; - - b = BitConverter.GetBytes((Int16)(BitConverter.ToInt16(b, 0) * _Volume * _VolumeMax)); - buf[i + 2] = b[0]; - buf[i + 3] = b[1]; - } } }