From 821726d3761344ea311d00bbb83f564c824a27e7 Mon Sep 17 00:00:00 2001 From: Robert Beekman Date: Thu, 25 Aug 2016 00:55:47 +0200 Subject: [PATCH] Implemented audiovisualization directions --- .../Logitech/LogitechKeyboard.cs | 3 +- .../Profiles/Layers/Types/Audio/AudioType.cs | 148 +++++++++++++----- Artemis/Artemis/Settings/GeneralSettings.cs | 17 +- 3 files changed, 127 insertions(+), 41 deletions(-) diff --git a/Artemis/Artemis/DeviceProviders/Logitech/LogitechKeyboard.cs b/Artemis/Artemis/DeviceProviders/Logitech/LogitechKeyboard.cs index 7f1d13af4..39f4b0ad8 100644 --- a/Artemis/Artemis/DeviceProviders/Logitech/LogitechKeyboard.cs +++ b/Artemis/Artemis/DeviceProviders/Logitech/LogitechKeyboard.cs @@ -2,7 +2,6 @@ using System.Threading; using System.Windows; using Artemis.DeviceProviders.Logitech.Utilities; -using Artemis.Utilities; using Artemis.Utilities.DataReaders; using Microsoft.Win32; @@ -12,7 +11,7 @@ namespace Artemis.DeviceProviders.Logitech { public override bool CanEnable() { - //Check to see if VC++ 2012 x64 is installed. + // Check to see if VC++ 2012 x64 is installed. if (Registry.LocalMachine.OpenSubKey( @"SOFTWARE\Classes\Installer\Dependencies\{ca67548a-5ebe-413a-b50c-4b9ceb6d66c6}") == null) { diff --git a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioType.cs b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioType.cs index 41467bb04..ca2b50c73 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioType.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioType.cs @@ -89,44 +89,21 @@ namespace Artemis.Profiles.Layers.Types.Audio public void Update(LayerModel layerModel, IDataModel dataModel, bool isPreview = false) { - _lines = (int) layerModel.Properties.Width; if ((_device == null) || isPreview) return; lock (SpectrumData) { + UpdateLayers(layerModel); + if (!SpectrumData.Any()) return; - CompareSettings(layerModel); - - var index = 0; var settings = (AudioPropertiesModel) layerModel.Properties; - foreach (var audioLayer in _audioLayers) - { - int height; - if (SpectrumData.Count > index) - height = (int) Math.Round(SpectrumData[index]/2.55); - else - height = 0; - - // Apply Sensitivity setting - height = height*settings.Sensitivity; - - var newHeight = settings.Height/100.0*height; - if (newHeight >= audioLayer.Properties.Height) - audioLayer.Properties.Height = newHeight; - else - audioLayer.Properties.Height = audioLayer.Properties.Height - settings.FadeSpeed; - if (audioLayer.Properties.Height < 0) - audioLayer.Properties.Height = 0; - - audioLayer.Properties.Brush = layerModel.Properties.Brush; - audioLayer.Properties.Contain = false; - - audioLayer.Update(null, false, true); - index++; - } + if (settings.Direction == Direction.TopToBottom || settings.Direction == Direction.BottomToTop) + ApplyVertical(settings); + else if (settings.Direction == Direction.LeftToRight || settings.Direction == Direction.RightToLeft) + ApplyHorizontal(settings); } } @@ -150,7 +127,76 @@ namespace Artemis.Profiles.Layers.Types.Audio return new AudioPropertiesViewModel(proposedLayer, dataModel); } - private void CompareSettings(LayerModel layerModel) + private void ApplyVertical(AudioPropertiesModel settings) + { + var index = 0; + foreach (var audioLayer in _audioLayers) + { + int height; + if (SpectrumData.Count > index) + height = (int) Math.Round(SpectrumData[index]/2.55); + else + height = 0; + + // Apply Sensitivity setting + height = height*settings.Sensitivity; + + var newHeight = settings.Height/100.0*height; + if (newHeight >= audioLayer.Properties.Height) + audioLayer.Properties.Height = newHeight; + else + audioLayer.Properties.Height = audioLayer.Properties.Height - settings.FadeSpeed; + if (audioLayer.Properties.Height < 0) + audioLayer.Properties.Height = 0; + + // Reverse the direction if settings require it + if (settings.Direction == Direction.BottomToTop) + audioLayer.Properties.Y = settings.Y + (settings.Height - audioLayer.Properties.Height); + + audioLayer.Update(null, false, true); + index++; + } + } + + private void ApplyHorizontal(AudioPropertiesModel settings) + { + var index = 0; + foreach (var audioLayer in _audioLayers) + { + int width; + if (SpectrumData.Count > index) + width = (int) Math.Round(SpectrumData[index]/2.55); + else + width = 0; + + // Apply Sensitivity setting + width = width*settings.Sensitivity; + + var newWidth = settings.Width/100.0*width; + if (newWidth >= audioLayer.Properties.Width) + audioLayer.Properties.Width = newWidth; + else + audioLayer.Properties.Width = audioLayer.Properties.Width - settings.FadeSpeed; + if (audioLayer.Properties.Width < 0) + audioLayer.Properties.Width = 0; + + audioLayer.Properties.Brush = settings.Brush; + audioLayer.Properties.Contain = false; + + // Reverse the direction if settings require it + if (settings.Direction == Direction.RightToLeft) + audioLayer.Properties.X = settings.X + (settings.Width - audioLayer.Properties.Width); + + audioLayer.Update(null, false, true); + index++; + } + } + + /// + /// Updates the inner layers when the settings have changed + /// + /// + private void UpdateLayers(LayerModel layerModel) { var settings = (AudioPropertiesModel) layerModel.Properties; if (JsonConvert.SerializeObject(settings).Equals(JsonConvert.SerializeObject(_previousSettings))) @@ -159,25 +205,56 @@ namespace Artemis.Profiles.Layers.Types.Audio _previousSettings = GeneralHelpers.Clone((AudioPropertiesModel) layerModel.Properties); _audioLayers.Clear(); + if (settings.Direction == Direction.TopToBottom || settings.Direction == Direction.BottomToTop) + SetupVertical(settings); + else if (settings.Direction == Direction.LeftToRight || settings.Direction == Direction.RightToLeft) + SetupHorizontal(settings); + } + + private void SetupVertical(AudioPropertiesModel settings) + { + _lines = (int) settings.Width; for (var i = 0; i < _lines; i++) { var layer = LayerModel.CreateLayer(); - layer.Properties.X = layerModel.Properties.X + i; - layer.Properties.Y = layerModel.Properties.Y; + layer.Properties.X = settings.X + i; + layer.Properties.Y = settings.Y; layer.Properties.Width = 1; layer.Properties.Height = 0; layer.LayerAnimation = new NoneAnimation(); - - // TODO: Setup the brush according to settings - layer.Properties.Brush = new SolidColorBrush(Colors.White); + layer.Properties.Brush = settings.Brush; + layer.Properties.Contain = false; _audioLayers.Add(layer); layer.Update(null, false, true); } } + private void SetupHorizontal(AudioPropertiesModel settings) + { + _lines = (int) settings.Height; + for (var i = 0; i < _lines; i++) + { + var layer = LayerModel.CreateLayer(); + layer.Properties.X = settings.X; + layer.Properties.Y = settings.Y + i; + layer.Properties.Width = 0; + layer.Properties.Height = 1; + layer.LayerAnimation = new NoneAnimation(); + layer.Properties.Brush = settings.Brush; + layer.Properties.Contain = false; + + _audioLayers.Add(layer); + layer.Update(null, false, true); + } + } + + private void FftCalculated(object sender, FftEventArgs e) { + if (_lines == 0) + return; + lock (SpectrumData) { int x; @@ -205,6 +282,7 @@ namespace Artemis.Profiles.Layers.Types.Audio } } + // TODO: Check how often this is called private void OnDataAvailable(object sender, WaveInEventArgs e) { var buffer = e.Buffer; diff --git a/Artemis/Artemis/Settings/GeneralSettings.cs b/Artemis/Artemis/Settings/GeneralSettings.cs index 91f212998..93887f89c 100644 --- a/Artemis/Artemis/Settings/GeneralSettings.cs +++ b/Artemis/Artemis/Settings/GeneralSettings.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel; +using System.IO; using System.Windows; using Artemis.DAL; using Artemis.Utilities; @@ -89,10 +90,18 @@ namespace Artemis.Settings { using (var mgr = new UpdateManager("")) { - if (Autorun) - mgr.CreateShortcutsForExecutable("Artemis.exe", ShortcutLocation.Startup, false); - else - mgr.RemoveShortcutsForExecutable("Artemis.exe", ShortcutLocation.Startup); + try + { + if (Autorun) + mgr.CreateShortcutsForExecutable("Artemis.exe", ShortcutLocation.Startup, false); + else + mgr.RemoveShortcutsForExecutable("Artemis.exe", ShortcutLocation.Startup); + } + catch (DirectoryNotFoundException) + { + // ignored, this'll only occur if Artemis isn't installed (ran from VS) + } + } }