mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
Fixed audio layer not picking up device change
This commit is contained in:
parent
eeb5c8aa90
commit
ab17119fbb
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Timers;
|
using System.Timers;
|
||||||
using Artemis.Events;
|
using Artemis.Events;
|
||||||
|
using Artemis.Profiles.Layers.Types.Audio;
|
||||||
using Artemis.Profiles.Layers.Types.Audio.AudioCapturing;
|
using Artemis.Profiles.Layers.Types.Audio.AudioCapturing;
|
||||||
using CSCore.CoreAudioAPI;
|
using CSCore.CoreAudioAPI;
|
||||||
using Ninject.Extensions.Logging;
|
using Ninject.Extensions.Logging;
|
||||||
@ -19,8 +20,8 @@ namespace Artemis.Managers
|
|||||||
{
|
{
|
||||||
Logger = logger;
|
Logger = logger;
|
||||||
_audioCaptures = new List<AudioCapture>();
|
_audioCaptures = new List<AudioCapture>();
|
||||||
_lastDefaultPlayback = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
|
_lastDefaultPlayback = MMDeviceEnumerator.TryGetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
|
||||||
_lastDefaultRecording = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia);
|
_lastDefaultRecording = MMDeviceEnumerator.TryGetDefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia);
|
||||||
|
|
||||||
var defaultDeviceTimer = new Timer(1000);
|
var defaultDeviceTimer = new Timer(1000);
|
||||||
defaultDeviceTimer.Elapsed += DefaultDeviceTimerOnElapsed;
|
defaultDeviceTimer.Elapsed += DefaultDeviceTimerOnElapsed;
|
||||||
@ -31,11 +32,11 @@ namespace Artemis.Managers
|
|||||||
|
|
||||||
private void DefaultDeviceTimerOnElapsed(object sender, ElapsedEventArgs e)
|
private void DefaultDeviceTimerOnElapsed(object sender, ElapsedEventArgs e)
|
||||||
{
|
{
|
||||||
var defaultPlayback = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
|
var defaultPlayback = MMDeviceEnumerator.TryGetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
|
||||||
var defaultRecording = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia);
|
var defaultRecording = MMDeviceEnumerator.TryGetDefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia);
|
||||||
|
|
||||||
if (defaultPlayback.DeviceID == _lastDefaultPlayback.DeviceID &&
|
if (defaultPlayback?.DeviceID == _lastDefaultPlayback?.DeviceID &&
|
||||||
defaultRecording.DeviceID == _lastDefaultRecording.DeviceID)
|
defaultRecording?.DeviceID == _lastDefaultRecording?.DeviceID)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_lastDefaultPlayback = defaultPlayback;
|
_lastDefaultPlayback = defaultPlayback;
|
||||||
@ -43,7 +44,7 @@ namespace Artemis.Managers
|
|||||||
OnAudioDeviceChanged(new AudioDeviceChangedEventArgs(_lastDefaultPlayback, _lastDefaultRecording));
|
OnAudioDeviceChanged(new AudioDeviceChangedEventArgs(_lastDefaultPlayback, _lastDefaultRecording));
|
||||||
}
|
}
|
||||||
|
|
||||||
public AudioCapture GetAudioCapture(MMDevice device)
|
public AudioCapture GetAudioCapture(MMDevice device, MmDeviceType type)
|
||||||
{
|
{
|
||||||
// Return existing audio capture if found
|
// Return existing audio capture if found
|
||||||
var audioCapture = _audioCaptures.FirstOrDefault(a => a.Device.DeviceID == device.DeviceID);
|
var audioCapture = _audioCaptures.FirstOrDefault(a => a.Device.DeviceID == device.DeviceID);
|
||||||
@ -51,7 +52,7 @@ namespace Artemis.Managers
|
|||||||
return audioCapture;
|
return audioCapture;
|
||||||
|
|
||||||
// Else create a new one and return that
|
// Else create a new one and return that
|
||||||
var newAudioCapture = new AudioCapture(Logger, device);
|
var newAudioCapture = new AudioCapture(Logger, device, type);
|
||||||
_audioCaptures.Add(newAudioCapture);
|
_audioCaptures.Add(newAudioCapture);
|
||||||
return newAudioCapture;
|
return newAudioCapture;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -91,7 +91,7 @@ namespace Artemis.Modules.Abstract
|
|||||||
|
|
||||||
private void UpdatedEnabledSetting()
|
private void UpdatedEnabledSetting()
|
||||||
{
|
{
|
||||||
if (!ModuleModel.IsGeneral || !_moduleManager.ActiveModule.IsGeneral || Settings.IsEnabled == IsModuleActive)
|
if (!ModuleModel.IsGeneral || (_moduleManager.ActiveModule != null && !_moduleManager.ActiveModule.IsGeneral || Settings.IsEnabled == IsModuleActive))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Settings.IsEnabled = IsModuleActive;
|
Settings.IsEnabled = IsModuleActive;
|
||||||
|
|||||||
@ -80,29 +80,32 @@ namespace Artemis.Modules.General.GeneralProfile
|
|||||||
|
|
||||||
private void SetupAudio()
|
private void SetupAudio()
|
||||||
{
|
{
|
||||||
_defaultRecording = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia);
|
_defaultRecording = MMDeviceEnumerator.TryGetDefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia);
|
||||||
_recordingInfo = AudioMeterInformation.FromDevice(_defaultRecording);
|
_defaultPlayback = MMDeviceEnumerator.TryGetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
|
||||||
_defaultPlayback = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
|
|
||||||
_playbackInfo = AudioMeterInformation.FromDevice(_defaultPlayback);
|
if (_defaultRecording != null)
|
||||||
|
_recordingInfo = AudioMeterInformation.FromDevice(_defaultRecording);
|
||||||
|
if (_defaultPlayback != null)
|
||||||
|
_playbackInfo = AudioMeterInformation.FromDevice(_defaultPlayback);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AudioDeviceChanged(object sender, AudioDeviceChangedEventArgs e)
|
private void AudioDeviceChanged(object sender, AudioDeviceChangedEventArgs e)
|
||||||
{
|
{
|
||||||
_defaultRecording = e.DefaultRecording;
|
_defaultRecording = e.DefaultRecording;
|
||||||
_recordingInfo = AudioMeterInformation.FromDevice(_defaultRecording);
|
|
||||||
_defaultPlayback = e.DefaultPlayback;
|
_defaultPlayback = e.DefaultPlayback;
|
||||||
_playbackInfo = AudioMeterInformation.FromDevice(_defaultPlayback);
|
|
||||||
|
if (_defaultRecording != null)
|
||||||
|
_recordingInfo = AudioMeterInformation.FromDevice(_defaultRecording);
|
||||||
|
if (_defaultPlayback != null)
|
||||||
|
_playbackInfo = AudioMeterInformation.FromDevice(_defaultPlayback);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateAudio(GeneralProfileDataModel dataModel)
|
private void UpdateAudio(GeneralProfileDataModel dataModel)
|
||||||
{
|
{
|
||||||
// Update microphone, only bother with OverallPeak
|
// Update microphone, only bother with OverallPeak
|
||||||
if (_defaultRecording != null)
|
if (_defaultRecording != null)
|
||||||
{
|
|
||||||
|
|
||||||
dataModel.Audio.Recording.OverallPeak = _recordingInfo.PeakValue;
|
dataModel.Audio.Recording.OverallPeak = _recordingInfo.PeakValue;
|
||||||
}
|
|
||||||
|
|
||||||
if (_defaultPlayback == null)
|
if (_defaultPlayback == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@ -17,8 +17,10 @@ namespace Artemis.Modules.Overlays.OverlayProfile
|
|||||||
Settings = SettingsProvider.Load<OverlayProfileSettings>();
|
Settings = SettingsProvider.Load<OverlayProfileSettings>();
|
||||||
DataModel = new OverlayProfileDataModel();
|
DataModel = new OverlayProfileDataModel();
|
||||||
|
|
||||||
var defaultPlayback = MMDeviceEnumerator.DefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
|
var defaultPlayback = MMDeviceEnumerator.TryGetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
|
||||||
_endPointVolume = AudioEndpointVolume.FromDevice(defaultPlayback);
|
if (defaultPlayback != null)
|
||||||
|
_endPointVolume = AudioEndpointVolume.FromDevice(defaultPlayback);
|
||||||
|
|
||||||
audioCaptureManager.AudioDeviceChanged += OnAudioDeviceChanged;
|
audioCaptureManager.AudioDeviceChanged += OnAudioDeviceChanged;
|
||||||
|
|
||||||
Enable();
|
Enable();
|
||||||
@ -30,7 +32,8 @@ namespace Artemis.Modules.Overlays.OverlayProfile
|
|||||||
|
|
||||||
private void OnAudioDeviceChanged(object sender, AudioDeviceChangedEventArgs e)
|
private void OnAudioDeviceChanged(object sender, AudioDeviceChangedEventArgs e)
|
||||||
{
|
{
|
||||||
_endPointVolume = AudioEndpointVolume.FromDevice(e.DefaultPlayback);
|
if (e.DefaultPlayback != null)
|
||||||
|
_endPointVolume = AudioEndpointVolume.FromDevice(e.DefaultPlayback);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Update()
|
public override void Update()
|
||||||
|
|||||||
@ -5,6 +5,7 @@ using CSCore;
|
|||||||
using CSCore.CoreAudioAPI;
|
using CSCore.CoreAudioAPI;
|
||||||
using CSCore.DSP;
|
using CSCore.DSP;
|
||||||
using CSCore.SoundIn;
|
using CSCore.SoundIn;
|
||||||
|
using CSCore.SoundOut;
|
||||||
using CSCore.Streams;
|
using CSCore.Streams;
|
||||||
using Ninject.Extensions.Logging;
|
using Ninject.Extensions.Logging;
|
||||||
|
|
||||||
@ -18,16 +19,17 @@ namespace Artemis.Profiles.Layers.Types.Audio.AudioCapturing
|
|||||||
private readonly Timer _disableTimer;
|
private readonly Timer _disableTimer;
|
||||||
private bool _mayStop;
|
private bool _mayStop;
|
||||||
private SingleSpectrum _singleSpectrum;
|
private SingleSpectrum _singleSpectrum;
|
||||||
private WasapiLoopbackCapture _soundIn;
|
private ISoundIn _soundIn;
|
||||||
private GainSource _source;
|
private GainSource _source;
|
||||||
private BasicSpectrumProvider _spectrumProvider;
|
private BasicSpectrumProvider _spectrumProvider;
|
||||||
private GainSource _volume;
|
private GainSource _volume;
|
||||||
private int _volumeIndex;
|
private int _volumeIndex;
|
||||||
|
|
||||||
public AudioCapture(ILogger logger, MMDevice device)
|
public AudioCapture(ILogger logger, MMDevice device, MmDeviceType type)
|
||||||
{
|
{
|
||||||
Logger = logger;
|
Logger = logger;
|
||||||
Device = device;
|
Device = device;
|
||||||
|
Type = type;
|
||||||
DesiredAverage = 0.75;
|
DesiredAverage = 0.75;
|
||||||
|
|
||||||
_volumeValues = new double[5];
|
_volumeValues = new double[5];
|
||||||
@ -40,6 +42,7 @@ namespace Artemis.Profiles.Layers.Types.Audio.AudioCapturing
|
|||||||
|
|
||||||
public ILogger Logger { get; }
|
public ILogger Logger { get; }
|
||||||
public MMDevice Device { get; }
|
public MMDevice Device { get; }
|
||||||
|
public MmDeviceType Type { get; }
|
||||||
public double DesiredAverage { get; set; }
|
public double DesiredAverage { get; set; }
|
||||||
|
|
||||||
public float Volume
|
public float Volume
|
||||||
@ -95,6 +98,8 @@ namespace Artemis.Profiles.Layers.Types.Audio.AudioCapturing
|
|||||||
|
|
||||||
public LineSpectrum GetLineSpectrum(int barCount, ScalingStrategy scalingStrategy)
|
public LineSpectrum GetLineSpectrum(int barCount, ScalingStrategy scalingStrategy)
|
||||||
{
|
{
|
||||||
|
if (_spectrumProvider == null)
|
||||||
|
return null;
|
||||||
return new LineSpectrum(FftSize)
|
return new LineSpectrum(FftSize)
|
||||||
{
|
{
|
||||||
SpectrumProvider = _spectrumProvider,
|
SpectrumProvider = _spectrumProvider,
|
||||||
@ -135,11 +140,20 @@ namespace Artemis.Profiles.Layers.Types.Audio.AudioCapturing
|
|||||||
{
|
{
|
||||||
Stop();
|
Stop();
|
||||||
|
|
||||||
_soundIn = new WasapiLoopbackCapture();
|
if (Type == MmDeviceType.Input)
|
||||||
|
{
|
||||||
|
_soundIn = Device != null
|
||||||
|
? new WasapiCapture {Device = Device}
|
||||||
|
: new WasapiCapture();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_soundIn = Device != null
|
||||||
|
? new WasapiLoopbackCapture {Device = Device}
|
||||||
|
: new WasapiLoopbackCapture();
|
||||||
|
}
|
||||||
|
|
||||||
_soundIn.Initialize();
|
_soundIn.Initialize();
|
||||||
// Not sure if this null check is needed but doesnt hurt
|
|
||||||
if (Device != null)
|
|
||||||
_soundIn.Device = Device;
|
|
||||||
|
|
||||||
var soundInSource = new SoundInSource(_soundIn);
|
var soundInSource = new SoundInSource(_soundIn);
|
||||||
_source = soundInSource.ToSampleSource().AppendSource(x => new GainSource(x), out _volume);
|
_source = soundInSource.ToSampleSource().AppendSource(x => new GainSource(x), out _volume);
|
||||||
@ -182,7 +196,7 @@ namespace Artemis.Profiles.Layers.Types.Audio.AudioCapturing
|
|||||||
{
|
{
|
||||||
Running = false;
|
Running = false;
|
||||||
|
|
||||||
|
|
||||||
if (_soundIn != null)
|
if (_soundIn != null)
|
||||||
{
|
{
|
||||||
_soundIn.Stop();
|
_soundIn.Stop();
|
||||||
|
|||||||
@ -11,6 +11,13 @@
|
|||||||
d:DesignHeight="600" d:DesignWidth="500">
|
d:DesignHeight="600" d:DesignWidth="500">
|
||||||
<UserControl.Resources>
|
<UserControl.Resources>
|
||||||
<converters:EnumDescriptionConverter x:Key="HEnumDescriptionConverter" />
|
<converters:EnumDescriptionConverter x:Key="HEnumDescriptionConverter" />
|
||||||
|
<ObjectDataProvider MethodName="GetValues"
|
||||||
|
ObjectType="{x:Type system:Enum}"
|
||||||
|
x:Key="MmDeviceTypeEnumValues">
|
||||||
|
<ObjectDataProvider.MethodParameters>
|
||||||
|
<x:Type TypeName="properties:MmDeviceType" />
|
||||||
|
</ObjectDataProvider.MethodParameters>
|
||||||
|
</ObjectDataProvider>
|
||||||
<ObjectDataProvider MethodName="GetValues"
|
<ObjectDataProvider MethodName="GetValues"
|
||||||
ObjectType="{x:Type system:Enum}"
|
ObjectType="{x:Type system:Enum}"
|
||||||
x:Key="DirectionEnumValues">
|
x:Key="DirectionEnumValues">
|
||||||
@ -54,22 +61,23 @@
|
|||||||
TickPlacement="None" TickFrequency="0.05"
|
TickPlacement="None" TickFrequency="0.05"
|
||||||
Value="{Binding Path=LayerModel.Properties.AnimationSpeed, Mode=TwoWay}" Minimum="0.05" Maximum="3"
|
Value="{Binding Path=LayerModel.Properties.AnimationSpeed, Mode=TwoWay}" Minimum="0.05" Maximum="3"
|
||||||
SmallChange="0" IsSnapToTickEnabled="True" Margin="10,12,10,2" Height="24" />
|
SmallChange="0" IsSnapToTickEnabled="True" Margin="10,12,10,2" Height="24" />
|
||||||
|
|
||||||
<!-- Volume sensitivity -->
|
|
||||||
<TextBlock Grid.Row="1" Grid.Column="0" Margin="10,13,10,10" FontSize="13.333" Text="Volume sensitivity:"
|
|
||||||
Height="18" VerticalAlignment="Top" />
|
|
||||||
<Slider x:Name="Scale" Grid.Row="1" Grid.Column="1" VerticalAlignment="Top"
|
|
||||||
Value="{Binding Path=LayerModel.Properties.Sensitivity, Mode=TwoWay}" Margin="10,12,10,2" Height="24"
|
|
||||||
TickPlacement="BottomRight" TickFrequency="1" Minimum="1" Maximum="10" SmallChange="1"
|
|
||||||
IsSnapToTickEnabled="True" />
|
|
||||||
|
|
||||||
<!-- Fade-out speed -->
|
<!-- Device type -->
|
||||||
<TextBlock Grid.Row="1" Grid.Column="2" Margin="10,13,10,10" FontSize="13.333" Text="Fade-out speed:"
|
<TextBlock Grid.Row="1" Grid.Column="0" Margin="10,13,10,10" FontSize="13.333" Text="Device type:"
|
||||||
|
Height="18" VerticalAlignment="Top" />
|
||||||
|
<ComboBox Grid.Row="1" Grid.Column="1" ItemsSource="{Binding Source={StaticResource MmDeviceTypeEnumValues}}"
|
||||||
|
Margin="10,10,10,0" SelectedItem="{Binding Path=DeviceType}"
|
||||||
|
VerticalAlignment="Top" Height="22">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock Text="{Binding Converter={StaticResource HEnumDescriptionConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
<!-- Device -->
|
||||||
|
<TextBlock Grid.Row="1" Grid.Column="2" Margin="10,13,10,10" FontSize="13.333" Text="Device:"
|
||||||
VerticalAlignment="Top" Height="18" />
|
VerticalAlignment="Top" Height="18" />
|
||||||
<Slider Grid.Row="1" Grid.Column="3" VerticalAlignment="Top"
|
<ComboBox Grid.Row="1" Grid.Column="3" x:Name="Devices" Margin="10,10,10,0" VerticalAlignment="Top" />
|
||||||
Value="{Binding Path=LayerModel.Properties.FadeSpeed, Mode=TwoWay}" Margin="10,12,10,2"
|
|
||||||
Height="24" TickPlacement="BottomRight" TickFrequency="0.1" Minimum="0.1" Maximum="1" SmallChange="0.1"
|
|
||||||
IsSnapToTickEnabled="True" />
|
|
||||||
|
|
||||||
<!-- Colors -->
|
<!-- Colors -->
|
||||||
<StackPanel Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Orientation="Horizontal" x:Name="ShowBrush">
|
<StackPanel Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Orientation="Horizontal" x:Name="ShowBrush">
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
using Artemis.Profiles.Layers.Abstract;
|
using Artemis.Profiles.Layers.Abstract;
|
||||||
using Artemis.Profiles.Layers.Interfaces;
|
using Artemis.Profiles.Layers.Interfaces;
|
||||||
using Artemis.ViewModels;
|
using Artemis.ViewModels;
|
||||||
using Artemis.ViewModels.Profiles;
|
|
||||||
using Caliburn.Micro;
|
using Caliburn.Micro;
|
||||||
|
using CSCore.CoreAudioAPI;
|
||||||
|
|
||||||
namespace Artemis.Profiles.Layers.Types.Audio
|
namespace Artemis.Profiles.Layers.Types.Audio
|
||||||
{
|
{
|
||||||
@ -14,12 +14,18 @@ namespace Artemis.Profiles.Layers.Types.Audio
|
|||||||
public AudioPropertiesViewModel(LayerEditorViewModel editorVm) : base(editorVm)
|
public AudioPropertiesViewModel(LayerEditorViewModel editorVm) : base(editorVm)
|
||||||
{
|
{
|
||||||
LayerAnimations = new BindableCollection<ILayerAnimation>(editorVm.LayerAnimations);
|
LayerAnimations = new BindableCollection<ILayerAnimation>(editorVm.LayerAnimations);
|
||||||
|
Devices = new BindableCollection<string>();
|
||||||
SelectedLayerAnimation =
|
SelectedLayerAnimation =
|
||||||
LayerAnimations.FirstOrDefault(l => l.Name == editorVm.ProposedLayer.LayerAnimation?.Name) ??
|
LayerAnimations.FirstOrDefault(l => l.Name == editorVm.ProposedLayer.LayerAnimation?.Name) ??
|
||||||
LayerAnimations.First(l => l.Name == "None");
|
LayerAnimations.First(l => l.Name == "None");
|
||||||
|
|
||||||
|
SetupAudioSelection();
|
||||||
|
if (SelectedDevice == null)
|
||||||
|
SelectedDevice = Devices.First();
|
||||||
}
|
}
|
||||||
|
|
||||||
public BindableCollection<ILayerAnimation> LayerAnimations { get; set; }
|
public BindableCollection<ILayerAnimation> LayerAnimations { get; set; }
|
||||||
|
public BindableCollection<string> Devices { get; set; }
|
||||||
|
|
||||||
public ILayerAnimation SelectedLayerAnimation
|
public ILayerAnimation SelectedLayerAnimation
|
||||||
{
|
{
|
||||||
@ -32,6 +38,45 @@ namespace Artemis.Profiles.Layers.Types.Audio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MmDeviceType DeviceType
|
||||||
|
{
|
||||||
|
get { return ((AudioPropertiesModel) LayerModel.Properties).DeviceType; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value == ((AudioPropertiesModel) LayerModel.Properties).DeviceType) return;
|
||||||
|
((AudioPropertiesModel) LayerModel.Properties).DeviceType = value;
|
||||||
|
SetupAudioSelection();
|
||||||
|
SelectedDevice = Devices.First();
|
||||||
|
NotifyOfPropertyChange(() => DeviceType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SelectedDevice
|
||||||
|
{
|
||||||
|
get { return ((AudioPropertiesModel) LayerModel.Properties).Device; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value == ((AudioPropertiesModel) LayerModel.Properties).Device) return;
|
||||||
|
((AudioPropertiesModel) LayerModel.Properties).Device = value;
|
||||||
|
NotifyOfPropertyChange(() => SelectedDevice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetupAudioSelection()
|
||||||
|
{
|
||||||
|
var properties = (AudioPropertiesModel) LayerModel.Properties;
|
||||||
|
|
||||||
|
Devices.Clear();
|
||||||
|
Devices.Add("Default");
|
||||||
|
|
||||||
|
// Select the proper devices and make sure they are unique
|
||||||
|
Devices.AddRange(properties.DeviceType == MmDeviceType.Input
|
||||||
|
? MMDeviceEnumerator.EnumerateDevices(DataFlow.Capture, DeviceState.Active)
|
||||||
|
.Select(d => d.FriendlyName).GroupBy(d => d).Select(g => g.First())
|
||||||
|
: MMDeviceEnumerator.EnumerateDevices(DataFlow.Render, DeviceState.Active)
|
||||||
|
.Select(d => d.FriendlyName).GroupBy(d => d).Select(g => g.First()));
|
||||||
|
}
|
||||||
|
|
||||||
public override void ApplyProperties()
|
public override void ApplyProperties()
|
||||||
{
|
{
|
||||||
LayerModel.Properties.Brush = Brush;
|
LayerModel.Properties.Brush = Brush;
|
||||||
|
|||||||
@ -1,7 +1,5 @@
|
|||||||
using System;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Generic;
|
using System.Linq;
|
||||||
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.Events;
|
||||||
@ -15,7 +13,6 @@ using Artemis.Profiles.Layers.Types.Audio.AudioCapturing;
|
|||||||
using Artemis.Properties;
|
using Artemis.Properties;
|
||||||
using Artemis.Utilities;
|
using Artemis.Utilities;
|
||||||
using Artemis.ViewModels;
|
using Artemis.ViewModels;
|
||||||
using Artemis.ViewModels.Profiles;
|
|
||||||
using CSCore.CoreAudioAPI;
|
using CSCore.CoreAudioAPI;
|
||||||
|
|
||||||
namespace Artemis.Profiles.Layers.Types.Audio
|
namespace Artemis.Profiles.Layers.Types.Audio
|
||||||
@ -27,22 +24,21 @@ namespace Artemis.Profiles.Layers.Types.Audio
|
|||||||
private int _lines;
|
private int _lines;
|
||||||
private LineSpectrum _lineSpectrum;
|
private LineSpectrum _lineSpectrum;
|
||||||
private List<double> _lineValues;
|
private List<double> _lineValues;
|
||||||
|
private AudioPropertiesModel _properties;
|
||||||
|
private bool _subscribed;
|
||||||
|
|
||||||
public AudioType(AudioCaptureManager audioCaptureManager)
|
public AudioType(AudioCaptureManager audioCaptureManager)
|
||||||
{
|
{
|
||||||
_audioCaptureManager = audioCaptureManager;
|
_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)
|
private void SubscribeToAudioChange()
|
||||||
{
|
{
|
||||||
// TODO: Check if layer must use default
|
if (_subscribed)
|
||||||
// TODO: Check recording type
|
return;
|
||||||
_audioCapture = _audioCaptureManager.GetAudioCapture(e.DefaultPlayback);
|
|
||||||
_lines = 0;
|
_audioCaptureManager.AudioDeviceChanged += OnAudioDeviceChanged;
|
||||||
|
_subscribed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Name => "Keyboard - Audio visualization";
|
public string Name => "Keyboard - Audio visualization";
|
||||||
@ -73,7 +69,7 @@ namespace Artemis.Profiles.Layers.Types.Audio
|
|||||||
var direction = ((AudioPropertiesModel) layerModel.Properties).Direction;
|
var direction = ((AudioPropertiesModel) layerModel.Properties).Direction;
|
||||||
|
|
||||||
// Create a geometry that will be formed by all the bars
|
// Create a geometry that will be formed by all the bars
|
||||||
GeometryGroup barGeometry = new GeometryGroup();
|
var barGeometry = new GeometryGroup();
|
||||||
|
|
||||||
switch (direction)
|
switch (direction)
|
||||||
{
|
{
|
||||||
@ -121,6 +117,25 @@ namespace Artemis.Profiles.Layers.Types.Audio
|
|||||||
public void Update(LayerModel layerModel, ModuleDataModel dataModel, bool isPreview = false)
|
public void Update(LayerModel layerModel, ModuleDataModel dataModel, bool isPreview = false)
|
||||||
{
|
{
|
||||||
layerModel.ApplyProperties(true);
|
layerModel.ApplyProperties(true);
|
||||||
|
var newProperties = (AudioPropertiesModel) layerModel.Properties;
|
||||||
|
if (_properties == null)
|
||||||
|
_properties = newProperties;
|
||||||
|
|
||||||
|
SubscribeToAudioChange();
|
||||||
|
|
||||||
|
if (_audioCapture == null || newProperties.Device != _properties.Device ||
|
||||||
|
newProperties.DeviceType != _properties.DeviceType)
|
||||||
|
{
|
||||||
|
var device = GetMmDevice();
|
||||||
|
if (device != null)
|
||||||
|
_audioCapture = _audioCaptureManager.GetAudioCapture(device, newProperties.DeviceType);
|
||||||
|
}
|
||||||
|
|
||||||
|
_properties = newProperties;
|
||||||
|
|
||||||
|
if (_audioCapture == null)
|
||||||
|
return;
|
||||||
|
|
||||||
_audioCapture.Pulse();
|
_audioCapture.Pulse();
|
||||||
|
|
||||||
var direction = ((AudioPropertiesModel) layerModel.Properties).Direction;
|
var direction = ((AudioPropertiesModel) layerModel.Properties).Direction;
|
||||||
@ -142,6 +157,8 @@ namespace Artemis.Profiles.Layers.Types.Audio
|
|||||||
{
|
{
|
||||||
_lines = currentLines;
|
_lines = currentLines;
|
||||||
_lineSpectrum = _audioCapture.GetLineSpectrum(_lines, ScalingStrategy.Decibel);
|
_lineSpectrum = _audioCapture.GetLineSpectrum(_lines, ScalingStrategy.Decibel);
|
||||||
|
if (_lineSpectrum == null)
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var newLineValues = _lineSpectrum?.GetLineValues(currentHeight);
|
var newLineValues = _lineSpectrum?.GetLineValues(currentHeight);
|
||||||
@ -183,8 +200,8 @@ namespace Artemis.Profiles.Layers.Types.Audio
|
|||||||
// Otherwise draw the rectangle with its layer.AppliedProperties dimensions and brush
|
// Otherwise draw the rectangle with its layer.AppliedProperties dimensions and brush
|
||||||
var rect = layerModel.Properties.Contain
|
var rect = layerModel.Properties.Contain
|
||||||
? layerModel.LayerRect()
|
? layerModel.LayerRect()
|
||||||
: new Rect(layerModel.Properties.X*4, layerModel.Properties.Y*4,
|
: new Rect(layerModel.Properties.X * 4, layerModel.Properties.Y * 4,
|
||||||
layerModel.Properties.Width*4, layerModel.Properties.Height*4);
|
layerModel.Properties.Width * 4, layerModel.Properties.Height * 4);
|
||||||
|
|
||||||
var clip = layerModel.LayerRect(DrawScale);
|
var clip = layerModel.LayerRect(DrawScale);
|
||||||
|
|
||||||
@ -196,5 +213,40 @@ namespace Artemis.Profiles.Layers.Types.Audio
|
|||||||
c.DrawRectangle(brush, null, rect);
|
c.DrawRectangle(brush, null, rect);
|
||||||
c.Pop();
|
c.Pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnAudioDeviceChanged(object sender, AudioDeviceChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (_properties == null || _properties.Device != "Default")
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_properties.DeviceType == MmDeviceType.Input)
|
||||||
|
{
|
||||||
|
if (e.DefaultRecording != null)
|
||||||
|
_audioCapture = _audioCaptureManager.GetAudioCapture(e.DefaultRecording, MmDeviceType.Input);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (e.DefaultPlayback != null)
|
||||||
|
_audioCapture = _audioCaptureManager.GetAudioCapture(e.DefaultPlayback, MmDeviceType.Ouput);
|
||||||
|
}
|
||||||
|
|
||||||
|
_lines = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MMDevice GetMmDevice()
|
||||||
|
{
|
||||||
|
if (_properties == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (_properties.DeviceType == MmDeviceType.Input)
|
||||||
|
return _properties.Device == "Default"
|
||||||
|
? MMDeviceEnumerator.TryGetDefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia)
|
||||||
|
: MMDeviceEnumerator.EnumerateDevices(DataFlow.Capture)
|
||||||
|
.FirstOrDefault(d => d.FriendlyName == _properties.Device);
|
||||||
|
return _properties.Device == "Default"
|
||||||
|
? MMDeviceEnumerator.TryGetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia)
|
||||||
|
: MMDeviceEnumerator.EnumerateDevices(DataFlow.Render)
|
||||||
|
.FirstOrDefault(d => d.FriendlyName == _properties.Device);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user