diff --git a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesView.xaml b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesView.xaml
index 8d286d08c..a8feb17d2 100644
--- a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesView.xaml
+++ b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesView.xaml
@@ -34,24 +34,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
-
-
diff --git a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesViewModel.cs b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesViewModel.cs
index cc502a220..ca276c666 100644
--- a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesViewModel.cs
+++ b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioPropertiesViewModel.cs
@@ -1,17 +1,40 @@
-using Artemis.Profiles.Layers.Abstract;
+using System.Linq;
+using Artemis.Profiles.Layers.Abstract;
+using Artemis.Profiles.Layers.Interfaces;
using Artemis.ViewModels.Profiles;
+using Caliburn.Micro;
namespace Artemis.Profiles.Layers.Types.Audio
{
public class AudioPropertiesViewModel : LayerPropertiesViewModel
{
+ private ILayerAnimation _selectedLayerAnimation;
+
public AudioPropertiesViewModel(LayerEditorViewModel editorVm) : base(editorVm)
{
+ LayerAnimations = new BindableCollection(editorVm.LayerAnimations);
+ SelectedLayerAnimation =
+ LayerAnimations.FirstOrDefault(l => l.Name == editorVm.ProposedLayer.LayerAnimation?.Name) ??
+ LayerAnimations.First(l => l.Name == "None");
+ }
+
+ public BindableCollection LayerAnimations { get; set; }
+
+ public ILayerAnimation SelectedLayerAnimation
+ {
+ get { return _selectedLayerAnimation; }
+ set
+ {
+ if (Equals(value, _selectedLayerAnimation)) return;
+ _selectedLayerAnimation = value;
+ NotifyOfPropertyChange(() => SelectedLayerAnimation);
+ }
}
public override void ApplyProperties()
{
LayerModel.Properties.Brush = Brush;
+ LayerModel.LayerAnimation = SelectedLayerAnimation;
}
}
}
\ 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
index 5a71b24fa..e566def44 100644
--- a/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioType.cs
+++ b/Artemis/Artemis/Profiles/Layers/Types/Audio/AudioType.cs
@@ -6,7 +6,6 @@ using System.Windows.Media;
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;
@@ -15,6 +14,7 @@ using Artemis.ViewModels.Profiles;
using NAudio.CoreAudioApi;
using NAudio.Wave;
using Newtonsoft.Json;
+using Ninject;
using NLog;
namespace Artemis.Profiles.Layers.Types.Audio
@@ -24,15 +24,17 @@ namespace Artemis.Profiles.Layers.Types.Audio
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private readonly List _audioLayers = new List();
private readonly MMDevice _device;
+ private readonly IKernel _kernel;
private readonly SampleAggregator _sampleAggregator = new SampleAggregator(1024);
private readonly WasapiLoopbackCapture _waveIn;
private DateTime _lastAudioUpdate;
+ private DateTime _lastUpdate;
private int _lines;
private string _previousSettings;
- private DateTime _lastUpdate;
- public AudioType()
+ public AudioType(IKernel kernel)
{
+ _kernel = kernel;
_device = new MMDeviceEnumerator()
.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active).FirstOrDefault();
@@ -107,7 +109,7 @@ namespace Artemis.Profiles.Layers.Types.Audio
lock (SpectrumData)
{
- UpdateLayers(layerModel);
+ SetupLayers(layerModel);
if (SpectrumData.Any())
{
@@ -223,6 +225,7 @@ namespace Artemis.Profiles.Layers.Types.Audio
// Fake the height and width and update the animation
audioLayer.Properties.Width = settings.Width;
audioLayer.Properties.Height = settings.Height;
+ audioLayer.LastRender = DateTime.Now;
audioLayer.LayerAnimation?.Update(audioLayer, true);
// Restore the height and width
@@ -231,13 +234,11 @@ namespace Artemis.Profiles.Layers.Types.Audio
}
///
- /// Updates the inner layers when the settings have changed
+ /// Sets up the inner layers when the settings have changed
///
///
- private void UpdateLayers(LayerModel layerModel)
+ private void SetupLayers(LayerModel layerModel)
{
- // TODO: Animation every frame before checking settings
-
// Checking on settings update is expensive, only do it every second
if (DateTime.Now - _lastUpdate < TimeSpan.FromSeconds(1))
return;
@@ -245,9 +246,11 @@ namespace Artemis.Profiles.Layers.Types.Audio
var settings = (AudioPropertiesModel) layerModel.Properties;
var currentSettings = JsonConvert.SerializeObject(settings, Formatting.Indented);
- if (currentSettings == _previousSettings)
+ var currentType = _audioLayers.FirstOrDefault()?.LayerAnimation?.GetType();
+
+ if (currentSettings == _previousSettings && (layerModel.LayerAnimation.GetType() == currentType))
return;
-
+
_previousSettings = JsonConvert.SerializeObject(settings, Formatting.Indented);
_audioLayers.Clear();
@@ -255,51 +258,51 @@ namespace Artemis.Profiles.Layers.Types.Audio
{
case Direction.TopToBottom:
case Direction.BottomToTop:
- SetupVertical(settings);
+ SetupVertical(layerModel);
break;
case Direction.LeftToRight:
case Direction.RightToLeft:
- SetupHorizontal(settings);
+ SetupHorizontal(layerModel);
break;
default:
throw new ArgumentOutOfRangeException();
}
}
- private void SetupVertical(AudioPropertiesModel settings)
+ private void SetupVertical(LayerModel layerModel)
{
- _lines = (int) settings.Width;
+ _lines = (int) layerModel.Properties.Width;
for (var i = 0; i < _lines; i++)
{
var layer = LayerModel.CreateLayer();
- layer.Properties.X = settings.X + i;
- layer.Properties.Y = settings.Y;
+ layer.Properties.X = layerModel.Properties.X + i;
+ layer.Properties.Y = layerModel.Properties.Y;
layer.Properties.Width = 1;
layer.Properties.Height = 0;
- // TODO: Setup animation
- layer.LayerAnimation = new NoneAnimation();
- layer.Properties.Brush = settings.Brush;
+ layer.Properties.AnimationSpeed = layerModel.Properties.AnimationSpeed;
+ layer.Properties.Brush = layerModel.Properties.Brush;
layer.Properties.Contain = false;
+ layer.LayerAnimation = (ILayerAnimation) _kernel.Get(layerModel.LayerAnimation.GetType());
_audioLayers.Add(layer);
layer.Update(null, false, true);
}
}
- private void SetupHorizontal(AudioPropertiesModel settings)
+ private void SetupHorizontal(LayerModel layerModel)
{
- _lines = (int) settings.Height;
+ _lines = (int) layerModel.Properties.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.X = layerModel.Properties.X;
+ layer.Properties.Y = layerModel.Properties.Y + i;
layer.Properties.Width = 0;
layer.Properties.Height = 1;
- // TODO: Setup animation
- layer.LayerAnimation = new NoneAnimation();
- layer.Properties.Brush = settings.Brush;
+ layer.Properties.AnimationSpeed = layerModel.Properties.AnimationSpeed;
+ layer.Properties.Brush = layerModel.Properties.Brush;
layer.Properties.Contain = false;
+ layer.LayerAnimation = (ILayerAnimation) _kernel.Get(layerModel.LayerAnimation.GetType());
_audioLayers.Add(layer);
layer.Update(null, false, true);