mixerSetControlDetails (winmm)
Last changed: StarTether-128.187.81.183

.
Summary
TODO - a short description

C# Signature:

[DllImport("winmm.dll")]
static extern Int32 mixerSetControlDetails(IntPtr hmxobj,
   ref MixerControlDetails pmxcd, UInt32 fdwDetails);

VB Signature:

Declare Function mixerSetControlDetails Lib "winmm.dll" (ByVal hmxobj As IntPtr, ByVal pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Integer) As Integer

User-Defined Types:

C# Struct

The winmm dll may not execute properly on 64-bit systems. Consequently, the StructLayout must be Sequential, with CharSet = Ansi, and Pack = 4. This particular type has some special layout considerations (the c union keyword) which typically means developers would use the explicit layout. However, the explicit layout breaks down on 64-bit systems for any type with an IntPtr in the type. Consequently, the C# types have been redesigned to use Sequential layout so that they will automatically adjust to 64-bit systems. This means private fields with public properties which perform the gunky work of making it look like there is a union.

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
public struct MIXERCONTROL
{
     private UInt32 cbStruct;
     private UInt32 dwControlID;
     private UInt32 dwControlType;
     private UInt32 fdwControl;
     private UInt32 cMultipleItems;
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MixerXPNative.MIXER_SHORT_NAME_CHARS)]
     private string szShortName;
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MixerXPNative.MIXER_LONG_NAME_CHARS)]
     private string szName;
     public MIXERCONTROL_BOUNDS Bounds;
     public MIXERCONTROL_METRICS Metrics;

     #region Properties

     /// <summary>size in bytes of <see cref="MIXERCONTROL">MIXERCONTROL</see></summary>
     public UInt32 StructSize
     {
        get { return this.cbStruct; }
        set { this.cbStruct = value; }
     }
     /// <summary></summary>
     public UInt32 ControlID
     {
        get { return this.dwControlID; }
        set { this.dwControlID = value; }
     }
     /// <summary>MIXERCONTROL_CONTROLTYPE_xxx</summary>
     public MIXERCONTROL_CONTROLTYPE ControlType
     {
        get { return (MIXERCONTROL_CONTROLTYPE)this.dwControlType; }
        set { this.dwControlType = (UInt32)value; }
     }
     /// <summary>MIXERCONTROL_CONTROLF_xxx</summary>
     public MIXERCONTROL_CONTROLF Control
     {
        get { return (MIXERCONTROL_CONTROLF)this.fdwControl; }
        set { this.fdwControl = (uint)value; }
     }
     /// <summary>if MIXERCONTROL_CONTROLF_MULTIPLE set</summary>
     public UInt32 MultipleItems
     {
        get { return this.cMultipleItems; }
        set { this.cMultipleItems = value; }
     }
     /// <summary></summary>
     public String ShortName
     {
        get { return this.szShortName; }
        set { this.szShortName = value; }
     }
     /// <summary></summary>
     public String Name
     {
        get { return this.szName; }
        set { this.szName = value; }
     }

     #endregion
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
public struct MIXERCONTROL_BOUNDS
{
     private Int32 lMinimum;
     private Int32 lMaximum;
     //public uint dwMinimum; // Unioned with lMinimum
     //public uint dwMaximum; // Unioned with lMaximum
     //public uint dwReserved1; // Unioned with lMinimum
     //public uint dwReserved2; // Unioned with lMaximum
     private UInt32 dwReserved3;
     private UInt32 dwReserved4;
     private UInt32 dwReserved5;
     private UInt32 dwReserved6;

     #region Properties

     /// <summary>signed minimum for this control</summary>
     public Int32 Minimum
     {
        get { return this.lMinimum; }
        set { this.lMinimum = value; }
     }
     /// <summary>signed maximum for this control</summary>
     public Int32 Maximum
     {
        get { return this.lMaximum; }
        set { this.lMaximum = value; }
     }
     /// <summary>unsigned minimum for this control</summary>
     public UInt32 UnsignedMinimum
     {
        get { return (uint)this.lMinimum; }//TODO: something different
        set { this.lMinimum = (int)value; }
     }
     /// <summary>unsigned maximum for this control</summary>
     public UInt32 UnsignedMaximum
     {
        get { return (uint)this.lMaximum; }//TODO: something different
        set { this.lMaximum = (int)value; }
     }
     /// <summary></summary>
     public UInt32 Reserved1
     {
        get { return (uint)this.lMinimum; }//TODO: something different
        set { this.lMinimum = (int)value; }
     }
     /// <summary></summary>
     public UInt32 Reserved2
     {
        get { return (uint)this.lMaximum; }//TODO: something different
        set { this.lMaximum = (int)value; }
     }
     /// <summary></summary>
     public UInt32 Reserved3
     {
        get { return this.dwReserved3; }
        set { this.dwReserved3 = value; }
     }
     /// <summary></summary>
     public UInt32 Reserved4
     {
        get { return this.dwReserved4; }
        set { this.dwReserved4 = value; }
     }
     /// <summary></summary>
     public UInt32 Reserved5
     {
        get { return this.dwReserved5; }
        set { this.dwReserved5 = value; }
     }
     /// <summary></summary>
     public UInt32 Reserved6
     {
        get { return this.dwReserved6; }
        set { this.dwReserved6 = value; }
     }

