- fix controllable collection

master
Simon G 5 years ago
parent 8f90b394a7
commit 6a0e4d8e33
  1. 9
      Lib.Audio/Controllable.cs
  2. 62
      Lib.Audio/ControllableCollector.cs
  3. 2
      Lib.Audio/Factories/IControllableFactory.cs

@ -10,11 +10,18 @@ namespace Lib.Audio
public class Controllable : IControllable
{
private readonly AudioSessionControl _audioSessionControl;
private readonly string _name;
public Controllable(AudioSessionControl audioSessionControl) => _audioSessionControl = audioSessionControl;
public Controllable(AudioSessionControl audioSessionControl, string name)
{
_audioSessionControl = audioSessionControl;
_name = name;
}
public void SetVolume(float volume) => _audioSessionControl.SimpleAudioVolume.Volume = volume;
public void Mute() => _audioSessionControl.SimpleAudioVolume.Mute = true;
public void UnMute() => _audioSessionControl.SimpleAudioVolume.Mute = false;
public override string ToString() => _name;
}
}

@ -2,18 +2,21 @@
// Created: 2021-04-08
// Copyright(c) 2021 SimonG. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Lib.Audio.Factories;
using Lib.Audio.Interfaces;
using NAudio.CoreAudioApi;
using NAudio.CoreAudioApi.Interfaces;
namespace Lib.Audio
{
public class ControllableCollector : IControllableCollector
{
private readonly IControllableFactory _controllableFactory;
public ControllableCollector(IControllableFactory controllableFactory) => _controllableFactory = controllableFactory;
public List<IControllable> Controllables => CreateControllables();
@ -22,7 +25,62 @@ namespace Lib.Audio
MMDeviceEnumerator deviceEnumerator = new();
MMDeviceCollection? audioDevices = deviceEnumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active);
return audioDevices.Select(a => _controllableFactory.Create(a.AudioSessionManager.AudioSessionControl)).ToList();
List<IControllable> controllables = new();
controllables.AddRange(audioDevices.Select(a => _controllableFactory.Create(a.AudioSessionManager.AudioSessionControl, a.FriendlyName)));
Dictionary<string, List<AudioSessionControl>> sessionsById = new();
foreach (var audioDevice in audioDevices)
{
SessionCollection sessions = audioDevice.AudioSessionManager.Sessions;
for (int i = 0; i < sessions.Count; i++)
{
AudioSessionControl session = sessions[i];
if (session.State == AudioSessionState.AudioSessionStateExpired)
continue;
string searchIdentifier = session.GetSessionIdentifier[(session.GetSessionIdentifier.IndexOf("|", StringComparison.Ordinal) + 1)..];
if (!sessionsById.ContainsKey(searchIdentifier))
sessionsById[searchIdentifier] = new List<AudioSessionControl>();
sessionsById[searchIdentifier].Add(session);
}
}
foreach (var id in sessionsById.Keys.ToList())
{
List<AudioSessionControl> idSessions = sessionsById[id];
(Process? process, AudioSessionControl? audioSessionControl) = FindProcess(idSessions);
if (audioSessionControl == null || process == default && !idSessions.Any(s => s.IsSystemSoundsSession))
continue;
string name;
if (idSessions.Any(s => s.IsSystemSoundsSession))
name = "System Sounds";
else if (process != null)
name = process.ProcessName;
else
name = id;
controllables.Add(_controllableFactory.Create(audioSessionControl, name));
}
return controllables;
}
private (Process? process, AudioSessionControl? session) FindProcess(List<AudioSessionControl> sessions)
{
try
{
foreach (var session in sessions)
return (Process.GetProcessById((int) session.GetProcessID), session);
}
catch (ArgumentException)
{
}
return (null, null);
}
}
}

@ -9,6 +9,6 @@ namespace Lib.Audio.Factories
{
public interface IControllableFactory
{
IControllable Create(AudioSessionControl audioSessionControl);
IControllable Create(AudioSessionControl audioSessionControl, string name);
}
}
Loading…
Cancel
Save