Skip to content

Commit

Permalink
Introduced AudioContext, a class for wrapping all related device func…
Browse files Browse the repository at this point in the history
…tionality into one place, will also provide a single point of extension.

Created a SystemAudioContext class for the system devices.

Resharper code cleanup!
  • Loading branch information
xenolightning committed Dec 1, 2013
1 parent 4019a0c commit 25ef8ff
Show file tree
Hide file tree
Showing 14 changed files with 148 additions and 26 deletions.
30 changes: 30 additions & 0 deletions AudioSwitcher.AudioApi/AudioContext.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
12 changes: 2 additions & 10 deletions AudioSwitcher.AudioApi/AudioController.Generic.cs
Original file line number Diff line number Diff line change
@@ -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<T> : AudioController
where T : AudioDevice
{
protected AudioController(IDeviceEnumerator<T> devEnum)
: base(devEnum)
{
DeviceEnumerator = devEnum;
DeviceEnumerator.AudioDeviceChanged += DeviceEnumerator_AudioDeviceChanged;
}

protected new IDeviceEnumerator<T> DeviceEnumerator
Expand Down Expand Up @@ -42,11 +39,6 @@ protected AudioController(IDeviceEnumerator<T> devEnum)
get { return base.DefaultRecordingCommDevice as T; }
}

private void DeviceEnumerator_AudioDeviceChanged(object sender, AudioDeviceChangedEventArgs e)
{
OnAudioDeviceChanged(sender, e);
}

public new IEnumerable<T> GetPlaybackDevices(DeviceState deviceState = DefaultDeviceStateFilter)
{
return DeviceEnumerator.GetAudioDevices(DataFlow.Render, deviceState);
Expand All @@ -72,4 +64,4 @@ public virtual bool SetDefaultCommunicationsDevice(T dev)
return base.SetDefaultCommunicationsDevice(dev);
}
}
}
}
19 changes: 17 additions & 2 deletions AudioSwitcher.AudioApi/AudioController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand All @@ -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<AudioDevice> GetPlaybackDevices(DeviceState deviceState = DefaultDeviceStateFilter)
Expand Down
1 change: 0 additions & 1 deletion AudioSwitcher.AudioApi/AudioDeviceChangedHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,4 @@
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void AudioDeviceChangedHandler(object sender, AudioDeviceChangedEventArgs e);

}
2 changes: 1 addition & 1 deletion AudioSwitcher.AudioApi/AudioDeviceEventType.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
namespace AudioSwitcher.AudioApi
{
/// <summary>
/// The type of change raised
/// The type of change raised
/// </summary>
public enum AudioDeviceEventType
{
Expand Down
4 changes: 4 additions & 0 deletions AudioSwitcher.AudioApi/AudioSwitcher.AudioApi.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
<Reference Include="System.Drawing" />
</ItemGroup>
<ItemGroup>
<Compile Include="AudioContext.cs" />
<Compile Include="AudioController.cs" />
<Compile Include="AudioController.Generic.cs" />
<Compile Include="AudioDevice.cs" />
Expand Down Expand Up @@ -90,10 +91,13 @@
<Compile Include="Internal\PropertyStore.cs" />
<Compile Include="Internal\PropertyStoreProperty.cs" />
<Compile Include="Internal\PropVariant.cs" />
<Compile Include="IPreferredDeviceManager.cs" />
<Compile Include="PreferredDeviceManager.cs" />
<Compile Include="Role.cs" />
<Compile Include="Internal\PropertyKeys.cs" />
<Compile Include="Internal\Utils\HResult.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="System\SystemAudioContext.cs" />
<Compile Include="System\SystemAudioController.cs" />
<Compile Include="System\SystemAudioDevice.cs" />
<Compile Include="System\SystemDeviceEnumerator.cs" />
Expand Down
5 changes: 4 additions & 1 deletion AudioSwitcher.AudioApi/DataFlow.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
namespace AudioSwitcher.AudioApi
using System;

namespace AudioSwitcher.AudioApi
{
/// <summary>
/// The EDataFlow enumeration defines constants that indicate the direction
/// in which audio data flows between an audio endpoint device and an application
/// </summary>
[Flags]
public enum DataFlow
{
/// <summary>
Expand Down
30 changes: 30 additions & 0 deletions AudioSwitcher.AudioApi/IPreferredDeviceManager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using System.Collections.Generic;
using System.IO;

namespace AudioSwitcher.AudioApi
{
public interface IPreferredDeviceManager
{
AudioContext Context { get; }

IEnumerable<AudioDevice> 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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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);

Expand Down
4 changes: 2 additions & 2 deletions AudioSwitcher.AudioApi/Internal/PolicyConfig.cs
Original file line number Diff line number Diff line change
@@ -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
Expand Down
4 changes: 2 additions & 2 deletions AudioSwitcher.AudioApi/Internal/PolicyConfigVista.cs
Original file line number Diff line number Diff line change
@@ -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
Expand Down
39 changes: 39 additions & 0 deletions AudioSwitcher.AudioApi/PreferredDeviceManager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System.Collections.Generic;
using System.IO;

namespace AudioSwitcher.AudioApi
{
/// <summary>
/// Used to manage the preferred devices
/// </summary>
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<AudioDevice> 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);
}
}
15 changes: 15 additions & 0 deletions AudioSwitcher.AudioApi/System/SystemAudioContext.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace AudioSwitcher.AudioApi.System
{
public class SystemAudioContext : AudioContext
{
public SystemAudioContext()
: this(null)
{
}

public SystemAudioContext(PreferredDeviceManager preferredDeviceManager)
: base(new SystemAudioController(), preferredDeviceManager)
{
}
}
}
4 changes: 2 additions & 2 deletions AudioSwitcher.AudioApi/System/SystemAudioDevice.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ public sealed class SystemAudioDevice : AudioDevice
{
private Guid? _id;

internal SystemAudioDevice(MMDevice device, IDeviceEnumerator<SystemAudioDevice> controller)
: base(controller)
internal SystemAudioDevice(MMDevice device, IDeviceEnumerator<SystemAudioDevice> enumerator)
: base(enumerator)
{
if (device == null)
throw new ArgumentNullException("device", "Device cannot be null. Something bad went wrong");
Expand Down

0 comments on commit 25ef8ff

Please sign in to comment.