No idea if this works on Vista so test and correct as you see fit.
Is a direct conversion from some VB code that was lurking in my archives
use this one if you want to only set volume and mute
if you want to select and set source and destinations as well use the second post
Code: Select all
#MMSYSERR_NOERROR = 0
#MIXER_SHORT_NAME_CHARS = 16
#MIXER_LONG_NAME_CHARS = 64
#MAXPNAMELEN = 32 ; max product name length (including NULL
#MAXERRORLENGTH = 128 ; max error text length (including final NULL
#MM_MIXM_LINE_CHANGE = $3D0 ; mixer line change notify
#MM_MIXM_CONTROL_CHANGE = $3D1 ; mixer control change notify
;
; MMRESULT error return values specific to the mixer API
;
#MIXERR_BASE = 1024
#MIXERR_INVALLINE = #MIXERR_BASE + 0
#MIXERR_INVALCONTROL = #MIXERR_BASE + 1
#MIXERR_INVALVALUE = #MIXERR_BASE + 2
#MIXERR_LASTERROR = #MIXERR_BASE + 2
#MIXER_OBJECTF_HANDLE = $80000000
#MIXER_OBJECTF_MIXER = $0
#MIXER_OBJECTF_HMIXER = #MIXER_OBJECTF_HANDLE | #MIXER_OBJECTF_MIXER
#MIXER_OBJECTF_WAVEOUT = $10000000
#MIXER_OBJECTF_HWAVEOUT = #MIXER_OBJECTF_HANDLE | #MIXER_OBJECTF_WAVEOUT
#MIXER_OBJECTF_WAVEIN = $20000000
#MIXER_OBJECTF_HWAVEIN = #MIXER_OBJECTF_HANDLE | #MIXER_OBJECTF_WAVEIN
#MIXER_OBJECTF_MIDIOUT = $30000000
#MIXER_OBJECTF_HMIDIOUT = #MIXER_OBJECTF_HANDLE | #MIXER_OBJECTF_MIDIOUT
#MIXER_OBJECTF_MIDIIN = $40000000
#MIXER_OBJECTF_HMIDIIN = #MIXER_OBJECTF_HANDLE | #MIXER_OBJECTF_MIDIIN
#MIXER_OBJECTF_AUX = $50000000
;
; MIXERLINE.fdwLine
;
#MIXERLINE_LINEF_ACTIVE = $1
#MIXERLINE_LINEF_DISCONNECTED = $8000
#MIXERLINE_LINEF_SOURCE = $80000000
;
; MIXERLINE.dwComponentType
;
#MIXERLINE_COMPONENTTYPE_DST_FIRST = $0
#MIXERLINE_COMPONENTTYPE_DST_UNDEFINED = #MIXERLINE_COMPONENTTYPE_DST_FIRST + 0
#MIXERLINE_COMPONENTTYPE_DST_DIGITAL = #MIXERLINE_COMPONENTTYPE_DST_FIRST + 1
#MIXERLINE_COMPONENTTYPE_DST_LINE = #MIXERLINE_COMPONENTTYPE_DST_FIRST + 2
#MIXERLINE_COMPONENTTYPE_DST_MONITOR = #MIXERLINE_COMPONENTTYPE_DST_FIRST + 3
#MIXERLINE_COMPONENTTYPE_DST_SPEAKERS = #MIXERLINE_COMPONENTTYPE_DST_FIRST + 4
#MIXERLINE_COMPONENTTYPE_DST_HEADPHONES = #MIXERLINE_COMPONENTTYPE_DST_FIRST + 5
#MIXERLINE_COMPONENTTYPE_DST_TELEPHONE = #MIXERLINE_COMPONENTTYPE_DST_FIRST + 6
#MIXERLINE_COMPONENTTYPE_DST_WAVEIN = #MIXERLINE_COMPONENTTYPE_DST_FIRST + 7
#MIXERLINE_COMPONENTTYPE_DST_VOICEIN = #MIXERLINE_COMPONENTTYPE_DST_FIRST + 8
#MIXERLINE_COMPONENTTYPE_DST_LAST = #MIXERLINE_COMPONENTTYPE_DST_FIRST + 8
#MIXERLINE_COMPONENTTYPE_SRC_FIRST = $1000
#MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED = #MIXERLINE_COMPONENTTYPE_SRC_FIRST + 0
#MIXERLINE_COMPONENTTYPE_SRC_DIGITAL = #MIXERLINE_COMPONENTTYPE_SRC_FIRST + 1
#MIXERLINE_COMPONENTTYPE_SRC_LINE = #MIXERLINE_COMPONENTTYPE_SRC_FIRST + 2
#MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE = #MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3
#MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER = #MIXERLINE_COMPONENTTYPE_SRC_FIRST + 4
#MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC = #MIXERLINE_COMPONENTTYPE_SRC_FIRST + 5
#MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE = #MIXERLINE_COMPONENTTYPE_SRC_FIRST + 6
#MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER = #MIXERLINE_COMPONENTTYPE_SRC_FIRST + 7
#MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT = #MIXERLINE_COMPONENTTYPE_SRC_FIRST + 8
#MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY = #MIXERLINE_COMPONENTTYPE_SRC_FIRST + 9
#MIXERLINE_COMPONENTTYPE_SRC_ANALOG = #MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10
#MIXERLINE_COMPONENTTYPE_SRC_LAST = #MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10
;
; MIXERLINE.Target.dwType
;
#MIXERLINE_TARGETTYPE_UNDEFINED = 0
#MIXERLINE_TARGETTYPE_WAVEOUT = 1
#MIXERLINE_TARGETTYPE_WAVEIN = 2
#MIXERLINE_TARGETTYPE_MIDIOUT = 3
#MIXERLINE_TARGETTYPE_MIDIIN = 4
#MIXERLINE_TARGETTYPE_AUX = 5
#MIXER_GETLINEINFOF_DESTINATION = $0
#MIXER_GETLINEINFOF_SOURCE = $1
#MIXER_GETLINEINFOF_LINEID = $2
#MIXER_GETLINEINFOF_COMPONENTTYPE = $3
#MIXER_GETLINEINFOF_TARGETTYPE = $4
#MIXER_GETLINEINFOF_QUERYMASK = $F
;
; MIXERCONTROL.fdwControl
;
#MIXERCONTROL_CONTROLF_UNIFORM = $1
#MIXERCONTROL_CONTROLF_MULTIPLE = $2
#MIXERCONTROL_CONTROLF_DISABLED = $80000000
;
; MIXERCONTROL_CONTROLTYPE_xxx building block defines
;
#MIXERCONTROL_CT_CLASS_MASK = $F0000000
#MIXERCONTROL_CT_CLASS_CUSTOM = $0
#MIXERCONTROL_CT_CLASS_METER = $10000000
#MIXERCONTROL_CT_CLASS_SWITCH = $20000000
#MIXERCONTROL_CT_CLASS_NUMBER = $30000000
#MIXERCONTROL_CT_CLASS_SLIDER = $40000000
#MIXERCONTROL_CT_CLASS_FADER = $50000000
#MIXERCONTROL_CT_CLASS_TIME = $60000000
#MIXERCONTROL_CT_CLASS_LIST = $70000000
#MIXERCONTROL_CT_SUBCLASS_MASK = $F000000
#MIXERCONTROL_CT_SC_SWITCH_BOOLEAN = $0
#MIXERCONTROL_CT_SC_SWITCH_BUTTON = $1000000
#MIXERCONTROL_CT_SC_METER_POLLED = $0
#MIXERCONTROL_CT_SC_TIME_MICROSECS = $0
#MIXERCONTROL_CT_SC_TIME_MILLISECS = $1000000
#MIXERCONTROL_CT_SC_LIST_SINGLE = $0
#MIXERCONTROL_CT_SC_LIST_MULTIPLE = $1000000
#MIXERCONTROL_CT_UNITS_MASK = $FF0000
#MIXERCONTROL_CT_UNITS_CUSTOM = $0
#MIXERCONTROL_CT_UNITS_BOOLEAN = $10000
#MIXERCONTROL_CT_UNITS_SIGNED = $20000
#MIXERCONTROL_CT_UNITS_UNSIGNED = $30000
#MIXERCONTROL_CT_UNITS_DECIBELS = $40000 ; in 10ths
#MIXERCONTROL_CT_UNITS_PERCENT = $50000 ; in 10ths
;
; Commonly used control types for specifying MIXERCONTROL.dwControlType
;
#MIXERCONTROL_CONTROLTYPE_CUSTOM = #MIXERCONTROL_CT_CLASS_CUSTOM | #MIXERCONTROL_CT_UNITS_CUSTOM
#MIXERCONTROL_CONTROLTYPE_BOOLEANMETER = #MIXERCONTROL_CT_CLASS_METER | #MIXERCONTROL_CT_SC_METER_POLLED | #MIXERCONTROL_CT_UNITS_BOOLEAN
#MIXERCONTROL_CONTROLTYPE_SIGNEDMETER = #MIXERCONTROL_CT_CLASS_METER | #MIXERCONTROL_CT_SC_METER_POLLED | #MIXERCONTROL_CT_UNITS_SIGNED
#MIXERCONTROL_CONTROLTYPE_PEAKMETER = #MIXERCONTROL_CONTROLTYPE_SIGNEDMETER + 1
#MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER = #MIXERCONTROL_CT_CLASS_METER | #MIXERCONTROL_CT_SC_METER_POLLED | #MIXERCONTROL_CT_UNITS_UNSIGNED
#MIXERCONTROL_CONTROLTYPE_BOOLEAN = #MIXERCONTROL_CT_CLASS_SWITCH | #MIXERCONTROL_CT_SC_SWITCH_BOOLEAN | #MIXERCONTROL_CT_UNITS_BOOLEAN
#MIXERCONTROL_CONTROLTYPE_ONOFF = #MIXERCONTROL_CONTROLTYPE_BOOLEAN + 1
#MIXERCONTROL_CONTROLTYPE_MUTE = #MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2
#MIXERCONTROL_CONTROLTYPE_MONO = #MIXERCONTROL_CONTROLTYPE_BOOLEAN + 3
#MIXERCONTROL_CONTROLTYPE_LOUDNESS = #MIXERCONTROL_CONTROLTYPE_BOOLEAN + 4
#MIXERCONTROL_CONTROLTYPE_STEREOENH = #MIXERCONTROL_CONTROLTYPE_BOOLEAN + 5
#MIXERCONTROL_CONTROLTYPE_BUTTON = #MIXERCONTROL_CT_CLASS_SWITCH | #MIXERCONTROL_CT_SC_SWITCH_BUTTON | #MIXERCONTROL_CT_UNITS_BOOLEAN
#MIXERCONTROL_CONTROLTYPE_DECIBELS = #MIXERCONTROL_CT_CLASS_NUMBER | #MIXERCONTROL_CT_UNITS_DECIBELS
#MIXERCONTROL_CONTROLTYPE_SIGNED = #MIXERCONTROL_CT_CLASS_NUMBER | #MIXERCONTROL_CT_UNITS_SIGNED
#MIXERCONTROL_CONTROLTYPE_UNSIGNED = #MIXERCONTROL_CT_CLASS_NUMBER | #MIXERCONTROL_CT_UNITS_UNSIGNED
#MIXERCONTROL_CONTROLTYPE_PERCENT = #MIXERCONTROL_CT_CLASS_NUMBER | #MIXERCONTROL_CT_UNITS_PERCENT
#MIXERCONTROL_CONTROLTYPE_SLIDER = #MIXERCONTROL_CT_CLASS_SLIDER | #MIXERCONTROL_CT_UNITS_SIGNED
#MIXERCONTROL_CONTROLTYPE_PAN = #MIXERCONTROL_CONTROLTYPE_SLIDER + 1
#MIXERCONTROL_CONTROLTYPE_QSOUNDPAN = #MIXERCONTROL_CONTROLTYPE_SLIDER + 2
#MIXERCONTROL_CONTROLTYPE_FADER = #MIXERCONTROL_CT_CLASS_FADER | #MIXERCONTROL_CT_UNITS_UNSIGNED
#MIXERCONTROL_CONTROLTYPE_VOLUME = #MIXERCONTROL_CONTROLTYPE_FADER + 1
#MIXERCONTROL_CONTROLTYPE_BASS = #MIXERCONTROL_CONTROLTYPE_FADER + 2
#MIXERCONTROL_CONTROLTYPE_TREBLE = #MIXERCONTROL_CONTROLTYPE_FADER + 3
#MIXERCONTROL_CONTROLTYPE_EQUALIZER = #MIXERCONTROL_CONTROLTYPE_FADER + 4
#MIXERCONTROL_CONTROLTYPE_SINGLESELECT = #MIXERCONTROL_CT_CLASS_LIST | #MIXERCONTROL_CT_SC_LIST_SINGLE | #MIXERCONTROL_CT_UNITS_BOOLEAN
#MIXERCONTROL_CONTROLTYPE_MUX = #MIXERCONTROL_CONTROLTYPE_SINGLESELECT + 1
#MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT = #MIXERCONTROL_CT_CLASS_LIST | #MIXERCONTROL_CT_SC_LIST_MULTIPLE | #MIXERCONTROL_CT_UNITS_BOOLEAN
#MIXERCONTROL_CONTROLTYPE_MIXER = #MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT + 1
#MIXERCONTROL_CONTROLTYPE_MICROTIME = #MIXERCONTROL_CT_CLASS_TIME | #MIXERCONTROL_CT_SC_TIME_MICROSECS | #MIXERCONTROL_CT_UNITS_UNSIGNED
#MIXERCONTROL_CONTROLTYPE_MILLITIME = #MIXERCONTROL_CT_CLASS_TIME | #MIXERCONTROL_CT_SC_TIME_MILLISECS | #MIXERCONTROL_CT_UNITS_UNSIGNED
#MIXER_GETLINECONTROLSF_ALL = $0
#MIXER_GETLINECONTROLSF_ONEBYID = $1
#MIXER_GETLINECONTROLSF_ONEBYTYPE = $2
#MIXER_GETLINECONTROLSF_QUERYMASK = $F
#MIXER_GETCONTROLDETAILSF_VALUE = $0
#MIXER_GETCONTROLDETAILSF_LISTTEXT = $1
#MIXER_GETCONTROLDETAILSF_QUERYMASK = $F
#MIXER_SETCONTROLDETAILSF_VALUE = $0
#MIXER_SETCONTROLDETAILSF_CUSTOM = $1
#MIXER_SETCONTROLDETAILSF_QUERYMASK = $F
; mixer API types
; Structure MIXERCAPS
; wMid As Integer ; manufacturer id
; wPid As Integer ; product id
; vDriverVersion .l ; version of the driver
; szPname As String * MAXPNAMELEN ; product name
; fdwSupport .l ; misc. support bits
; cDestinations .l ; count of destinations
; End Type
;
; Structure Target ; for use in MIXERLINE and others (embedded structure
; dwType .l ; MIXERLINE_TARGETStructure_xxxx
; dwDeviceID .l ; target device ID of device Structure
; wMid As Integer ; of target device
; wPid As Integer ; "
; vDriverVersion .l ; "
; szPname As String * MAXPNAMELEN
; End Type
;
; Structure MIXERLINE
; cbStruct .l ; size of MIXERLINE structure
; dwDestination .l ; zero based destination index
; dwSource .l ; zero based source index (if source
; dwLineID .l ; unique line id for mixer device
; fdwLine .l ; state/information about line
; dwUser .l ; driver specific information
; dwComponentType .l ; component Structure line connects to
; cChannels .l ; number of channels line supports
; cConnections .l ; number of connections (possible
; cControls .l ; number of controls at this line
; szShortName As String * MIXER_SHORT_NAME_CHARS
; szName As String * MIXER_LONG_NAME_CHARS
; tTarget As Target
; End Type
;
Structure MIXERCONTROL
cbStruct.l ; size in Byte of MIXERCONTROL
dwControlID.l ; unique control id for mixer device
dwControlType.l ; MIXERCONTROL_CONTROLStructure_xxx
fdwControl.l ; MIXERCONTROL_CONTROLF_xxx
cMultipleItems.l ; if MIXERCONTROL_CONTROLF_MULTIPLE set
szShortName.b[#MIXER_SHORT_NAME_CHARS]
szName.b[#MIXER_LONG_NAME_CHARS]
;Bounds.l[5] ; Longest member of the Bounds union
;Metrics.l[5] ; Longest member of the Metrics union
; alternate defs for two items above
lMinimum.l ; Minimum value
lMaximum.l ; Maximum value
Reserved.l[10] ; reserved structure space
EndStructure; End Type
;
Structure MMIXERLINECONTROLS
cbStruct .l ; size in Byte of MMIXERLINECONTROLS
dwLineID .l ; line id (from MIXERLINE.dwLineID
; MIXER_GETLINECONTROLSF_ONEBYID or
dwControl .l ; MIXER_GETLINECONTROLSF_ONEBYStructure
cControls .l ; count of controls pmxctrl points to
cbmxctrl .l ; size in Byte of _one_ MIXERCONTROL
;pamxctrl As MIXERCONTROL ; pointer To first MIXERCONTROL array
pamxctrl .l ; pointer to first MIXERCONTROL array
EndStructure
;
; Structure MIXERCONTROLDETAILS
; cbStruct .l ; size in Byte of MIXERCONTROLDETAILS
; dwControlID .l ; control id to get/set details on
; cChannels .l ; number of channels in paDetails array
; item .l ; hwndOwner or cMultipleItems
; cbDetails .l ; size of _one_ details_XX struct
; paDetails .l ; pointer to array of details_XX structs
; End Type
;
; Structure MIXERCONTROLDETAILS_LISTTEXT
; dwParam1 .l
; dwParam2 .l
; szName As String * MIXER_LONG_NAME_CHARS
; End Type
;
; Structure MIXERCONTROLDETAILS_BOOLEAN
; fValue .l
; End Type
;
; Structure MIXERCONTROLDETAILS_SIGNED
; lValue .l
; End Type
;
; Structure MIXERCONTROLDETAILS_UNSIGNED
; dwValue .l
; End Type
;
#CALLBACK_WINDOW = $10000
#GWL_WNDPROC = -4
; enums to identify mixer volume controls
#SPEAKER = 0
#LINEIN = 1
#MICROPHONE = 2
#SYNTHESIZER = 3
#COMPACTDISC = 4
#WAVEOUT = 5
#AUXILIARY = 6
#SPEAKER_MUTE = 7
#LINEIN_MUTE = 8
#MICROPHONE_MUTE = 9
#SYNTHESIZER_MUTE = 10
#COMPACTDISC_MUTE = 11
#WAVEOUT_MUTE = 12
#AUXILIARY_MUTE = 13
Declare OpenMixer(MixerNumber.l)
Declare CloseMixer()
Declare SetVolume(Control.l,NewVolume.l)
Declare GetVolume(Control.l)
Declare setMute(Control.l,MuteState.l)
Declare GetMute(Control.l)
Declare GetMixerControl(hMixer.l, componentType.l, ctrlType.l, *mxc.MIXERCONTROL)
Declare SetControlValue(hMixer.l,*mxc.MIXERCONTROL,NewVolume.l)
Declare GetControlValue(hMixer.l,*mxc.MIXERCONTROL)
Global Dim uMixerControls.MIXERCONTROL(20) ; local array to store mixer controls
Global hMixerHandle.l ; handle for mixer
Procedure OpenMixer(MixerNumber.l)
ret.l
; is there a mixer available?
If MixerNumber < 0 Or MixerNumber > mixerGetNumDevs_() - 1
ProcedureReturn ret
EndIf
; open the mixer
ret = mixerOpen_(@hMixerHandle, MixerNumber, 0, 0, 0)
If ret <> #MMSYSERR_NOERROR
ProcedureReturn ret
EndIf
; 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(#SPEAKER))
; microphone volume
ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, #MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(#MICROPHONE))
; Line volume
ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY, #MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(#AUXILIARY))
; CD volume
ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC, #MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(#COMPACTDISC))
; Synthesizer volume
ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER, #MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(#SYNTHESIZER))
; wave volume
ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT, #MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(#WAVEOUT))
; Aux volume
ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_LINE, #MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(#LINEIN))
; speaker (master mute
ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#SPEAKER_MUTE))
; microphone mute
ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#MICROPHONE_MUTE))
; Line mute
ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#AUXILIARY_MUTE))
; CD mute
ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#COMPACTDISC_MUTE))
; Synthesizer mute
ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#SYNTHESIZER_MUTE))
; wave mute
ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#WAVEOUT_MUTE))
; Aux mute
ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_LINE, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#LINEIN_MUTE))
; return the mixer handle
ProcedureReturn #True
EndProcedure
Procedure CloseMixer()
CloseMixer = mixerClose_(hMixerHandle)
hMixerHandle = 0
EndProcedure
Procedure SetVolume(Control.l,NewVolume.l)
ProcedureReturn SetControlValue(hMixerHandle, uMixerControls(Control),NewVolume)
EndProcedure
Procedure GetVolume(Control.l)
ProcedureReturn GetControlValue(hMixerHandle, uMixerControls(Control))
EndProcedure
Procedure setMute(Control.l,MuteState.l)
mute.l
mute = Abs(MuteState)
ProcedureReturn SetControlValue(hMixerHandle, uMixerControls(Control),mute)
EndProcedure
Procedure GetMute(Control.l)
ProcedureReturn -GetControlValue(hMixerHandle,uMixerControls(Control))
EndProcedure
Procedure GetMixerControl(hMixer.l, componentType.l, ctrlType.l, *mxc.MIXERCONTROL)
; This function attempts to obtain a mixer control. Returns True if successful.
mxlc.MMIXERLINECONTROLS
mxl.MIXERLINE
hMem.l
ret.l
mxl\cbStruct = SizeOf(MIXERLINE)
mxl\dwComponentType = componentType
; Obtain a line corresponding to the component type
ret = mixerGetLineInfo_(hMixer,@mxl, #MIXER_GETLINEINFOF_COMPONENTTYPE)
If ret = #MMSYSERR_NOERROR
mxlc\cbStruct = SizeOf(MMIXERLINECONTROLS)
mxlc\dwLineID = mxl\dwLineID
mxlc\dwControl = ctrlType
mxlc\cControls = 1
mxlc\cbmxctrl = SizeOf(MIXERCONTROL)
; Allocate a buffer for the control
hMem = GlobalAlloc_($40, SizeOf(MIXERCONTROL))
mxlc\pamxctrl = GlobalLock_(hMem)
*mxc\cbStruct = SizeOf(MIXERCONTROL)
; Get the control
ret = mixerGetLineControls_(hMixer, @mxlc, #MIXER_GETLINECONTROLSF_ONEBYTYPE)
If ret = #MMSYSERR_NOERROR
mReturn = #True
; Copy the control into the destination structure
CopyMemory(mxlc\pamxctrl,*mxc,SizeOf(MIXERCONTROL))
Else
mReturn = #False
EndIf
GlobalFree_(hMem)
EndIf
ProcedureReturn mReturn
EndProcedure
Procedure SetControlValue(hMixer.l,*mxc.MIXERCONTROL,NewVolume.l)
;This function sets the value for a control. Returns True if successful
mxcd.MIXERCONTROLDETAILS
Vol.MIXERCONTROLDETAILS_UNSIGNED
hMem.l
ret.l
mxcd\item = 0
mxcd\dwControlID = *mxc\dwControlID
mxcd\cbStruct = SizeOf(MIXERCONTROLDETAILS)
mxcd\cbDetails = SizeOf(MIXERCONTROLDETAILS_UNSIGNED)
; Allocate a buffer for the control value buffer
hMem = GlobalAlloc_($40, SizeOf(MIXERCONTROLDETAILS_UNSIGNED))
mxcd\paDetails = GlobalLock_(hMem)
mxcd\cChannels = 1
; setup value, use percent of range if max is greater than 100
If *mxc\lMaximum > 100
Vol\dwValue = NewVolume * (*mxc\lMaximum / 100)
Else
Vol\dwValue = NewVolume
EndIf
If Vol\dwValue > *mxc\lMaximum
Vol\dwValue = *mxc\lMaximum
EndIf
If Vol\dwValue < *mxc\lMinimum
Vol\dwValue = *mxc\lMinimum
EndIf
; Copy the data into the control value buffer
;CopyPtrFromStruct mxcd.paDetails, Vol, SizeOf(Vol
CopyMemory(Vol,mxcd\paDetails,SizeOf(MIXERCONTROLDETAILS_UNSIGNED))
; Set the control value
ret = mixerSetControlDetails_(hMixer,@mxcd, #MIXER_SETCONTROLDETAILSF_VALUE)
GlobalFree_(hMem)
If ret = #MMSYSERR_NOERROR
ProcedureReturn #True
EndIf
EndProcedure
Procedure GetControlValue(hMixer.l,*mxc.MIXERCONTROL)
;This function gets the value for a control.
mxcd.MIXERCONTROLDETAILS
Vol.MIXERCONTROLDETAILS_UNSIGNED
hMem.l
ret.l
mxcd\item = 0
mxcd\dwControlID = *mxc\dwControlID
mxcd\cbStruct = SizeOf(MIXERCONTROLDETAILS)
mxcd\cbDetails = SizeOf(MIXERCONTROLDETAILS_UNSIGNED)
hMem = GlobalAlloc_($40, SizeOf(MIXERCONTROLDETAILS_UNSIGNED))
mxcd\paDetails = GlobalLock_(hMem)
mxcd\cChannels = 1
; Get the control value
ret = mixerGetControlDetails_(hMixer,@mxcd, #MIXER_GETCONTROLDETAILSF_VALUE)
; Copy the data into the control value buffer
;CopyStructFromPtr Vol, mxcd.paDetails, SizeOf(Vol)
CopyMemory(mxcd\paDetails,Vol,SizeOf(MIXERCONTROLDETAILS_UNSIGNED))
If *mxc\lMaximum > 100
mReturn = Vol\dwValue * 100 / *mxc\lMaximum - *mxc\lMinimum
Else
mReturn = Vol\dwValue
EndIf
GlobalFree_(hMem)
ProcedureReturn mReturn
EndProcedure
Procedure setVolumeOut(prc.l)
Vol.l
OpenMixer(0)
SetVolume(#SPEAKER, prc)
ProcedureReturn #True
EndProcedure
Procedure SetMuted(mute.l = #True)
OpenMixer(0)
setMute(#SPEAKER_MUTE, mute)
ProcedureReturn #True
EndProcedure
Procedure GetMuted()
OpenMixer(0)
ProcedureReturn GetMute(#SPEAKER_MUTE)
EndProcedure
Procedure getVolumeOut()
Vol.l
OpenMixer(0)
Volumeout = GetVolume(#SPEAKER)
Volumeout = Volumeout / 10
Volumeout = Round(Volumeout, 0)
ProcedureReturn volumeOut
EndProcedure
Debug getVolumeOut()
Debug GetMuted()
Debug SetMuted(#True)