From 25ef8ffac5fca6d58fa5b3c76b012b1bde167bb0 Mon Sep 17 00:00:00 2001 From: Sean Chapman Date: Sun, 1 Dec 2013 20:44:08 +1300 Subject: [PATCH] Introduced AudioContext, a class for wrapping all related device functionality into one place, will also provide a single point of extension. Created a SystemAudioContext class for the system devices. Resharper code cleanup! --- AudioSwitcher.AudioApi/AudioContext.cs | 30 ++++++++++++++ .../AudioController.Generic.cs | 12 +----- AudioSwitcher.AudioApi/AudioController.cs | 19 ++++++++- .../AudioDeviceChangedHandler.cs | 1 - .../AudioDeviceEventType.cs | 2 +- .../AudioSwitcher.AudioApi.csproj | 4 ++ AudioSwitcher.AudioApi/DataFlow.cs | 5 ++- .../IPreferredDeviceManager.cs | 30 ++++++++++++++ .../Internal/Interfaces/IPolicyConfigVista.cs | 5 --- .../Internal/PolicyConfig.cs | 4 +- .../Internal/PolicyConfigVista.cs | 4 +- .../PreferredDeviceManager.cs | 39 +++++++++++++++++++ .../System/SystemAudioContext.cs | 15 +++++++ .../System/SystemAudioDevice.cs | 4 +- 14 files changed, 148 insertions(+), 26 deletions(-) create mode 100644 AudioSwitcher.AudioApi/AudioContext.cs create mode 100644 AudioSwitcher.AudioApi/IPreferredDeviceManager.cs create mode 100644 AudioSwitcher.AudioApi/PreferredDeviceManager.cs create mode 100644 AudioSwitcher.AudioApi/System/SystemAudioContext.cs diff --git a/AudioSwitcher.AudioApi/AudioContext.cs b/AudioSwitcher.AudioApi/AudioContext.cs new file mode 100644 index 0000000..f760607 --- /dev/null +++ b/AudioSwitcher.AudioApi/AudioContext.cs @@ -0,0 +1,30 @@ +namespace AudioSwitcher.AudioApi +{ + public abstract class AudioContext + { + + public AudioController Controller + { + get; + private set; + } + + public PreferredDeviceManager PreferredDeviceManager + { + get; + private set; + } + + protected AudioContext(AudioController controller, PreferredDeviceManager preferredDeviceManager) + { + Controller = controller; + PreferredDeviceManager = preferredDeviceManager; + + if (Controller != null) + Controller.Context = this; + + if (PreferredDeviceManager != null) + PreferredDeviceManager.Context = this; + } + } +} \ No newline at end of file diff --git a/AudioSwitcher.AudioApi/AudioController.Generic.cs b/AudioSwitcher.AudioApi/AudioController.Generic.cs index cc26533..c9eeeb9 100644 --- a/AudioSwitcher.AudioApi/AudioController.Generic.cs +++ b/AudioSwitcher.AudioApi/AudioController.Generic.cs @@ -1,19 +1,16 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Runtime.InteropServices; namespace AudioSwitcher.AudioApi { - [ComVisible(false)] public abstract class AudioController : AudioController where T : AudioDevice { protected AudioController(IDeviceEnumerator devEnum) + : base(devEnum) { - DeviceEnumerator = devEnum; - DeviceEnumerator.AudioDeviceChanged += DeviceEnumerator_AudioDeviceChanged; } protected new IDeviceEnumerator DeviceEnumerator @@ -42,11 +39,6 @@ protected AudioController(IDeviceEnumerator devEnum) get { return base.DefaultRecordingCommDevice as T; } } - private void DeviceEnumerator_AudioDeviceChanged(object sender, AudioDeviceChangedEventArgs e) - { - OnAudioDeviceChanged(sender, e); - } - public new IEnumerable GetPlaybackDevices(DeviceState deviceState = DefaultDeviceStateFilter) { return DeviceEnumerator.GetAudioDevices(DataFlow.Render, deviceState); @@ -72,4 +64,4 @@ public virtual bool SetDefaultCommunicationsDevice(T dev) return base.SetDefaultCommunicationsDevice(dev); } } -} +} \ No newline at end of file diff --git a/AudioSwitcher.AudioApi/AudioController.cs b/AudioSwitcher.AudioApi/AudioController.cs index 913af4c..b854ca4 100644 --- a/AudioSwitcher.AudioApi/AudioController.cs +++ b/AudioSwitcher.AudioApi/AudioController.cs @@ -8,10 +8,19 @@ namespace AudioSwitcher.AudioApi [ComVisible(false)] public abstract class AudioController { - protected const DeviceState DefaultDeviceStateFilter = DeviceState.Active | DeviceState.Unplugged | DeviceState.Disabled; + protected const DeviceState DefaultDeviceStateFilter = + DeviceState.Active | DeviceState.Unplugged | DeviceState.Disabled; + + protected AudioController(IDeviceEnumerator enumerator) + { + DeviceEnumerator = enumerator; + DeviceEnumerator.AudioDeviceChanged += DeviceEnumerator_AudioDeviceChanged; + } protected IDeviceEnumerator DeviceEnumerator { get; set; } + public AudioContext Context { get; internal set; } + public virtual AudioDevice DefaultPlaybackDevice { get { return DeviceEnumerator.DefaultPlaybackDevice; } @@ -34,11 +43,17 @@ public virtual AudioDevice DefaultRecordingCommDevice public virtual event AudioDeviceChangedHandler AudioDeviceChanged; - protected virtual void OnAudioDeviceChanged(object sender, AudioDeviceChangedEventArgs e) + private void DeviceEnumerator_AudioDeviceChanged(object sender, AudioDeviceChangedEventArgs e) { //Bubble the event if (AudioDeviceChanged != null) AudioDeviceChanged(sender, e); + + OnAudioDeviceChanged(sender, e); + } + + protected virtual void OnAudioDeviceChanged(object sender, AudioDeviceChangedEventArgs e) + { } public IEnumerable GetPlaybackDevices(DeviceState deviceState = DefaultDeviceStateFilter) diff --git a/AudioSwitcher.AudioApi/AudioDeviceChangedHandler.cs b/AudioSwitcher.AudioApi/AudioDeviceChangedHandler.cs index 339e9c0..2b3db31 100644 --- a/AudioSwitcher.AudioApi/AudioDeviceChangedHandler.cs +++ b/AudioSwitcher.AudioApi/AudioDeviceChangedHandler.cs @@ -6,5 +6,4 @@ /// /// public delegate void AudioDeviceChangedHandler(object sender, AudioDeviceChangedEventArgs e); - } \ No newline at end of file diff --git a/AudioSwitcher.AudioApi/AudioDeviceEventType.cs b/AudioSwitcher.AudioApi/AudioDeviceEventType.cs index c0d3e88..3f9ce7e 100644 --- a/AudioSwitcher.AudioApi/AudioDeviceEventType.cs +++ b/AudioSwitcher.AudioApi/AudioDeviceEventType.cs @@ -1,7 +1,7 @@ namespace AudioSwitcher.AudioApi { /// - /// The type of change raised + /// The type of change raised /// public enum AudioDeviceEventType { diff --git a/AudioSwitcher.AudioApi/AudioSwitcher.AudioApi.csproj b/AudioSwitcher.AudioApi/AudioSwitcher.AudioApi.csproj index 26c6063..74e6691 100644 --- a/AudioSwitcher.AudioApi/AudioSwitcher.AudioApi.csproj +++ b/AudioSwitcher.AudioApi/AudioSwitcher.AudioApi.csproj @@ -42,6 +42,7 @@ + @@ -90,10 +91,13 @@ + + + diff --git a/AudioSwitcher.AudioApi/DataFlow.cs b/AudioSwitcher.AudioApi/DataFlow.cs index f49c4d4..e70577e 100644 --- a/AudioSwitcher.AudioApi/DataFlow.cs +++ b/AudioSwitcher.AudioApi/DataFlow.cs @@ -1,9 +1,12 @@ -namespace AudioSwitcher.AudioApi +using System; + +namespace AudioSwitcher.AudioApi { /// /// The EDataFlow enumeration defines constants that indicate the direction /// in which audio data flows between an audio endpoint device and an application /// + [Flags] public enum DataFlow { /// diff --git a/AudioSwitcher.AudioApi/IPreferredDeviceManager.cs b/AudioSwitcher.AudioApi/IPreferredDeviceManager.cs new file mode 100644 index 0000000..475a278 --- /dev/null +++ b/AudioSwitcher.AudioApi/IPreferredDeviceManager.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.IO; + +namespace AudioSwitcher.AudioApi +{ + public interface IPreferredDeviceManager + { + AudioContext Context { get; } + + IEnumerable PreferredDevices { get; } + + AudioDevice NextPlaybackDevice(); + + AudioDevice PreviousPlaybackDevice(); + + AudioDevice NextRecordingDevice(); + + AudioDevice PreviousRecordingDevice(); + + void AddDevice(AudioDevice ad, int position = 0); + + void RemoveDevice(AudioDevice ad); + + bool IsPreferredDevice(AudioDevice ad); + + void Save(Stream s); + + void Load(Stream s); + } +} \ No newline at end of file diff --git a/AudioSwitcher.AudioApi/Internal/Interfaces/IPolicyConfigVista.cs b/AudioSwitcher.AudioApi/Internal/Interfaces/IPolicyConfigVista.cs index 0a1c10c..8e9f5b6 100644 --- a/AudioSwitcher.AudioApi/Internal/Interfaces/IPolicyConfigVista.cs +++ b/AudioSwitcher.AudioApi/Internal/Interfaces/IPolicyConfigVista.cs @@ -27,7 +27,6 @@ internal interface IPolicyConfigVista int GetMixFormat(string pszDeviceName, WAVEFORMATEX waveFormat); // not available on Windows 7, use method from IPolicyConfig - [PreserveSig] int GetDeviceFormat(string pszDeviceName, int bDefault, WAVEFORMATEX ppFormat); @@ -38,22 +37,18 @@ internal interface IPolicyConfigVista int GetProcessingPeriod(string pszDeviceName, int input2, long long1, long long2); // not available on Windows 7, use method from IPolicyConfig - [PreserveSig] int SetProcessingPeriod(string pszDeviceName, long long1); // not available on Windows 7, use method from IPolicyConfig - [PreserveSig] int GetShareMode(string pszDeviceName, DeviceShareMode devShareMode); // not available on Windows 7, use method from IPolicyConfig - [PreserveSig] int SetShareMode(string pszDeviceName, DeviceShareMode shareMode); // not available on Windows 7, use method from IPolicyConfig - [PreserveSig] int GetPropertyValue(string pszDeviceName, out PropertyKey propKey, out PropVariant propVariant); diff --git a/AudioSwitcher.AudioApi/Internal/PolicyConfig.cs b/AudioSwitcher.AudioApi/Internal/PolicyConfig.cs index 797b3b3..21085c4 100644 --- a/AudioSwitcher.AudioApi/Internal/PolicyConfig.cs +++ b/AudioSwitcher.AudioApi/Internal/PolicyConfig.cs @@ -1,5 +1,5 @@ -using System.Runtime.InteropServices; -// This has been modified for use by Audio Switcher +// This has been modified for use by Audio Switcher +using System.Runtime.InteropServices; using AudioSwitcher.AudioApi.Interfaces; namespace AudioSwitcher.AudioApi diff --git a/AudioSwitcher.AudioApi/Internal/PolicyConfigVista.cs b/AudioSwitcher.AudioApi/Internal/PolicyConfigVista.cs index 54150fb..fa2127c 100644 --- a/AudioSwitcher.AudioApi/Internal/PolicyConfigVista.cs +++ b/AudioSwitcher.AudioApi/Internal/PolicyConfigVista.cs @@ -1,5 +1,5 @@ -using System.Runtime.InteropServices; -// This has been modified for use by Audio Switcher +// This has been modified for use by Audio Switcher +using System.Runtime.InteropServices; using AudioSwitcher.AudioApi.Interfaces; namespace AudioSwitcher.AudioApi diff --git a/AudioSwitcher.AudioApi/PreferredDeviceManager.cs b/AudioSwitcher.AudioApi/PreferredDeviceManager.cs new file mode 100644 index 0000000..015dcd7 --- /dev/null +++ b/AudioSwitcher.AudioApi/PreferredDeviceManager.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using System.IO; + +namespace AudioSwitcher.AudioApi +{ + /// + /// Used to manage the preferred devices + /// + public abstract class PreferredDeviceManager : IPreferredDeviceManager + { + protected PreferredDeviceManager(AudioController controller) + { + Controller = controller; + } + + public AudioController Controller { get; private set; } + public AudioContext Context { get; internal set; } + + public abstract IEnumerable PreferredDevices { get; } + + public abstract AudioDevice NextPlaybackDevice(); + + public abstract AudioDevice PreviousPlaybackDevice(); + + public abstract AudioDevice NextRecordingDevice(); + + public abstract AudioDevice PreviousRecordingDevice(); + + public abstract void AddDevice(AudioDevice ad, int position = 0); + + public abstract void RemoveDevice(AudioDevice ad); + + public abstract bool IsPreferredDevice(AudioDevice ad); + + public abstract void Save(Stream s); + + public abstract void Load(Stream s); + } +} \ No newline at end of file diff --git a/AudioSwitcher.AudioApi/System/SystemAudioContext.cs b/AudioSwitcher.AudioApi/System/SystemAudioContext.cs new file mode 100644 index 0000000..4da6cca --- /dev/null +++ b/AudioSwitcher.AudioApi/System/SystemAudioContext.cs @@ -0,0 +1,15 @@ +namespace AudioSwitcher.AudioApi.System +{ + public class SystemAudioContext : AudioContext + { + public SystemAudioContext() + : this(null) + { + } + + public SystemAudioContext(PreferredDeviceManager preferredDeviceManager) + : base(new SystemAudioController(), preferredDeviceManager) + { + } + } +} \ No newline at end of file diff --git a/AudioSwitcher.AudioApi/System/SystemAudioDevice.cs b/AudioSwitcher.AudioApi/System/SystemAudioDevice.cs index d1e369c..3076ec8 100644 --- a/AudioSwitcher.AudioApi/System/SystemAudioDevice.cs +++ b/AudioSwitcher.AudioApi/System/SystemAudioDevice.cs @@ -9,8 +9,8 @@ public sealed class SystemAudioDevice : AudioDevice { private Guid? _id; - internal SystemAudioDevice(MMDevice device, IDeviceEnumerator controller) - : base(controller) + internal SystemAudioDevice(MMDevice device, IDeviceEnumerator enumerator) + : base(enumerator) { if (device == null) throw new ArgumentNullException("device", "Device cannot be null. Something bad went wrong");