MVH/NAudio-2.2.1/NAudio.Midi/Midi/MidiOutCapabilities.cs
2024-06-07 00:47:07 +02:00

182 lines
4.6 KiB
C#

using System;
using System.Runtime.InteropServices;
namespace NAudio.Midi
{
/// <summary>
/// class representing the capabilities of a MIDI out device
/// MIDIOUTCAPS: http://msdn.microsoft.com/en-us/library/dd798467%28VS.85%29.aspx
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct MidiOutCapabilities
{
Int16 manufacturerId;
Int16 productId;
int driverVersion;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MaxProductNameLength)]
string productName;
Int16 wTechnology;
Int16 wVoices;
Int16 wNotes;
UInt16 wChannelMask;
MidiOutCapabilityFlags dwSupport;
const int MaxProductNameLength = 32; // max product name length (including NULL)
[Flags]
enum MidiOutCapabilityFlags
{
/// <summary>
/// MIDICAPS_VOLUME
/// </summary>
Volume = 1,
/// <summary>
/// separate left-right volume control
/// MIDICAPS_LRVOLUME
/// </summary>
LeftRightVolume = 2,
/// <summary>
/// MIDICAPS_CACHE
/// </summary>
PatchCaching = 4,
/// <summary>
/// MIDICAPS_STREAM
/// driver supports midiStreamOut directly
/// </summary>
Stream = 8,
}
/// <summary>
/// Gets the manufacturer of this device
/// </summary>
public Manufacturers Manufacturer
{
get
{
return (Manufacturers)manufacturerId;
}
}
/// <summary>
/// Gets the product identifier (manufacturer specific)
/// </summary>
public short ProductId
{
get
{
return productId;
}
}
/// <summary>
/// Gets the product name
/// </summary>
public String ProductName
{
get
{
return productName;
}
}
/// <summary>
/// Returns the number of supported voices
/// </summary>
public int Voices
{
get
{
return wVoices;
}
}
/// <summary>
/// Gets the polyphony of the device
/// </summary>
public int Notes
{
get
{
return wNotes;
}
}
/// <summary>
/// Returns true if the device supports all channels
/// </summary>
public bool SupportsAllChannels
{
get
{
return wChannelMask == 0xFFFF;
}
}
/// <summary>
/// Queries whether a particular channel is supported
/// </summary>
/// <param name="channel">Channel number to test</param>
/// <returns>True if the channel is supported</returns>
public bool SupportsChannel(int channel)
{
return (wChannelMask & (1 << (channel - 1))) > 0;
}
/// <summary>
/// Returns true if the device supports patch caching
/// </summary>
public bool SupportsPatchCaching
{
get
{
return (dwSupport & MidiOutCapabilityFlags.PatchCaching) != 0;
}
}
/// <summary>
/// Returns true if the device supports separate left and right volume
/// </summary>
public bool SupportsSeparateLeftAndRightVolume
{
get
{
return (dwSupport & MidiOutCapabilityFlags.LeftRightVolume) != 0;
}
}
/// <summary>
/// Returns true if the device supports MIDI stream out
/// </summary>
public bool SupportsMidiStreamOut
{
get
{
return (dwSupport & MidiOutCapabilityFlags.Stream) != 0;
}
}
/// <summary>
/// Returns true if the device supports volume control
/// </summary>
public bool SupportsVolumeControl
{
get
{
return (dwSupport & MidiOutCapabilityFlags.Volume) != 0;
}
}
/// <summary>
/// Returns the type of technology used by this MIDI out device
/// </summary>
public MidiOutTechnology Technology
{
get
{
return (MidiOutTechnology)wTechnology;
}
}
}
}