public bool GetMixerControls(out MixerInfo data)
        {
            MIXERLINE         mxl = new MIXERLINE();
            MIXERLINECONTROLS mlc = new MIXERLINECONTROLS();

            mxl.cbStruct = (uint)Marshal.SizeOf(typeof(MIXERLINE));
            mlc.cbStruct = (uint)Marshal.SizeOf(typeof(MIXERLINECONTROLS));

            var errCode = WinMNWarpConstants.mixerGetLineInfo(IntPtr.Zero, ref mxl, MIXER.OBJECTF_MIXER | MIXER.GETLINEINFOF_DESTINATION);

            mlc.dwLineID  = mxl.dwLineID;
            mlc.cControls = mxl.cControls;
            //mlc.cbmxctrl = (uint)Marshal.SizeOf(typeof(MIXERCONTROL));
            //mlc.pamxctrl = Marshal.AllocHGlobal((int)(mlc.cbmxctrl * mlc.cControls));

            //WinMNWarpConstants.mixerGetLineControls(IntPtr.Zero, ref mlc, MIXER.OBJECTF_MIXER | MIXER.GETLINECONTROLSF_ALL);

            //MyMixerInfo rtn = new MyMixerInfo();
            data = new MixerInfo();

            //for (int i = 0; i < mlc.cControls; i++)
            //{
            //    MIXERCONTROL mxc = (MIXERCONTROL)Marshal.PtrToStructure((IntPtr)((int)mlc.pamxctrl + (int)mlc.cbmxctrl * i), typeof(MIXERCONTROL));
            //    switch (mxc.dwControlType)
            //    {
            //        case MIXERCONTROL_CONTROLTYPE.VOLUME:
            //            data.volumeCtl = mxc.dwControlID;
            //            data.minVolume = mxc.Bounds.lMinimum;
            //            data.maxVolume = mxc.Bounds.lMaximum;
            //            break;
            //        case MIXERCONTROL_CONTROLTYPE.MUTE:
            //            data.muteCtl = mxc.dwControlID;
            //            break;
            //    }
            //}

            //Marshal.FreeHGlobal(mlc.pamxctrl);

            return(true);
        }
 internal static extern uint mixerGetLineControls(IntPtr hmxobj, ref MIXERLINECONTROLS pmxlc, MIXER flags);