     #endregion
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
public struct MIXERCONTROL_METRICS
{
     private UInt32 cSteps;
     //private UInt32 cbCustomData; //Unioned with cSteps
     //private UInt32 dwReserved1; //Unioned with cSteps
     private UInt32 dwReserved2;
     private UInt32 dwReserved3;
     private UInt32 dwReserved4;
     private UInt32 dwReserved5;
     private UInt32 dwReserved6;

     #region Properties

     /// <summary># of steps between min & max</summary>
     public UInt32 Steps
     {
        get { return this.cSteps; }
        set { this.cSteps = value; }
     }
     /// <summary>size in bytes of custom data</summary>
     public UInt32 CustomData
     {
        get { return this.cSteps; }
        set { this.cSteps = value; }
     }
     /// <summary>!!! needed? we have cbStruct....</summary>
     public UInt32 Reserved1
     {
        get { return this.cSteps; }//TODO: something different
        set { this.cSteps = value; }
     }
     /// <summary>!!! needed? we have cbStruct....</summary>
     public UInt32 Reserved2
     {
        get { return this.dwReserved2; }
        set { this.dwReserved2 = value; }
     }
     /// <summary>!!! needed? we have cbStruct....</summary>
     public UInt32 Reserved3
     {
        get { return this.dwReserved3; }
        set { this.dwReserved3 = value; }
     }
     /// <summary>!!! needed? we have cbStruct....</summary>
     public UInt32 Reserved4
     {
        get { return this.dwReserved4; }
        set { this.dwReserved4 = value; }
     }
     /// <summary>!!! needed? we have cbStruct....</summary>
     public UInt32 Reserved5
     {
        get { return this.dwReserved5; }
        set { this.dwReserved5 = value; }
     }
     /// <summary>!!! needed? we have cbStruct....</summary>
     public UInt32 Reserved6
     {
        get { return this.dwReserved6; }
        set { this.dwReserved6 = value; }
     }

     #endregion
}

VB Struct

Structure MIXERCONTROLDETAILS
     Dim cbStruct As Integer
     Dim dwControlID As Integer
     Dim cChannels As Integer
     Structure u ' A union
     Dim hWndOwner As IntPtr
     Dim cMultipleItems As Integer
     End Structure
     Dim cbDetails As Integer
     Dim paDeatails As IntPtr
End Structure

Notes:

None.

Tips & Tricks:

The fdwDetails parameter can be composed constants from two distinct enumerations, one of which is used frequently in the winmm library, and the other constant is only used with this method. Consequently, you should wrap up the method definition so that it is easier to use, and more consistent. In the following example, the actual extern is private, while the public static method lists both enums to callers.

[DllImport("winmm.dll", CharSet = CharSet.Unicode)]
private static extern Int32 mixerSetControlDetails(IntPtr hmxobj, ref MIXERCONTROLDETAILS pmxcd, uint fdwDetails);

public static Int32 mixerSetControlDetails(IntPtr hmxobj, ref MIXERCONTROLDETAILS pmxcd, MIXER_OBJECTF fdwDetails, MIXER_SETCONTROLDETAILSF setControlDetails)
{
     uint flags = ((uint)fdwDetails | (uint)setControlDetails);
     return mixerSetControlDetails(hmxobj, ref pmxcd, flags);
}

public enum MIXER_OBJECTF : uint
{
     HANDLE   = 0x80000000u,
     MIXER    = 0x00000000u,
     HMIXER   = (HANDLE | MIXER),
     WAVEOUT  = 0x10000000u,
     HWAVEOUT = (HANDLE | WAVEOUT),
     WAVEIN   = 0x20000000u,
     HWAVEIN  = (HANDLE | WAVEIN),
     MIDIOUT  = 0x30000000u,
     HMIDIOUT = (HANDLE | MIDIOUT),
     MIDIIN   = 0x40000000u,
     HMIDIIN  = (HANDLE | MIDIIN),
     AUX      = 0x50000000u,
}
public enum MIXER_SETCONTROLDETAILSF : uint
{
     VALUE      = 0x00000000u,
     CUSTOM     = 0x00000001u,

     QUERYMASK  = 0x0000000Fu,
}

Sample Code:

Please add some!

Alternative Managed API:

The ManagedWindowsApi project (http://mwinapi.sourceforge.net) provides a Mixer control.

Documentation