Code:
Public Shared Function GetControlValue(ByVal hMixer As Int32, ByVal mxc As MIXERCONTROL) As Int32
'This function gets the value for a control.
Dim mxcd As MIXERCONTROLDETAILS
Dim vol As MIXERCONTROLDETAILS_UNSIGNED
Dim hMem As Int32
Dim ret As Int32
Dim sizeofMIXERCONTROLDETAILS As Integer = Marshal.SizeOf(GetType(MIXERCONTROLDETAILS))
Dim sizeofMIXERCONTROLDETAILS_UNSIGNED As Integer = Marshal.SizeOf(GetType(MIXERCONTROLDETAILS_UNSIGNED))
' pmxcd.cbStruct = sizeofMIXERCONTROLDETAILS
' pmxcd.dwControlID = mxc.dwControlID
mxcd.item = 0
mxcd.dwControlID = mxc.dwControlID
' mxcd.cbStruct = Len(mxcd)
mxcd.cbStruct = sizeofMIXERCONTROLDETAILS
mxcd.cbDetails = Marshal.SizeOf(vol)
''mxcd.cbDetails = Len(vol)
hMem = GlobalAlloc(&H40, Marshal.SizeOf(vol))
mxcd.paDetails = GlobalLock(hMem)
mxcd.cChannels = 1
' Get the control value
ret = mixerGetControlDetailsA(hMixer, mxcd, MIXER_GETCONTROLDETAILSF_VALUE)
' Copy the data into the control value buffer
CopyStructFromPtr(vol, mxcd.paDetails, Marshal.SizeOf(vol))
If mxc.lMaximum > 100 Then
GetControlValue = (vol.dwValue * 100) / mxc.lMaximum - mxc.lMinimum
Else
GetControlValue = vol.dwValue
End If
GlobalFree(hMem)
End Function
Private Shared Function GetMixerControl(ByVal hMixer As Int32, ByVal componentType As Int32, ByVal ctrlType As Int32, ByRef mxc As MIXERCONTROL) As Int32 ' This function attempts to obtain a mixer control. Returns True if successful.
Dim mxlc As MIXERLINECONTROLS
Dim mxl As MIXERLINE
Dim hMem As Int32
Dim ret As Int32
''mxl.cbStruct = Len(mxl)
mxl.cbStruct = Marshal.SizeOf(mxl)
mxl.dwComponentType = componentType
' Obtain a line corresponding to the component type
ret = mixerGetLineInfo(hMixer, mxl, MIXER_GETLINEINFOF_COMPONENTTYPE)
'' If ret = MMSYSERR_NOERROR Then
If ret <> MMSYSERR_NOERROR Then
''mxlc.cbStruct = Len(mxlc)
mxlc.cbStruct = Marshal.SizeOf(mxl)
mxlc.dwLineID = mxl.dwLineID
mxlc.dwControl = ctrlType
mxlc.cControls = 1
mxlc.cbmxctrl = Marshal.SizeOf(mxc)
' Allocate a buffer for the control
hMem = GlobalAlloc(&H40, Marshal.SizeOf(mxc))
mxlc.pamxctrl = GlobalLock(hMem)
mxc.cbStruct = Marshal.SizeOf(mxc)
' Get the control
Dim mc As New mixersetter.MIXERCONTROL
ret = mixerGetLineControls(hMixer, mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE)
'' If ret = MMSYSERR_NOERROR Then
If ret <> MMSYSERR_NOERROR Then
GetMixerControl = True
'' Marshal.StructureToPtr(mxc, mxlc.pamxctrl, Len(mxc))
' Copy the control into the destination structure
CopyStructFromPtr(mxc, mxlc.pamxctrl, Marshal.SizeOf(mxc))
Else
GetMixerControl = False
End If
GlobalFree(hMem)
Exit Function
End If
GetMixerControl = False
End Function
Public Shared Function SetMute(ByVal Control As MUTE_CONTROL, ByVal MuteState As Boolean) As Boolean
Dim Mute As Integer
Mute = MuteState
SetMute = SetControlValue(hMixerHandle, uMixerControls(Control), Mute)
End Function
Public Shared Function GetMute(ByVal Control As MUTE_CONTROL) As Boolean
GetMute = CBool(-GetControlValue(hMixerHandle, uMixerControls(Control)))
End Function
Public Shared Function OpenMixer(ByVal MixerNumber As Int32) As Int32
Dim ret As Int32
' is there a mixer available?
If MixerNumber < 0 Or MixerNumber > mixerGetNumDevs() - 1 Then Exit Function
' open the mixer
ret = mixerOpen(hMixerHandle, MixerNumber, 0, 0, 0)
If ret <> MMSYSERR_NOERROR Then Exit Function
' get the primary line controls by name, (this does not get all of the controls).
' speaker (master) volume
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(VOL_CONTROL.SPEAKER))
' microphone volume
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(VOL_CONTROL.MICROPHONE))
' Line volume
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY, MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(VOL_CONTROL.AUXILIARY))
' CD volume
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC, MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(VOL_CONTROL.COMPACTDISC))
' Synthesizer volume
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER, MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(VOL_CONTROL.SYNTHESIZER))
' wave volume
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT, MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(VOL_CONTROL.WAVEOUT))
' Aux volume
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_SRC_LINE, MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(VOL_CONTROL.LINEIN))
' speaker (master) mute
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(MUTE_CONTROL.SPEAKER_MUTE))
' microphone mute
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(MUTE_CONTROL.MICROPHONE_MUTE))
' Line mute
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY, MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(MUTE_CONTROL.AUXILIARY_MUTE))
' CD mute
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC, MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(MUTE_CONTROL.COMPACTDISC_MUTE))
' Synthesizer mute
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER, MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(MUTE_CONTROL.SYNTHESIZER_MUTE))
' wave mute
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT, MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(MUTE_CONTROL.WAVEOUT_MUTE))
' Aux mute
ret = GetMixerControl(hMixerHandle, MIXERLINE_COMPONENTTYPE_SRC_LINE, MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(MUTE_CONTROL.LINEIN_MUTE))
' return the mixer handle
OpenMixer = True
End Function
Public Function CloseMixer() As Int32
CloseMixer = mixerClose(hMixerHandle)
hMixerHandle = 0
End Function
Public Function SetVolume(ByVal Control As VOL_CONTROL, ByVal NewVolume As Int32) As Int32
SetVolume = SetControlValue(hMixerHandle, uMixerControls(Control), NewVolume)
End Function
Public Function GetVolume(ByVal Control As VOL_CONTROL) As Int32
GetVolume = GetControlValue(hMixerHandle, uMixerControls(Control))
End Function
End Class