1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-31 17:53:32 +00:00

Added default device change detection to audio layer

This commit is contained in:
SpoinkyNL 2017-01-14 16:49:26 +01:00
parent bc2508e4ac
commit ce90dda807
5 changed files with 95 additions and 9 deletions

View File

@ -493,6 +493,7 @@
<Compile Include="Profiles\Layers\Types\AmbientLight\ScreenCapturing\ScreenCaptureManager.cs" /> <Compile Include="Profiles\Layers\Types\AmbientLight\ScreenCapturing\ScreenCaptureManager.cs" />
<Compile Include="Profiles\Layers\Types\Audio\AudioCapturing\AudioCapture.cs" /> <Compile Include="Profiles\Layers\Types\Audio\AudioCapturing\AudioCapture.cs" />
<Compile Include="Profiles\Layers\Types\Audio\AudioCapturing\AudioCaptureManager.cs" /> <Compile Include="Profiles\Layers\Types\Audio\AudioCapturing\AudioCaptureManager.cs" />
<Compile Include="Events\AudioDeviceChangedEventArgs.cs" />
<Compile Include="Profiles\Layers\Types\Audio\AudioCapturing\BaseSpectrumProvider.cs" /> <Compile Include="Profiles\Layers\Types\Audio\AudioCapturing\BaseSpectrumProvider.cs" />
<Compile Include="Profiles\Layers\Types\Audio\AudioCapturing\ISpectrumProvider.cs" /> <Compile Include="Profiles\Layers\Types\Audio\AudioCapturing\ISpectrumProvider.cs" />
<Compile Include="Profiles\Layers\Types\Audio\AudioCapturing\LineSpectrum.cs" /> <Compile Include="Profiles\Layers\Types\Audio\AudioCapturing\LineSpectrum.cs" />

View File

@ -0,0 +1,17 @@
using System;
using CSCore.CoreAudioAPI;
namespace Artemis.Events
{
public class AudioDeviceChangedEventArgs : EventArgs
{
public AudioDeviceChangedEventArgs(MMDevice defaultPlayback, MMDevice defaultRecording)
{
DefaultPlayback = defaultPlayback;
DefaultRecording = defaultRecording;
}
public MMDevice DefaultPlayback { get; }
public MMDevice DefaultRecording { get; }
}
}

View File

@ -1,5 +1,8 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Timers;
using Artemis.Events;
using CSCore.CoreAudioAPI; using CSCore.CoreAudioAPI;
using Ninject.Extensions.Logging; using Ninject.Extensions.Logging;
@ -8,17 +11,41 @@ namespace Artemis.Profiles.Layers.Types.Audio.AudioCapturing
public class AudioCaptureManager public class AudioCaptureManager
{ {
private readonly List<AudioCapture> _audioCaptures; private readonly List<AudioCapture> _audioCaptures;
private MMDevice _lastDefaultPlayback;
private MMDevice _lastDefaultRecording;
public AudioCaptureManager(ILogger logger) public AudioCaptureManager(ILogger logger)
{ {
Logger = logger; Logger = logger;
_audioCaptures = new List<AudioCapture>(); _audioCaptures = new List<AudioCapture>();
_lastDefaultPlayback = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
_lastDefaultRecording = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia);
var defaultDeviceTimer = new Timer(1000);
defaultDeviceTimer.Elapsed += DefaultDeviceTimerOnElapsed;
defaultDeviceTimer.Start();
}
public event EventHandler<AudioDeviceChangedEventArgs> AudioDeviceChanged;
private void DefaultDeviceTimerOnElapsed(object sender, ElapsedEventArgs e)
{
var defaultPlayback = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
var defaultRecording = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia);
if (defaultPlayback.DeviceID == _lastDefaultPlayback.DeviceID &&
defaultRecording.DeviceID == _lastDefaultRecording.DeviceID)
return;
_lastDefaultPlayback = defaultPlayback;
_lastDefaultRecording = defaultRecording;
OnAudioDeviceChanged(new AudioDeviceChangedEventArgs(_lastDefaultPlayback, _lastDefaultRecording));
} }
public AudioCapture GetAudioCapture(MMDevice device) public AudioCapture GetAudioCapture(MMDevice device)
{ {
// Return existing audio capture if found // Return existing audio capture if found
var audioCapture = _audioCaptures.FirstOrDefault(a => a.Device == device); var audioCapture = _audioCaptures.FirstOrDefault(a => a.Device.DeviceID == device.DeviceID);
if (audioCapture != null) if (audioCapture != null)
return audioCapture; return audioCapture;
@ -29,5 +56,10 @@ namespace Artemis.Profiles.Layers.Types.Audio.AudioCapturing
} }
public ILogger Logger { get; set; } public ILogger Logger { get; set; }
protected virtual void OnAudioDeviceChanged(AudioDeviceChangedEventArgs e)
{
AudioDeviceChanged?.Invoke(this, e);
}
} }
} }

