/// <summary> /// Gets all the mixer controls /// </summary> /// <param name="mixerHandle">Mixer Handle</param> /// <param name="mixerLine">Mixer Line</param> /// <param name="mixerHandleType">Mixer Handle Type</param> /// <returns></returns> public static IList<MixerControl> GetMixerControls(IntPtr mixerHandle, MixerLine mixerLine, MixerFlags mixerHandleType) { var controls = new List<MixerControl>(); if (mixerLine.ControlsCount > 0) { int mixerControlSize = Marshal.SizeOf(typeof (MixerInterop.MIXERCONTROL)); var mlc = new MixerInterop.MIXERLINECONTROLS(); IntPtr pmc = Marshal.AllocHGlobal(mixerControlSize * mixerLine.ControlsCount); mlc.cbStruct = Marshal.SizeOf(mlc); mlc.dwLineID = mixerLine.LineId; mlc.cControls = mixerLine.ControlsCount; mlc.pamxctrl = pmc; mlc.cbmxctrl = Marshal.SizeOf(typeof(MixerInterop.MIXERCONTROL)); try { MmResult err = MixerInterop.mixerGetLineControls(mixerHandle, ref mlc, MixerFlags.All | mixerHandleType); if (err != MmResult.NoError) { throw new MmException(err, "mixerGetLineControls"); } for (int i = 0; i < mlc.cControls; i++) { Int64 address = pmc.ToInt64() + mixerControlSize * i; var mc = (MixerInterop.MIXERCONTROL) Marshal.PtrToStructure((IntPtr)address, typeof(MixerInterop.MIXERCONTROL)); var mixerControl = GetMixerControl(mixerHandle, mixerLine.LineId, mc.dwControlID, mixerLine.Channels, mixerHandleType); controls.Add(mixerControl); } } finally { Marshal.FreeHGlobal(pmc); } } return controls; }
/// <summary> /// Gets all the mixer controls /// </summary> /// <param name="mixerHandle">Mixer Handle</param> /// <param name="mixerLine">Mixer Line</param> /// <param name="mixerHandleType">Mixer Handle Type</param> /// <returns></returns> public static IList <MixerControl> GetMixerControls(IntPtr mixerHandle, MixerLine mixerLine, MixerFlags mixerHandleType) { var controls = new List <MixerControl>(); if (mixerLine.ControlsCount > 0) { int mixerControlSize = Marshal.SizeOf(typeof(MixerInterop.MIXERCONTROL)); var mlc = new MixerInterop.MIXERLINECONTROLS(); IntPtr pmc = Marshal.AllocHGlobal(mixerControlSize * mixerLine.ControlsCount); mlc.cbStruct = Marshal.SizeOf(mlc); mlc.dwLineID = mixerLine.LineId; mlc.cControls = mixerLine.ControlsCount; mlc.pamxctrl = pmc; mlc.cbmxctrl = Marshal.SizeOf(typeof(MixerInterop.MIXERCONTROL)); try { MmResult err = MixerInterop.mixerGetLineControls(mixerHandle, ref mlc, MixerFlags.All | mixerHandleType); if (err != MmResult.NoError) { throw new MmException(err, "mixerGetLineControls"); } for (int i = 0; i < mlc.cControls; i++) { Int64 address = pmc.ToInt64() + mixerControlSize * i; var mc = (MixerInterop.MIXERCONTROL) Marshal.PtrToStructure((IntPtr)address, typeof(MixerInterop.MIXERCONTROL)); var mixerControl = GetMixerControl(mixerHandle, mixerLine.LineId, mc.dwControlID, mixerLine.Channels, mixerHandleType); controls.Add(mixerControl); } } finally { Marshal.FreeHGlobal(pmc); } } return(controls); }
/// <summary> /// Microphone Level /// </summary> public MixerLine GetMixerLine() { // TODO use mixerGetID instead to see if this helps with XP MixerLine mixerLine; if (waveInHandle != IntPtr.Zero) { mixerLine = new MixerLine(this.waveInHandle, 0, MixerFlags.WaveInHandle); } else { mixerLine = new MixerLine((IntPtr)DeviceNumber, 0, MixerFlags.WaveIn); } return mixerLine; }