using System.Runtime.InteropServices;
{
{
(MIXERLINE_COMPONENTTYPE_DST_FIRST + 4);
(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3);
(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 2);
(MIXERCONTROL_CT_CLASS_FADER | MIXERCONTROL_CT_UNITS_UNSIGNED);
(MIXERCONTROL_CONTROLTYPE_FADER + 1);
[DllImport("winmm.dll", CharSet = CharSet.Ansi)]
[DllImport("winmm.dll", CharSet = CharSet.Ansi)]
MIXERCONTROLDETAILS pmxcd,
int fdwDetails
);
[DllImport("winmm.dll", CharSet = CharSet.Ansi)]
[DllImport("winmm.dll", CharSet = CharSet.Ansi)]
[DllImport("winmm.dll", CharSet = CharSet.Ansi)]
MIXERLINECONTROLS pmxlc,
int fdwControls
);
[DllImport("winmm.dll", CharSet = CharSet.Ansi)]
MIXERLINE pmxl,
int fdwInfo
);
[DllImport("winmm.dll", CharSet = CharSet.Ansi)]
[DllImport("winmm.dll", CharSet = CharSet.Ansi)]
[DllImport("winmm.dll", CharSet = CharSet.Ansi)]
int dwCallback,
int dwInstance,
int fdwOpen
);
[DllImport("winmm.dll", CharSet = CharSet.Ansi)]
MIXERCONTROLDETAILS pmxcd,
int fdwDetails
);
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAXPNAMELEN)]
}
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MIXER_SHORT_NAME_CHARS)]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MIXER_LONG_NAME_CHARS)]
[MarshalAs(UnmanagedType.U4, SizeConst = 10)]
}
{
}
{
}
{
[MarshalAs(UnmanagedType.ByValTStr,
SizeConst = MIXER_SHORT_NAME_CHARS)]
[MarshalAs(UnmanagedType.ByValTStr,
SizeConst = MIXER_LONG_NAME_CHARS)]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAXPNAMELEN)]
}
{
}
{
// This function attempts to obtain a mixer control.
// Returns True if successful.
MIXERLINECONTROLS mxlc
= new MIXERLINECONTROLS
(); MIXERLINE mxl
= new MIXERLINE
(); MIXERCONTROLDETAILS pmxcd
= new MIXERCONTROLDETAILS
(); MIXERCONTROLDETAILS_UNSIGNED du
= new MIXERCONTROLDETAILS_UNSIGNED
(); mxc
= new MIXERCONTROL
();
vCurrentVol = -1;
mxl
.cbStruct = Marshal
.SizeOf(mxl
); mxl.dwComponentType = componentType;
rc
= mixerGetLineInfoA
(hmixer,
ref mxl, MIXER_GETLINEINFOF_COMPONENTTYPE
); if (MMSYSERR_NOERROR
== rc
) {
int sizeofMIXERCONTROL
= 152; mxlc.pamxctrl = Marshal.AllocCoTaskMem(sizeofMIXERCONTROL);
mxlc
.cbStruct = Marshal
.SizeOf(mxlc
); mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControl = ctrlType;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeofMIXERCONTROL;
// Allocate a buffer for the control
mxc.cbStruct = sizeofMIXERCONTROL;
// Get the control
rc
= mixerGetLineControlsA
(hmixer,
ref mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE
); if (MMSYSERR_NOERROR
== rc
) {
// Copy the control into the destination structure
mxc
= (MIXERCONTROL
)Marshal
.PtrToStructure(mxlc
.pamxctrl,
typeof(MIXERCONTROL
)); }
{
}
int sizeofMIXERCONTROLDETAILS
= Marshal
.SizeOf(typeof(MIXERCONTROLDETAILS
));
int sizeofMIXERCONTROLDETAILS_UNSIGNED
=
pmxcd.cbStruct = sizeofMIXERCONTROLDETAILS;
pmxcd.dwControlID = mxc.dwControlID;
pmxcd.paDetails =
Marshal.AllocCoTaskMem(sizeofMIXERCONTROLDETAILS_UNSIGNED);
pmxcd.cChannels = 1;
pmxcd.item = 0;
pmxcd.cbDetails = sizeofMIXERCONTROLDETAILS_UNSIGNED;
rc
= mixerGetControlDetailsA
(hmixer,
ref pmxcd,
MIXER_GETCONTROLDETAILSF_VALUE);
du = (MIXERCONTROLDETAILS_UNSIGNED)Marshal.PtrToStructure(
pmxcd
.paDetails,
typeof(MIXERCONTROLDETAILS_UNSIGNED
));
vCurrentVol = du.dwValue;
}
}
{
// This function sets the value for a volume control.
// Returns True if successful
MIXERCONTROLDETAILS mxcd
= new MIXERCONTROLDETAILS
();
MIXERCONTROLDETAILS_UNSIGNED vol
= new
MIXERCONTROLDETAILS_UNSIGNED();
mxcd.item = 0;
mxcd.dwControlID = mxc.dwControlID;
mxcd
.cbStruct = Marshal
.SizeOf(mxcd
);
mxcd
.cbDetails = Marshal
.SizeOf(vol
);
// Allocate a buffer for the control value buffer
mxcd.cChannels = 1;
vol.dwValue = volume;
// Copy the data into the control value buffer
mxcd
.paDetails = Marshal
.AllocCoTaskMem(Marshal
.SizeOf(
typeof(MIXERCONTROLDETAILS_UNSIGNED
)));
Marshal
.StructureToPtr(vol, mxcd
.paDetails,
false);
// Set the control value
rc
= mixerSetControlDetails
(hmixer,
ref mxcd,
MIXER_SETCONTROLDETAILSF_VALUE);
if (MMSYSERR_NOERROR
== rc
)
{
}
{
}
{
MIXERCONTROL volCtrl
= new MIXERCONTROL
();
mixerOpen
(out mixer,
0,
0,
0,
0);
int type
= MIXERCONTROL_CONTROLTYPE_VOLUME
;
GetVolumeControl(mixer,
MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, type,
out volCtrl,
out
currentVol);
mixerClose(mixer);
}
{
MIXERCONTROL volCtrl
= new MIXERCONTROL
();
mixerOpen
(out mixer,
0,
0,
0,
0);
int type
= MIXERCONTROL_CONTROLTYPE_VOLUME
;
GetVolumeControl(mixer,
MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, type,
out volCtrl,
out
currentVol);
if (vVolume
> volCtrl
.lMaximum) vVolume
= volCtrl
.lMaximum;
if (vVolume
< volCtrl
.lMinimum) vVolume
= volCtrl
.lMinimum;
SetVolumeControl(mixer, volCtrl, vVolume);
GetVolumeControl(mixer,
MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, type,
out volCtrl,
out
currentVol);
if (vVolume
!= currentVol
)
{
throw new Exception
("Cannot Set Volume");
}
mixerClose(mixer);
}
}
}