View File

@ -9,9 +9,23 @@ namespace Artemis.Profiles.Layers.Types.Audio
{ {
} }
public int Sensitivity { get; set; } [DefaultValue(MmDeviceType.Ouput)]
public double FadeSpeed { get; set; } public MmDeviceType DeviceType { get; set; }
[DefaultValue("Default")]
public string Device { get; set; }
[DefaultValue(Direction.BottomToTop)]
public Direction Direction { get; set; } public Direction Direction { get; set; }
[DefaultValue(ScalingStrategy.Decibel)]
public ScalingStrategy ScalingStrategy { get; set; }
}
public enum MmDeviceType
{
[Description("Ouput")] Ouput,
[Description("Input")] Input
} }
public enum Direction public enum Direction

View File

@ -1,6 +1,10 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Windows; using System.Windows;
using System.Windows.Media; using System.Windows.Media;
using Artemis.Events;
using Artemis.Modules.Abstract; using Artemis.Modules.Abstract;
using Artemis.Profiles.Layers.Abstract; using Artemis.Profiles.Layers.Abstract;
using Artemis.Profiles.Layers.Animations; using Artemis.Profiles.Layers.Animations;
@ -11,20 +15,35 @@ using Artemis.Properties;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.ViewModels; using Artemis.ViewModels;
using Artemis.ViewModels.Profiles; using Artemis.ViewModels.Profiles;
using CSCore.CoreAudioAPI;
namespace Artemis.Profiles.Layers.Types.Audio namespace Artemis.Profiles.Layers.Types.Audio
{ {
public class AudioType : ILayerType public class AudioType : ILayerType
{ {
private readonly AudioCaptureManager _audioCaptureManager;
private const GeometryCombineMode CombineMode = GeometryCombineMode.Union; private const GeometryCombineMode CombineMode = GeometryCombineMode.Union;
private readonly AudioCapture _audioCapture; private AudioCapture _audioCapture;
private int _lines; private int _lines;
private LineSpectrum _lineSpectrum; private LineSpectrum _lineSpectrum;
private List<double> _lineValues; private List<double> _lineValues;
private int _drawCount;
public AudioType(AudioCaptureManager audioCaptureManager) public AudioType(AudioCaptureManager audioCaptureManager)
{ {
_audioCapture = audioCaptureManager.GetAudioCapture(null); _audioCaptureManager = audioCaptureManager;
// TODO: Setup according to settings
_audioCapture = _audioCaptureManager.GetAudioCapture(MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Multimedia));
_audioCaptureManager.AudioDeviceChanged += OnAudioDeviceChanged;
}
private void OnAudioDeviceChanged(object sender, AudioDeviceChangedEventArgs e)
{
// TODO: Check if layer must use default
// TODO: Check recording type
_audioCapture = _audioCaptureManager.GetAudioCapture(e.DefaultPlayback);
_lines = 0;
} }
public string Name => "Keyboard - Audio visualization"; public string Name => "Keyboard - Audio visualization";
@ -46,6 +65,7 @@ namespace Artemis.Profiles.Layers.Types.Audio
public void Draw(LayerModel layerModel, DrawingContext c) public void Draw(LayerModel layerModel, DrawingContext c)
{ {
_drawCount++;
if (_lineValues == null) if (_lineValues == null)
return; return;
@ -136,8 +156,10 @@ namespace Artemis.Profiles.Layers.Types.Audio
layerModel.Properties = new AudioPropertiesModel(layerModel.Properties) layerModel.Properties = new AudioPropertiesModel(layerModel.Properties)
{ {
FadeSpeed = 0.2, DeviceType = MmDeviceType.Ouput,
Sensitivity = 2 Device = "Default",
Direction = Direction.BottomToTop,
ScalingStrategy = ScalingStrategy.Decibel
}; };
} }