diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj
index f2ba363af..0016043d5 100644
--- a/Artemis/Artemis/Artemis.csproj
+++ b/Artemis/Artemis/Artemis.csproj
@@ -325,6 +325,12 @@
+
+
+ AudioPropertiesView.xaml
+
+
+
GenericPropertiesView.xaml
@@ -372,12 +378,6 @@
-
- TypeWave.settings
- True
- True
-
-
CounterStrike.settings
@@ -445,7 +445,6 @@
-
@@ -521,7 +520,6 @@
-
@@ -557,9 +555,6 @@
AudioVisualizerView.xaml
-
- TypeWaveView.xaml
-
GamesView.xaml
@@ -641,10 +636,6 @@
SettingsSingleFileGenerator
Bubbles.Designer.cs
-
- SettingsSingleFileGenerator
- TypeWave.Designer.cs
-
SettingsSingleFileGenerator
WindowsProfile.Designer.cs
@@ -741,6 +732,10 @@
Designer
MSBuild:Compile
+
+ MSBuild:Compile
+ Designer
+
MSBuild:Compile
Designer
@@ -777,10 +772,6 @@
Designer
MSBuild:Compile
-
- Designer
- MSBuild:Compile
-
MSBuild:Compile
Designer
diff --git a/Artemis/Artemis/InjectionModules/ArtemisModules.cs b/Artemis/Artemis/InjectionModules/ArtemisModules.cs
index 7347d9e09..68f35bd1a 100644
--- a/Artemis/Artemis/InjectionModules/ArtemisModules.cs
+++ b/Artemis/Artemis/InjectionModules/ArtemisModules.cs
@@ -4,7 +4,6 @@ using Artemis.DeviceProviders.Logitech;
using Artemis.DeviceProviders.Razer;
using Artemis.Modules.Effects.AudioVisualizer;
using Artemis.Modules.Effects.Bubbles;
-using Artemis.Modules.Effects.TypeWave;
using Artemis.Modules.Effects.WindowsProfile;
using Artemis.Modules.Games.CounterStrike;
using Artemis.Modules.Games.Dota2;
@@ -16,6 +15,7 @@ using Artemis.Modules.Overlays.VolumeDisplay;
using Artemis.Profiles.Layers.Animations;
using Artemis.Profiles.Layers.Conditions;
using Artemis.Profiles.Layers.Interfaces;
+using Artemis.Profiles.Layers.Types.Audio;
using Artemis.Profiles.Layers.Types.Folder;
using Artemis.Profiles.Layers.Types.Generic;
using Artemis.Profiles.Layers.Types.Headset;
@@ -36,7 +36,6 @@ namespace Artemis.InjectionModules
// Effects
Bind().To().InSingletonScope();
- Bind().To().InSingletonScope();
Bind().To().InSingletonScope();
Bind().To().InSingletonScope();
@@ -92,9 +91,11 @@ namespace Artemis.InjectionModules
Bind().To();
Bind().To();
Bind().To();
+ Bind().To();
// Bind some Layer Types to self as well in order to allow JSON.NET injection
Bind().ToSelf();
+ Bind().ToSelf();
#endregion
}
diff --git a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWave.Designer.cs b/Artemis/Artemis/Modules/Effects/TypeWave/TypeWave.Designer.cs
deleted file mode 100644
index 6fda6a5f0..000000000
--- a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWave.Designer.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// This code was generated by a tool.
-// Runtime Version:4.0.30319.42000
-//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
-//
-//------------------------------------------------------------------------------
-
-namespace Artemis.Modules.Effects.TypeWave {
-
-
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
- internal sealed partial class TypeWave : global::System.Configuration.ApplicationSettingsBase {
-
- private static TypeWave defaultInstance = ((TypeWave)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new TypeWave())));
-
- public static TypeWave Default {
- get {
- return defaultInstance;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("True")]
- public bool IsRandomColors {
- get {
- return ((bool)(this["IsRandomColors"]));
- }
- set {
- this["IsRandomColors"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("#FFFF0000")]
- public global::System.Windows.Media.Color WaveColor {
- get {
- return ((global::System.Windows.Media.Color)(this["WaveColor"]));
- }
- set {
- this["WaveColor"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("True")]
- public bool IsShiftColors {
- get {
- return ((bool)(this["IsShiftColors"]));
- }
- set {
- this["IsShiftColors"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("20")]
- public int ShiftColorSpeed {
- get {
- return ((int)(this["ShiftColorSpeed"]));
- }
- set {
- this["ShiftColorSpeed"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("500")]
- public int TimeToLive {
- get {
- return ((int)(this["TimeToLive"]));
- }
- set {
- this["TimeToLive"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("4")]
- public int SpreadSpeed {
- get {
- return ((int)(this["SpreadSpeed"]));
- }
- set {
- this["SpreadSpeed"] = value;
- }
- }
- }
-}
diff --git a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWave.settings b/Artemis/Artemis/Modules/Effects/TypeWave/TypeWave.settings
deleted file mode 100644
index b28238d15..000000000
--- a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWave.settings
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
- True
-
-
- #FFFF0000
-
-
- True
-
-
- 20
-
-
- 500
-
-
- 4
-
-
-
\ No newline at end of file
diff --git a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveModel.cs b/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveModel.cs
deleted file mode 100644
index 2326f1dcc..000000000
--- a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveModel.cs
+++ /dev/null
@@ -1,138 +0,0 @@
-using System.Collections.Generic;
-using System.Drawing;
-using System.Drawing.Drawing2D;
-using System.Windows.Forms;
-using Artemis.Managers;
-using Artemis.Models;
-using Artemis.Profiles.Layers.Models;
-using Artemis.Utilities;
-using Artemis.Utilities.Keyboard;
-
-namespace Artemis.Modules.Effects.TypeWave
-{
- public class TypeWaveModel : EffectModel
- {
- private readonly List _waves;
- private Color _randomColor;
-
- public TypeWaveModel(MainManager mainManager, TypeWaveSettings settings) : base(mainManager, null)
- {
- Name = "TypeWave";
- _waves = new List();
- _randomColor = Color.Red;
- Settings = settings;
- Initialized = false;
- }
-
- public TypeWaveSettings Settings { get; set; }
-
- public override void Dispose()
- {
- Initialized = false;
- KeyboardHook.KeyDownCallback -= KeyboardHookOnKeyDownCallback;
- }
-
- private void KeyboardHookOnKeyDownCallback(KeyEventArgs e)
- {
- // More than 25 waves is pointless
- if (_waves.Count >= 25)
- return;
-
- var keyMatch = MainManager.DeviceManager.ActiveKeyboard.GetKeyPosition(e.KeyCode);
- if (keyMatch == null)
- return;
-
- _waves.Add(Settings.IsRandomColors
- ? new Wave(new Point(keyMatch.Value.X*KeyboardScale, keyMatch.Value.Y*KeyboardScale), 0, _randomColor)
- : new Wave(new Point(keyMatch.Value.X*KeyboardScale, keyMatch.Value.Y*KeyboardScale), 0,
- ColorHelpers.ToDrawingColor(Settings.WaveColor)));
- }
-
- public override void Enable()
- {
- KeyboardHook.KeyDownCallback += KeyboardHookOnKeyDownCallback;
- Initialized = true;
- }
-
- public override void Update()
- {
- if (Settings.IsRandomColors)
- _randomColor = ColorHelpers.ShiftColor(_randomColor, 25);
-
- for (var i = 0; i < _waves.Count; i++)
- {
- // TODO: Get from settings
- var fps = 25;
-
- _waves[i].Size += Settings.SpreadSpeed*KeyboardScale;
-
- if (Settings.IsShiftColors)
- _waves[i].Color = ColorHelpers.ShiftColor(_waves[i].Color, Settings.ShiftColorSpeed);
-
- var decreaseAmount = 255/(Settings.TimeToLive/fps);
- _waves[i].Color = Color.FromArgb(
- _waves[i].Color.A - decreaseAmount, _waves[i].Color.R,
- _waves[i].Color.G,
- _waves[i].Color.B);
-
- if (_waves[i].Color.A >= decreaseAmount)
- continue;
-
- _waves.RemoveAt(i);
- i--;
- }
- }
-
- public override List GetRenderLayers(bool keyboardOnly)
- {
- return null;
- }
-
- public override void Render(RenderFrame frame, bool keyboardOnly)
- {
- if (_waves.Count == 0)
- return;
-
- // Don't want a for-each, collection is changed in different thread
- // ReSharper disable once ForCanBeConvertedToForeach
- for (var i = 0; i < _waves.Count; i++)
- {
- if (_waves[i].Size == 0)
- continue;
- var path = new GraphicsPath();
- path.AddEllipse(_waves[i].Point.X - _waves[i].Size/2, _waves[i].Point.Y - _waves[i].Size/2,
- _waves[i].Size, _waves[i].Size);
-
- var pthGrBrush = new PathGradientBrush(path)
- {
- SurroundColors = new[] {_waves[i].Color},
- CenterColor = Color.Transparent
- };
-
- using (var g = Graphics.FromImage(frame.KeyboardBitmap))
- {
- g.FillPath(pthGrBrush, path);
- pthGrBrush.FocusScales = new PointF(0.3f, 0.8f);
-
- g.FillPath(pthGrBrush, path);
- g.DrawEllipse(new Pen(pthGrBrush, 1), _waves[i].Point.X - _waves[i].Size/2,
- _waves[i].Point.Y - _waves[i].Size/2, _waves[i].Size, _waves[i].Size);
- }
- }
- }
- }
-
- public class Wave
- {
- public Wave(Point point, int size, Color color)
- {
- Point = point;
- Size = size;
- Color = color;
- }
-
- public Point Point { get; set; }
- public int Size { get; set; }
- public Color Color { get; set; }
- }
-}
\ No newline at end of file
diff --git a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveSettings.cs b/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveSettings.cs
deleted file mode 100644
index 66f3820bc..000000000
--- a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveSettings.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using System.Windows.Media;
-using Artemis.Models;
-
-namespace Artemis.Modules.Effects.TypeWave
-{
- public class TypeWaveSettings : EffectSettings
- {
- public TypeWaveSettings()
- {
- Load();
- }
-
- public bool IsRandomColors { get; set; }
- public Color WaveColor { get; set; }
- public bool IsShiftColors { get; set; }
- public int ShiftColorSpeed { get; set; }
- public int TimeToLive { get; set; }
- public int SpreadSpeed { get; set; }
-
- public sealed override void Load()
- {
- IsRandomColors = TypeWave.Default.IsRandomColors;
- WaveColor = TypeWave.Default.WaveColor;
- IsShiftColors = TypeWave.Default.IsShiftColors;
- ShiftColorSpeed = TypeWave.Default.ShiftColorSpeed;
- TimeToLive = TypeWave.Default.TimeToLive;
- SpreadSpeed = TypeWave.Default.SpreadSpeed;
- }
-
- public sealed override void Save()
- {
- TypeWave.Default.IsRandomColors = IsRandomColors;
- TypeWave.Default.WaveColor = WaveColor;
- TypeWave.Default.IsShiftColors = IsShiftColors;
- TypeWave.Default.ShiftColorSpeed = ShiftColorSpeed;
- TypeWave.Default.TimeToLive = TimeToLive;
- TypeWave.Default.SpreadSpeed = SpreadSpeed;
-
- TypeWave.Default.Save();
- }
-
- public sealed override void ToDefault()
- {
- IsRandomColors = true;
- WaveColor = Color.FromArgb(255, 255, 0, 0);
- IsShiftColors = true;
- ShiftColorSpeed = 20;
- TimeToLive = 500;
- SpreadSpeed = 4;
- }
- }
-}
\ No newline at end of file
diff --git a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveView.xaml b/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveView.xaml
deleted file mode 100644
index 89527794a..000000000
--- a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveView.xaml
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Wave color
-
-
-
-
-
- Use random colors
-
-
-
-
-
- Shift through colors as the wave grows
-
-
-
-
-
- Speed to shift colors at
-
-
-
-
-
- Wave time to live
-
-
-
-
-
- Wave growth speed
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveView.xaml.cs b/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveView.xaml.cs
deleted file mode 100644
index 687158fd5..000000000
--- a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveView.xaml.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System.Windows.Controls;
-
-namespace Artemis.Modules.Effects.TypeWave
-{
- ///
- /// Interaction logic for TypeWaveView.xaml
- ///
- public partial class TypeWaveView : UserControl
- {
- public TypeWaveView()
- {
- InitializeComponent();
- }
- }
-}
\ No newline at end of file
diff --git a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveViewModel.cs b/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveViewModel.cs
deleted file mode 100644
index 8630af3a1..000000000
--- a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveViewModel.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using Artemis.Events;
-using Artemis.Managers;
-using Artemis.ViewModels.Abstract;
-using Caliburn.Micro;
-
-namespace Artemis.Modules.Effects.TypeWave
-{
- public sealed class TypeWaveViewModel : EffectViewModel, IHandle
- {
- public TypeWaveViewModel(MainManager main, IEventAggregator events)
- : base(main, new TypeWaveModel(main, new TypeWaveSettings()))
- {
- DisplayName = "Type Waves";
- events.Subscribe(this);
-
- MainManager.EffectManager.EffectModels.Add(EffectModel);
- EffectSettings = ((TypeWaveModel) EffectModel).Settings;
- }
-
- public void Handle(ActiveEffectChanged message)
- {
- NotifyOfPropertyChange(() => EffectEnabled);
- }
- }
-}
\ No newline at end of file
diff --git a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesModel.cs b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesModel.cs
new file mode 100644
index 000000000..fccb322f9
--- /dev/null
+++ b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesModel.cs
@@ -0,0 +1,14 @@
+using Artemis.Profiles.Layers.Models;
+
+namespace Artemis.Profiles.Layers.Types.Audio
+{
+ public class AudioPropertiesModel : LayerPropertiesModel
+ {
+ public AudioPropertiesModel(LayerPropertiesModel properties) : base(properties)
+ {
+ }
+
+ public int Sensitivity { get; set; }
+ public double FadeSpeed { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesView.xaml b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesView.xaml
new file mode 100644
index 000000000..2fed86b24
--- /dev/null
+++ b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesView.xaml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesView.xaml.cs b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesView.xaml.cs
new file mode 100644
index 000000000..038710e12
--- /dev/null
+++ b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesView.xaml.cs
@@ -0,0 +1,15 @@
+using System.Windows.Controls;
+
+namespace Artemis.Profiles.Layers.Types.Audio
+{
+ ///
+ /// Interaction logic for AudioPropertiesView.xaml
+ ///
+ public partial class AudioPropertiesView : UserControl
+ {
+ public AudioPropertiesView()
+ {
+ InitializeComponent();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesViewModel.cs b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesViewModel.cs
new file mode 100644
index 000000000..f3ce5015b
--- /dev/null
+++ b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesViewModel.cs
@@ -0,0 +1,18 @@
+using Artemis.Models.Interfaces;
+using Artemis.Profiles.Layers.Abstract;
+using Artemis.Profiles.Layers.Models;
+
+namespace Artemis.Profiles.Layers.Types.Audio
+{
+ public class AudioPropertiesViewModel : LayerPropertiesViewModel
+ {
+ public AudioPropertiesViewModel(LayerModel layerModel, IDataModel dataModel) : base(layerModel, dataModel)
+ {
+ }
+
+ public override void ApplyProperties()
+ {
+ LayerModel.Properties.Brush = Brush;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioType.cs b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioType.cs
new file mode 100644
index 000000000..a66778ac4
--- /dev/null
+++ b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioType.cs
@@ -0,0 +1,200 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows;
+using System.Windows.Media;
+using Artemis.Managers;
+using Artemis.Models.Interfaces;
+using Artemis.Modules.Effects.AudioVisualizer.Utilities;
+using Artemis.Profiles.Layers.Abstract;
+using Artemis.Profiles.Layers.Animations;
+using Artemis.Profiles.Layers.Interfaces;
+using Artemis.Profiles.Layers.Models;
+using Artemis.Properties;
+using Artemis.Utilities;
+using NAudio.CoreAudioApi;
+using NAudio.Wave;
+using Newtonsoft.Json;
+
+namespace Artemis.Profiles.Layers.Types.Audio
+{
+ internal class AudioType : ILayerType
+ {
+ private readonly MMDevice _device;
+ private readonly MainManager _mainManager;
+ private readonly SampleAggregator _sampleAggregator = new SampleAggregator(2048);
+ private readonly WasapiLoopbackCapture _waveIn;
+ private readonly List _audioLayers = new List();
+ private int _lines;
+ private AudioPropertiesModel _properties;
+ private AudioPropertiesModel _previousSettings;
+
+ public AudioType(MainManager mainManager)
+ {
+ _mainManager = mainManager;
+ _device =
+ new MMDeviceEnumerator().EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active).FirstOrDefault();
+
+ _sampleAggregator.FftCalculated += FftCalculated;
+ _sampleAggregator.PerformFFT = true;
+
+ // Start listening for sound data
+ _waveIn = new WasapiLoopbackCapture();
+ _waveIn.DataAvailable += OnDataAvailable;
+ _waveIn.StartRecording();
+ }
+
+ public List SpectrumData { get; set; } = new List();
+
+ public string Name { get; } = "Keyboard - Audio visualization";
+ public bool ShowInEdtor { get; } = true;
+ public DrawType DrawType { get; } = DrawType.Keyboard;
+
+ public ImageSource DrawThumbnail(LayerModel layer)
+ {
+ var thumbnailRect = new Rect(0, 0, 18, 18);
+ var visual = new DrawingVisual();
+ using (var c = visual.RenderOpen())
+ c.DrawImage(ImageUtilities.BitmapToBitmapImage(Resources.gif), thumbnailRect);
+
+ var image = new DrawingImage(visual.Drawing);
+ return image;
+ }
+
+ public void Draw(LayerModel layer, DrawingContext c)
+ {
+ lock (SpectrumData)
+ {
+ foreach (var audioLayer in _audioLayers)
+ audioLayer.LayerType.Draw(audioLayer, c);
+ }
+ }
+
+ public void Update(LayerModel layerModel, IDataModel dataModel, bool isPreview = false)
+ {
+ _lines = (int) layerModel.Properties.Width;
+ if (_device == null || isPreview)
+ return;
+
+ lock (SpectrumData)
+ {
+ 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;
+
+ 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.Update(null, false, true);
+ index++;
+ }
+ }
+ }
+
+ private void CompareSettings(LayerModel layerModel)
+ {
+ var settings = (AudioPropertiesModel) layerModel.Properties;
+ if (JsonConvert.SerializeObject(settings).Equals(JsonConvert.SerializeObject(_previousSettings)))
+ return;
+
+ _previousSettings = GeneralHelpers.Clone((AudioPropertiesModel) layerModel.Properties);
+
+ _audioLayers.Clear();
+ 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.Width = 1;
+ layer.Properties.Height = 0;
+ layer.LayerAnimation = new NoneAnimation();
+
+ // TODO: Setup the brush according to settings
+ layer.Properties.Brush = new SolidColorBrush(Colors.White);
+
+ _audioLayers.Add(layer);
+ layer.Update(null, false, true);
+ }
+ }
+
+ public void SetupProperties(LayerModel layerModel)
+ {
+ if (layerModel.Properties is AudioPropertiesModel)
+ return;
+
+ layerModel.Properties = new AudioPropertiesModel(layerModel.Properties)
+ {
+ FadeSpeed = 0.2,
+ Sensitivity = 2
+ };
+ }
+
+ public LayerPropertiesViewModel SetupViewModel(LayerPropertiesViewModel layerPropertiesViewModel,
+ List layerAnimations, IDataModel dataModel, LayerModel proposedLayer)
+ {
+ if (layerPropertiesViewModel is AudioPropertiesViewModel)
+ return layerPropertiesViewModel;
+ return new AudioPropertiesViewModel(proposedLayer, dataModel);
+ }
+
+ private void FftCalculated(object sender, FftEventArgs e)
+ {
+ lock (SpectrumData)
+ {
+ int x;
+ var b0 = 0;
+
+ SpectrumData.Clear();
+ for (x = 0; x < _lines; x++)
+ {
+ float peak = 0;
+ var b1 = (int) Math.Pow(2, x*10.0/(_lines - 1));
+ if (b1 > 2047)
+ b1 = 2047;
+ if (b1 <= b0)
+ b1 = b0 + 1;
+ for (; b0 < b1; b0++)
+ {
+ if (peak < e.Result[1 + b0].X)
+ peak = e.Result[1 + b0].X;
+ }
+ var y = (int) (Math.Sqrt(peak)*3*255 - 4);
+ if (y > 255)
+ y = 255;
+ if (y < 0)
+ y = 0;
+ SpectrumData.Add((byte) y);
+ }
+ }
+ }
+
+ private void OnDataAvailable(object sender, WaveInEventArgs e)
+ {
+ var buffer = e.Buffer;
+ var bytesRecorded = e.BytesRecorded;
+ var bufferIncrement = _waveIn.WaveFormat.BlockAlign;
+
+ for (var index = 0; index < bytesRecorded; index += bufferIncrement)
+ {
+ var sample32 = BitConverter.ToSingle(buffer, index);
+ _sampleAggregator.Add(sample32);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Artemis/Artemis/Profiles/Layers/Types/KeyPress/KeyPressType.cs b/Artemis/Artemis/Profiles/Layers/Types/KeyPress/KeyPressType.cs
index de4c1e3b4..72f9aa46d 100644
--- a/Artemis/Artemis/Profiles/Layers/Types/KeyPress/KeyPressType.cs
+++ b/Artemis/Artemis/Profiles/Layers/Types/KeyPress/KeyPressType.cs
@@ -65,6 +65,9 @@ namespace Artemis.Profiles.Layers.Types.KeyPress
_properties = (KeyPressPropertiesModel) layerModel.Properties;
+ if (isPreview)
+ return;
+
lock (_keyPressLayers)
{
// Remove expired key presses