// created on 15/12/2002 at 02:55
using System;

namespace NAudio.Mixer
{
	[Flags]
	internal enum MixerControlClass 
	{
		Custom	= 0x00000000,
		Meter	= 0x10000000,
		Switch	= 0x20000000,
		Number	= 0x30000000,
		Slider	= 0x40000000,
		Fader	= 0x50000000,
		Time	= 0x60000000,
		List	= 0x70000000,
		Mask 	= Custom | Meter | Switch | Number | Slider | Fader | Time | List
	}

	[Flags]	
	internal enum MixerControlSubclass 
	{
		SwitchBoolean 	= 0x00000000,
		SwitchButton 	= 0x01000000,
		MeterPolled 	= 0x00000000,
		TimeMicrosecs	= 0x00000000,
		TimeMillisecs	= 0x01000000,
		ListSingle		= 0x00000000,
		ListMultiple 	= 0x01000000,
		Mask			= 0x0F000000
	}
	
	[Flags]
	internal enum MixerControlUnits 
	{
		Custom		= 0x00000000,
		Boolean		= 0x00010000,
		Signed		= 0x00020000,
		Unsigned	= 0x00030000,
		Decibels	= 0x00040000, // in 10ths
		Percent		= 0x00050000, // in 10ths
		Mask		= 0x00FF0000
	}
	
	/// <summary>
	/// Mixer control types
	/// </summary>
	public enum MixerControlType 
	{
		/// <summary>Custom</summary>
		Custom = (MixerControlClass.Custom | MixerControlUnits.Custom),
		/// <summary>Boolean meter</summary>
		BooleanMeter = (MixerControlClass.Meter | MixerControlSubclass.MeterPolled | MixerControlUnits.Boolean),
		/// <summary>Signed meter</summary>
		SignedMeter = (MixerControlClass.Meter | MixerControlSubclass.MeterPolled | MixerControlUnits.Signed),
		/// <summary>Peak meter</summary>
		PeakMeter = (SignedMeter + 1),
		/// <summary>Unsigned meter</summary>
		UnsignedMeter = (MixerControlClass.Meter | MixerControlSubclass.MeterPolled | MixerControlUnits.Unsigned),
		/// <summary>Boolean</summary>
		Boolean = (MixerControlClass.Switch | MixerControlSubclass.SwitchBoolean | MixerControlUnits.Boolean),
		/// <summary>On Off</summary>
		OnOff = (Boolean + 1),
		/// <summary>Mute</summary>
		Mute = (Boolean + 2),
		/// <summary>Mono</summary>
		Mono = (Boolean + 3),
		/// <summary>Loudness</summary>
		Loudness = (Boolean + 4),
		/// <summary>Stereo Enhance</summary>
		StereoEnhance = (Boolean + 5),
		/// <summary>Button</summary>
		Button = (MixerControlClass.Switch | MixerControlSubclass.SwitchButton | MixerControlUnits.Boolean),
		/// <summary>Decibels</summary>
		Decibels = (MixerControlClass.Number | MixerControlUnits.Decibels),
		/// <summary>Signed</summary>
		Signed = (MixerControlClass.Number | MixerControlUnits.Signed),
		/// <summary>Unsigned</summary>
		Unsigned = (MixerControlClass.Number | MixerControlUnits.Unsigned),
		/// <summary>Percent</summary>
		Percent = (MixerControlClass.Number | MixerControlUnits.Percent),
		/// <summary>Slider</summary>
		Slider = (MixerControlClass.Slider | MixerControlUnits.Signed),
		/// <summary>Pan</summary>
		Pan = (Slider + 1),
		/// <summary>Q-sound pan</summary>
		QSoundPan = (Slider + 2),
		/// <summary>Fader</summary>
		Fader = (MixerControlClass.Fader | MixerControlUnits.Unsigned),
		/// <summary>Volume</summary>
		Volume = (Fader + 1),
		/// <summary>Bass</summary>
		Bass = (Fader + 2),
		/// <summary>Treble</summary>
		Treble = (Fader + 3),
		/// <summary>Equaliser</summary>
		Equalizer = (Fader + 4),
		/// <summary>Single Select</summary>
		SingleSelect = (MixerControlClass.List | MixerControlSubclass.ListSingle | MixerControlUnits.Boolean),
		/// <summary>Mux</summary>
		Mux = (SingleSelect + 1),
		/// <summary>Multiple select</summary>
		MultipleSelect = (MixerControlClass.List | MixerControlSubclass.ListMultiple | MixerControlUnits.Boolean),
		/// <summary>Mixer</summary>
		Mixer = (MultipleSelect + 1),
		/// <summary>Micro time</summary>
		MicroTime = (MixerControlClass.Time | MixerControlSubclass.TimeMicrosecs | MixerControlUnits.Unsigned),
		/// <summary>Milli time</summary>
		MilliTime = (MixerControlClass.Time | MixerControlSubclass.TimeMillisecs | MixerControlUnits.Unsigned),
	}
}
