From 4543dcb787a3630cc6a0d30a0e227a3377bfde50 Mon Sep 17 00:00:00 2001 From: Darth Affe Date: Fri, 9 Feb 2018 22:45:56 +0100 Subject: [PATCH] Added volume prescaling-option to resolve #3 --- KeyboardAudioVisualizer/ApplicationManager.cs | 4 +- .../AudioCapture/AudioBuffer.cs | 54 +++++++++++-------- .../AudioCapture/CSCoreAudioInput.cs | 3 ++ .../AudioCapture/IAudioInput.cs | 1 + .../AudioVisualizationFactory.cs | 5 ++ .../Configuration/Settings.cs | 2 + .../KeyboardAudioVisualizer.csproj | 46 ++++++++-------- .../UI/ConfigurationViewModel.cs | 10 ++++ .../UI/ConfigurationWindow.xaml | 8 ++- KeyboardAudioVisualizer/packages.config | 28 +++++----- 10 files changed, 99 insertions(+), 62 deletions(-) diff --git a/KeyboardAudioVisualizer/ApplicationManager.cs b/KeyboardAudioVisualizer/ApplicationManager.cs index 91843c9..b4847f1 100644 --- a/KeyboardAudioVisualizer/ApplicationManager.cs +++ b/KeyboardAudioVisualizer/ApplicationManager.cs @@ -189,8 +189,8 @@ namespace KeyboardAudioVisualizer private void Exit() { - RGBSurface.Instance?.Dispose(); - AudioVisualizationFactory.Instance?.Dispose(); + try { AudioVisualizationFactory.Instance?.Dispose(); } catch { } + try { RGBSurface.Instance?.Dispose(); } catch { } Application.Current.Shutdown(); } diff --git a/KeyboardAudioVisualizer/AudioCapture/AudioBuffer.cs b/KeyboardAudioVisualizer/AudioCapture/AudioBuffer.cs index 66859e6..cd67816 100644 --- a/KeyboardAudioVisualizer/AudioCapture/AudioBuffer.cs +++ b/KeyboardAudioVisualizer/AudioCapture/AudioBuffer.cs @@ -1,6 +1,4 @@ -using System; - -namespace KeyboardAudioVisualizer.AudioCapture +namespace KeyboardAudioVisualizer.AudioCapture { public class AudioBuffer { @@ -13,6 +11,8 @@ namespace KeyboardAudioVisualizer.AudioCapture public int Size => _capacity; + public float? Prescale { get; set; } = null; + #endregion #region Constructors @@ -32,24 +32,33 @@ namespace KeyboardAudioVisualizer.AudioCapture public void Put(float[] src, int offset, int count) { lock (_bufferLeft) - { - if ((count & 1) != 0) return; // we expect stereo-data to be an even amount of values - - if (count > _capacity) + lock (_bufferRight) { - offset += count - _capacity; - count = _capacity; - } + if ((count & 1) != 0) return; // we expect stereo-data to be an even amount of values - for (int i = 0; i < count; i += 2) - { - _currentIndex++; - if (_currentIndex >= _capacity) _currentIndex = 0; + if (count > _capacity) + { + offset += count - _capacity; + count = _capacity; + } - _bufferLeft[_currentIndex] = src[offset + i]; - _bufferRight[_currentIndex] = src[offset + i + 1]; + for (int i = 0; i < count; i += 2) + { + _currentIndex++; + if (_currentIndex >= _capacity) _currentIndex = 0; + + if (Prescale.HasValue) + { + _bufferLeft[_currentIndex] = src[offset + i] / Prescale.Value; + _bufferRight[_currentIndex] = src[offset + i + 1] / Prescale.Value; + } + else + { + _bufferLeft[_currentIndex] = src[offset + i]; + _bufferRight[_currentIndex] = src[offset + i + 1]; + } + } } - } } public void CopyLeftInto(ref float[] data, int offset) => CopyLeftInto(ref data, offset, _capacity); @@ -72,11 +81,12 @@ namespace KeyboardAudioVisualizer.AudioCapture public void CopyMixInto(ref float[] data, int offset, int count) { lock (_bufferLeft) - for (int i = _capacity - count; i < count; i++) - { - int index = (_currentIndex + i) % _capacity; - data[offset + i] = (_bufferLeft[index] + _bufferRight[index]) / 2f; - } + lock (_bufferRight) + for (int i = _capacity - count; i < count; i++) + { + int index = (_currentIndex + i) % _capacity; + data[offset + i] = (_bufferLeft[index] + _bufferRight[index]) / 2f; + } } #endregion diff --git a/KeyboardAudioVisualizer/AudioCapture/CSCoreAudioInput.cs b/KeyboardAudioVisualizer/AudioCapture/CSCoreAudioInput.cs index 921ff65..04abb58 100644 --- a/KeyboardAudioVisualizer/AudioCapture/CSCoreAudioInput.cs +++ b/KeyboardAudioVisualizer/AudioCapture/CSCoreAudioInput.cs @@ -13,10 +13,12 @@ namespace KeyboardAudioVisualizer.AudioCapture private WasapiCapture _capture; private SoundInSource _soundInSource; private SingleBlockNotificationStream _stream; + private AudioEndpointVolume _audioEndpointVolume; private readonly float[] _readBuffer = new float[2048]; public int SampleRate => _soundInSource?.WaveFormat?.SampleRate ?? -1; + public float MasterVolume => _audioEndpointVolume.MasterVolumeLevelScalar; #endregion @@ -32,6 +34,7 @@ namespace KeyboardAudioVisualizer.AudioCapture { MMDevice captureDevice = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Console); WaveFormat deviceFormat = captureDevice.DeviceFormat; + _audioEndpointVolume = AudioEndpointVolume.FromDevice(captureDevice); //DarthAffe 07.02.2018: This is a really stupid workaround to (hopefully) finally fix the surround driver issues for (int i = 1; i < 13; i++) diff --git a/KeyboardAudioVisualizer/AudioCapture/IAudioInput.cs b/KeyboardAudioVisualizer/AudioCapture/IAudioInput.cs index beb8a1a..ea3b5c9 100644 --- a/KeyboardAudioVisualizer/AudioCapture/IAudioInput.cs +++ b/KeyboardAudioVisualizer/AudioCapture/IAudioInput.cs @@ -7,6 +7,7 @@ namespace KeyboardAudioVisualizer.AudioCapture public interface IAudioInput : IDisposable { int SampleRate { get; } + float MasterVolume { get; } event AudioData DataAvailable; diff --git a/KeyboardAudioVisualizer/AudioProcessing/AudioVisualizationFactory.cs b/KeyboardAudioVisualizer/AudioProcessing/AudioVisualizationFactory.cs index 0e50147..fba8aa7 100644 --- a/KeyboardAudioVisualizer/AudioProcessing/AudioVisualizationFactory.cs +++ b/KeyboardAudioVisualizer/AudioProcessing/AudioVisualizationFactory.cs @@ -31,6 +31,11 @@ namespace KeyboardAudioVisualizer.AudioProcessing public void Update() { + if (ApplicationManager.Instance.Settings.EnableAudioPrescale) + _audioBuffer.Prescale = _audioInput.MasterVolume; + else + _audioBuffer.Prescale = null; + foreach (IAudioProcessor processor in _processors.Where(x => x.IsActive)) processor.Update(); } diff --git a/KeyboardAudioVisualizer/Configuration/Settings.cs b/KeyboardAudioVisualizer/Configuration/Settings.cs index 5c77870..c533bb8 100644 --- a/KeyboardAudioVisualizer/Configuration/Settings.cs +++ b/KeyboardAudioVisualizer/Configuration/Settings.cs @@ -21,6 +21,8 @@ namespace KeyboardAudioVisualizer.Configuration public double UpdateRate { get; set; } = 40.0; + public bool EnableAudioPrescale { get; set; } = false; + public Dictionary Visualizations { get; set; } = new Dictionary(); public VisualizationSettings this[VisualizationIndex visualizationIndex] diff --git a/KeyboardAudioVisualizer/KeyboardAudioVisualizer.csproj b/KeyboardAudioVisualizer/KeyboardAudioVisualizer.csproj index 63d18ae..3efd0a8 100644 --- a/KeyboardAudioVisualizer/KeyboardAudioVisualizer.csproj +++ b/KeyboardAudioVisualizer/KeyboardAudioVisualizer.csproj @@ -57,37 +57,37 @@ ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - ..\packages\RGB.NET.Brushes.0.0.1.31\lib\net45\RGB.NET.Brushes.dll + ..\packages\RGB.NET.Brushes.0.0.1.35\lib\net45\RGB.NET.Brushes.dll - ..\packages\RGB.NET.Core.0.0.1.31\lib\net45\RGB.NET.Core.dll + ..\packages\RGB.NET.Core.0.0.1.35\lib\net45\RGB.NET.Core.dll - ..\packages\RGB.NET.Decorators.0.0.1.31\lib\net45\RGB.NET.Decorators.dll + ..\packages\RGB.NET.Decorators.0.0.1.35\lib\net45\RGB.NET.Decorators.dll - ..\packages\RGB.NET.Devices.Asus.0.0.1.31\lib\net45\RGB.NET.Devices.Asus.dll + ..\packages\RGB.NET.Devices.Asus.0.0.1.35\lib\net45\RGB.NET.Devices.Asus.dll - ..\packages\RGB.NET.Devices.CoolerMaster.0.0.1.31\lib\net45\RGB.NET.Devices.CoolerMaster.dll + ..\packages\RGB.NET.Devices.CoolerMaster.0.0.1.35\lib\net45\RGB.NET.Devices.CoolerMaster.dll - ..\packages\RGB.NET.Devices.Corsair.0.0.1.31\lib\net45\RGB.NET.Devices.Corsair.dll + ..\packages\RGB.NET.Devices.Corsair.0.0.1.35\lib\net45\RGB.NET.Devices.Corsair.dll - ..\packages\RGB.NET.Devices.Logitech.0.0.1.31\lib\net45\RGB.NET.Devices.Logitech.dll + ..\packages\RGB.NET.Devices.Logitech.0.0.1.35\lib\net45\RGB.NET.Devices.Logitech.dll - ..\packages\RGB.NET.Devices.Msi.0.0.1.31\lib\net45\RGB.NET.Devices.Msi.dll + ..\packages\RGB.NET.Devices.Msi.0.0.1.35\lib\net45\RGB.NET.Devices.Msi.dll - ..\packages\RGB.NET.Devices.Novation.0.0.1.31\lib\net45\RGB.NET.Devices.Novation.dll + ..\packages\RGB.NET.Devices.Novation.0.0.1.35\lib\net45\RGB.NET.Devices.Novation.dll - ..\packages\RGB.NET.Devices.Razer.0.0.1.31\lib\net45\RGB.NET.Devices.Razer.dll + ..\packages\RGB.NET.Devices.Razer.0.0.1.35\lib\net45\RGB.NET.Devices.Razer.dll - ..\packages\RGB.NET.Groups.0.0.1.31\lib\net45\RGB.NET.Groups.dll + ..\packages\RGB.NET.Groups.0.0.1.35\lib\net45\RGB.NET.Groups.dll ..\packages\Sanford.Multimedia.Midi.6.5.0\lib\net20\Sanford.Multimedia.Midi.dll @@ -328,21 +328,21 @@ - + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - + + + + + + - - - - - + + + + + \ No newline at end of file diff --git a/KeyboardAudioVisualizer/UI/ConfigurationViewModel.cs b/KeyboardAudioVisualizer/UI/ConfigurationViewModel.cs index e36fc6d..2d6ee21 100644 --- a/KeyboardAudioVisualizer/UI/ConfigurationViewModel.cs +++ b/KeyboardAudioVisualizer/UI/ConfigurationViewModel.cs @@ -25,6 +25,16 @@ namespace KeyboardAudioVisualizer.UI } } + public bool EnableAudioPrescale + { + get => ApplicationManager.Instance.Settings.EnableAudioPrescale; + set + { + ApplicationManager.Instance.Settings.EnableAudioPrescale = value; + OnPropertyChanged(); + } + } + public VisualizationType SelectedPrimaryVisualization { get => ApplicationManager.Instance.Settings[VisualizationIndex.Primary].SelectedVisualization; diff --git a/KeyboardAudioVisualizer/UI/ConfigurationWindow.xaml b/KeyboardAudioVisualizer/UI/ConfigurationWindow.xaml index e24090c..f1453c1 100644 --- a/KeyboardAudioVisualizer/UI/ConfigurationWindow.xaml +++ b/KeyboardAudioVisualizer/UI/ConfigurationWindow.xaml @@ -57,7 +57,8 @@ - + @@ -189,6 +190,11 @@ attached:SliderValue.Unit="FPS" ToolTip="Defines how fast the data is updated. Low values can reduce CPU-usage but will cause stuttering." /> +