Page 1 of 2

mixer controls

Posted: Fri Sep 12, 2008 4:26 am
by idle
I probably should have a done a search before doing this, its not the most efficient way to manage the mixer controls but it does the job.
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)

[/code]

Posted: Fri Sep 12, 2008 10:45 am
by ozzie
Thanks for posting this. Should be useful for my project.

Posted: Fri Sep 12, 2008 12:35 pm
by idle
Fixed Mixer class to select inputs outputs and details

Code: Select all

  

#MAX_PNAME_LEN                              = 32

#MIXER_GETCONTROLDETAILSF_LISTTEXT         = $1
#MIXER_GETCONTROLDETAILSF_VALUE            = $0

#MIXER_GETLINECONTROLSF_ONEBYTYPE          = $2
   
#MIXER_GETLINEINFOF_COMPONENTTYPE          = $3
#MIXER_GETLINEINFOF_LINEID                 = $2
#MIXER_GETLINEINFOF_SOURCE                 = $1
#MIXER_GETLINEINFOF_DESTINATION            = $0

#MIXER_LONG_NAME_CHARS                     = 64
#MIXER_SHORT_NAME_CHARS                    = 16

#MIXERCONTROL_CONTROLTYPE_VOLUME           = $50030001
#MIXERCONTROL_CONTROLTYPE_MUTE             = $20010002

#MIXER_SETCONTROLDETAILSF_VALUE            = $0

#MIXER_OBJECTF_MIDIIN                      = $40000000
#MIXER_OBJECTF_MIDIOUT                     = $30000000
#MIXER_OBJECTF_WAVEIN                      = $20000000
#MIXER_OBJECTF_WAVEOUT                     = $10000000
#MIXER_OBJECTF_MIXER                       = $0

#MIXERCONTROL_CT_UNITS_BOOLEAN             = $10000
#MIXERCONTROL_CT_SC_LIST_MULTIPLE          = $1000000
#MIXERCONTROL_CT_SC_LIST_SINGLE            = $0
#MIXERCONTROL_CT_CLASS_LIST                = $70000000

#MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT   = (#MIXERCONTROL_CT_CLASS_LIST | #MIXERCONTROL_CT_SC_LIST_MULTIPLE | #MIXERCONTROL_CT_UNITS_BOOLEAN)
#MIXERCONTROL_CONTROLTYPE_SINGLESELECT     = (#MIXERCONTROL_CT_CLASS_LIST | #MIXERCONTROL_CT_SC_LIST_SINGLE | #MIXERCONTROL_CT_UNITS_BOOLEAN)

#MIXERCONTROL_CONTROLTYPE_MIXER            = (#MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT + 1)
#MIXERCONTROL_CONTROLTYPE_MUX              = (#MIXERCONTROL_CONTROLTYPE_SINGLESELECT + 1)


;MIXER_SOURCES
#MIXERLINE_SRC_ANALOG = $100A
#MIXERLINE_SRC_AUXILIARY = $1009
#MIXERLINE_SRC_COMPACTDISC = $1005
#MIXERLINE_SRC_DIGITAL = $1001
#MIXERLINE_SRC_LINE = $1002
#MIXERLINE_SRC_MICROPHONE = $1003
#MIXERLINE_SRC_PCSPEAKER = $1007
#MIXERLINE_SRC_SYNTHESIZER = $1004
#MIXERLINE_SRC_TELEPHONE = $1006
#MIXERLINE_SRC_UNDEFINED = $1000
#MIXERLINE_SRC_WaveOut = $1008

;MIXER_DESTINATIONS
#MIXERLINE_DST_FIRST = $0
#MIXERLINE_DST_DIGITAL = $1
#MIXERLINE_DST_HEADPHONES = $5
#MIXERLINE_DST_LAST = $8
#MIXERLINE_DST_LINE = $2
#MIXERLINE_DST_MONITOR = $3
#MIXERLINE_DST_SPEAKERS = $4
#MIXERLINE_DST_TELEPHONE = $6
#MIXERLINE_DST_UNDEFINED = $0
#MIXERLINE_DST_VOICEIN = $8
#MIXERLINE_DST_WAVEIN = $7


;MIXER_OPENBY
#MIXER_OPENBY_WAVEOUT_ID = #MIXER_OBJECTF_WAVEOUT
#MIXER_OPENBY_WAVEIN_ID = #MIXER_OBJECTF_WAVEIN
#MIXER_OPENBY_MIDIOUT_ID = #MIXER_OBJECTF_MIDIOUT
#MIXER_OPENBY_MIDIIN_ID = #MIXER_OBJECTF_MIDIIN
#MIXER_OPENBY_MIXER_ID = #MIXER_OBJECTF_MIXER


;GMEMFlags
#GMEM_FIXED = $0
#GMEM_MOVEABLE = $2
#GMEM_ZEROINIT = $40



 Structure MWAVEOUTCAPS
     wMid.w               
     wPid.w                 
     vDriverVersion.l       
     szPname.s{#MAX_PNAME_LEN}
     dwFormats.l
     wChannels.w
     dwSupport.l
 EndStructure
;
Structure MWAVEINCAPS
     wMid.w     
     wPid.w     
     vDriverVer.l
     szPname.s{#MAX_PNAME_LEN}
     dwFormats.l
     wChannels.w
     wReserved1.w
EndStructure
;
Structure MMIXERCAPS
     wMid.w               
     wPid.w               
     vDriverVersion.l     
     szPname.s{#MAX_PNAME_LEN}
     fdwSupport.l   
     cDestinations.l
EndStructure
;
Structure MMIDIINCAPS
     wMid.w               
     wPid.w               
     vDriverVersion.l     
     szPname.s{#MAX_PNAME_LEN}
     fdwSupport.l
EndStructure
;
 Structure MMIDIOUTCAPS
     wMid.w
     wPid.w
     vDriverVersion.l
     szPname.s{#MAX_PNAME_LEN}
     wTechnology.w
     wVoices.w
     wNotes.w
     wChannelMask.w
     dwSupport.l
 EndStructure
;
Structure MTARGET
     dwType.l
     dwDeviceID.l
     wMid.w
     wPid.w
     vDriverVersion.l
     szPname.s{#MAX_PNAME_LEN}
EndStructure
;
Structure MMIXERLINE
     cbStruct.l             
     dwDestination.l       
     dwSource.l             
     dwLineID.l             
     fdwLine.l             
     dwUser.l               
     dwComponentType.l     
     cChannels.l           
     cConnections.l         
     cControls.l           
     szShortName.s{#MIXER_SHORT_NAME_CHARS}
     szName.s{#MIXER_LONG_NAME_CHARS}
     tTarget.MTARGET
EndStructure
;
Structure MMIXERLINECONTROLS
     cbStruct.l             
     dwLineID.l             
     dwControl.l           
     cControls.l           
     cbmxctrl.l           
     pamxctrl.l           
EndStructure
;
Structure MMIXERCONTROLDETAILS_LISTTEXT
    dwParam1.l           
    dwParam2.l             
    szName.l             
EndStructure

; Structure MMIXERCONTROL
;   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; 

Structure MMIXERCONTROL
    cbStruct.l
    dwControlID.l
    dwControlType.l
    fdwControl.l
    cMultipleItems.l
    szShortName.s{#MIXER_SHORT_NAME_CHARS}
    szName.s{#MIXER_LONG_NAME_CHARS}
    lMinimum.l
    lMaximum.l
    Reserved.l[10]
EndStructure;

Structure MMIXERCONTROLDETAILS
    cbStruct.l             
    dwControlID.l         
    cChannels.l           
    item.l                 
    cbDetails.l           
    paDetails.l           
EndStructure

Structure MMIXERCONTROLDETAILS_BOOLEAN
     fValue.l             
EndStructure

Structure MMIXERCONTROLDETAILS_UNSIGNED
     fValue.l             
EndStructure

Declare DeviceClose()


Global hMixer.l

Procedure GetDeviceCount(devmode.l) ;openbytype

    Select devmode
        Case #MIXER_OPENBY_MIXER_ID
           DeviceCount = mixerGetNumDevs_()
        Case #MIXER_OPENBY_WAVEIN_ID
           DeviceCount = waveInGetNumDevs_()
        Case #MIXER_OPENBY_WAVEOUT_ID
           DeviceCount = waveOutGetNumDevs_()
        Case #MIXER_OPENBY_MIDIIN_ID
          DeviceCount = midiInGetNumDevs_()
        Case #MIXER_OPENBY_MIDIOUT_ID
           DeviceCount = midiOutGetNumDevs_()
    EndSelect
EndProcedure

Procedure.s GetDeviceName(Index.l,devmode.l)
    DeviceName.s{#MAX_PNAME_LEN}
    udtDevWO.MWAVEOUTCAPS
    udtDevWI.MWAVEINCAPS
    udtDevMX.MMIXERCAPS
    udtDevMI.MMIDIINCAPS
    udtDevMO.MMIDIOUTCAPS

    Select devmode

        Case #MIXER_OPENBY_MIXER_ID
             waveOutGetDevCaps_(Index,udtDevWO, SizeOf(MWAVEOUTCAPS))
             DeviceName = udtDevWO\szPname

        Case #MIXER_OPENBY_WAVEIN_ID
            waveInGetDevCaps_(Index, udtDevWI, SizeOf(MWAVEINCAPS))
            DeviceName = udtDevWI\szPname

        Case #MIXER_OPENBY_WAVEOUT_ID
            mixerGetDevCaps_(Index, udtDevMX, SizeOf(MMIXERCAPS))
            DeviceName = udtDevMX\szPname

        Case #MIXER_OPENBY_MIDIIN_ID
            midiInGetDevCaps_(Index, udtDevMI, SizeOf(MMIDIINCAPS))
            DeviceName = udtDevMI\szPname

        Case #MIXER_OPENBY_MIDIOUT_ID
            midiOutGetDevCaps_(Index, udtDevMO, SizeOf(MMIDIOUTCAPS))
            DeviceName = udtDevMO\szPname

    EndSelect
   
    ProcedureReturn DeviceName
EndProcedure

Procedure DeviceOpen(devid.l,openas.l)

    DeviceClose()

    If mixerOpen_(@hMixer,devid, 0, 0,openas)
        hMixer = 0
    EndIf
    ProcedureReturn hMixer

EndProcedure

Procedure DeviceClose()
    If hMixer <> 0
        mixerClose_(hMixer)
        hMixer = 0
    EndIf
EndProcedure

Procedure GetDestinationCount()

    udtMxInfo.MMIXERCAPS

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    If mixerGetDevCaps_(hMixer,udtMxInfo,SizeOf(MMIXERCAPS))
        ProcedureReturn -1
    Else
        ProcedureReturn udtMxInfo\cDestinations
    EndIf
EndProcedure

Procedure GetSourceCount(Destination.l)

    udtMXL.MMIXERLINE

    If hMixer = 0
        ProcedureReturn -1
    EndIf
    ; Mixer shall retrieve information about the
    ; destination by the destination;s index
    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Destination

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_DESTINATION)

        ProcedureReturn -1
    Else
        ProcedureReturn udtMXL\cConnections
    EndIf
EndProcedure

Procedure.s GetDestinationName(Index.l)
    DeviceName.s{#MAX_PNAME_LEN}
    udtMXL.MMIXERLINE

    If hMixer = 0
        ProcedureReturn ""
    EndIf

    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Index

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_DESTINATION)
        ProcedureReturn ""
    Else
        DeviceName = udtMXL\szName
        ProcedureReturn DeviceName
    EndIf
EndProcedure

Procedure.s GetSourceName(Destination.l,Index.l)

    udtMXL.MMIXERLINE

    If hMixer = 0
        ProcedureReturn ""
       
    EndIf

    ; Mixer shall retrieve information about the source
    ; by its destination and index
    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Destination
    udtMXL\dwSource = Index

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_SOURCE)

        ProcedureReturn ""
    Else
        ProcedureReturn udtMXL\szName
    EndIf
EndProcedure

Procedure GetDestinationChannels(Destination.l)

    udtMXL.MMIXERLINE

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Destination

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_DESTINATION)

        ProcedureReturn -1
    Else
        ProcedureReturn udtMXL\cChannels
    EndIf
EndProcedure

Procedure GetSourceChannels(Destination.l,Index.l)

    udtMXL.MMIXERLINE

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Destination
    udtMXL\dwSource = Index

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_SOURCE)

       ProcedureReturn -1
    Else
        ProcedureReturn udtMXL\cChannels
    EndIf
EndProcedure

Procedure GetDestinationMute(Index.l)

    udtMXCD.MMIXERCONTROLDETAILS
    udtMXLC.MMIXERLINECONTROLS
    udtMXL.MMIXERLINE
    udtMC.MMIXERCONTROL
    udtMute.MMIXERCONTROLDETAILS_BOOLEAN

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Index

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_DESTINATION)
        ProcedureReturn -1
    EndIf

    ; get the Control Id of mute setting for destination
    udtMXLC\cbStruct = SizeOf(MMIXERLINECONTROLS)
    udtMXLC\dwLineID = udtMXL\dwLineID
    udtMXLC\dwControl = MIXERCONTROL_CONTROLTYPE_MUTE
    udtMXLC\cControls = 1
    udtMXLC\cbmxctrl = SizeOf(MMIXERCONTROL)
    udtMXLC\pamxctrl = @udtMC

    If mixerGetLineControls_(hMixer,udtMXLC,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
      ProcedureReturn -1
    EndIf

    ; get the mute setting
    udtMXCD\cbStruct = SizeOf(MMIXERCONTROLDETAILS)
    udtMXCD\cChannels = udtMXL\cChannels
    udtMXCD\dwControlID = udtMC\dwControlID
    udtMXCD\cbDetails = SizeOf(MMIXERCONTROLDETAILS_BOOLEAN)
    udtMXCD\paDetails = @udtMute

    If mixerGetControlDetails_(hMixer,udtMXCD,#MIXER_GETCONTROLDETAILSF_VALUE)
      ProcedureReturn -1
    EndIf

    ProcedureReturn udtMute\fValue
EndProcedure

Procedure SetDestinationMute(Index.l,blnVal.l)

    udtMXCD.MMIXERCONTROLDETAILS
    udtMXLC.MMIXERLINECONTROLS
    udtMXL.MMIXERLINE
    udtMC.MMIXERCONTROL
    udtMute.MMIXERCONTROLDETAILS_BOOLEAN

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Index

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_DESTINATION)
       ProcedureReturn -1
    EndIf

    ; get the Control Id of mute setting for destination
    udtMXLC\cbStruct = SizeOf(MMIXERLINECONTROLS)
    udtMXLC\dwLineID = udtMXL\dwLineID
    udtMXLC\dwControl = #MIXERCONTROL_CONTROLTYPE_MUTE
    udtMXLC\cControls = 1
    udtMXLC\cbmxctrl = SizeOf(MMIXERCONTROL)
    udtMXLC\pamxctrl = @udtMC
 
    If mixerGetLineControls_(hMixer,udtMXLC,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
        ProcedureReturn -1
    EndIf

    ; set new mute setting
    udtMXCD\cbStruct = SizeOf(MMIXERCONTROLDETAILS)
    udtMXCD\cChannels = 1
    udtMXCD\dwControlID = udtMC\dwControlID
    udtMXCD\cbDetails = SizeOf(MMIXERCONTROLDETAILS_BOOLEAN)
    udtMXCD\paDetails = @udtMute
    udtMute\fValue = Abs(blnVal)

    If mixerSetControlDetails_(hMixer,udtMXCD,#MIXER_GETCONTROLDETAILSF_VALUE)
      ProcedureReturn -1
    EndIf
EndProcedure

Procedure GetSourceMute(Destination.l,Index.l)

    udtMXCD.MMIXERCONTROLDETAILS
    udtMXLC.MMIXERLINECONTROLS
    udtMXL.MMIXERLINE
    udtMC.MMIXERCONTROL
    udtMute.MMIXERCONTROLDETAILS_BOOLEAN

    If hMixer = 0
       ProcedureReturn -1
    EndIf

    ; information about the source
    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Destination
    udtMXL\dwSource = Index

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_SOURCE)
        ProcedureReturn -1
    EndIf

    ; Control Id of mute setting for source
    udtMXLC\cbStruct = SizeOf(MMIXERLINECONTROLS)
    udtMXLC\dwLineID = udtMXL\dwLineID
    udtMXLC\dwControl = #MIXERCONTROL_CONTROLTYPE_MUTE
    udtMXLC\cControls = 1
    udtMXLC\cbmxctrl = SizeOf(MMIXERCONTROL)
    udtMXLC\pamxctrl = @udtMC

    If mixerGetLineControls_(hMixer,udtMXLC,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
        ProcedureReturn -1
    EndIf

    ; get mute setting
    udtMXCD\cbStruct = SizeOf(MMIXERCONTROLDETAILS)
    udtMXCD\cChannels = udtMXL\cChannels
    udtMXCD\dwControlID = udtMC\dwControlID
    udtMXCD\cbDetails = SizeOf(MMIXERCONTROLDETAILS_BOOLEAN)
    udtMXCD\paDetails = @udtMute

    If mixerGetControlDetails_(hMixer,udtMXCD,#MIXER_GETCONTROLDETAILSF_VALUE)
        ProcedureReturn -1
    EndIf

    ProcedureReturn udtMute\fValue
EndProcedure

Procedure SetSourceMute(Destination.l,Index.L,blnVal.l)

    udtMXCD.MMIXERCONTROLDETAILS
    udtMXLC.MMIXERLINECONTROLS
    udtMXL.MMIXERLINE
    udtMC.MMIXERCONTROL
    udtMute.MMIXERCONTROLDETAILS_BOOLEAN

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    ; information about source
    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Destination
    udtMXL\dwSource = Index

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_SOURCE)
        ProcedureReturn -1
    EndIf

    ; get the Control Id of the mute setting for the source
    udtMXLC\cbStruct = SizeOf(MMIXERLINECONTROLS)
    udtMXLC\dwLineID = udtMXL\dwLineID
    udtMXLC\dwControl = #MIXERCONTROL_CONTROLTYPE_MUTE
    udtMXLC\cControls = 1
    udtMXLC\cbmxctrl = SizeOf(MMIXERCONTROL)
    udtMXLC\pamxctrl = @udtMC

    If mixerGetLineControls_(hMixer,udtMXLC,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
       ProcedureReturn -1
    EndIf

    ; set new mute setting
    udtMXCD\cbStruct = SizeOf(MMIXERCONTROLDETAILS)
    udtMXCD\cChannels = 1
    udtMXCD\dwControlID = udtMC\dwControlID
    udtMXCD\cbDetails = SizeOf(MMIXERCONTROLDETAILS_BOOLEAN)
    udtMXCD\paDetails = @udtMute

    udtMute\fValue = Abs(blnVal)

    If mixerSetControlDetails_(hMixer,udtMXCD,#MIXER_GETCONTROLDETAILSF_VALUE)
       ProcedureReturn -1
    EndIf
EndProcedure

Procedure GetDestinationVolume(Index.l,channel.l = -1)

    udtMXCD.MMIXERCONTROLDETAILS
    udtMXLC.MMIXERLINECONTROLS
    udtMXL.MMIXERLINE
    udtMC.MMIXERCONTROL
    Dim udtVol.MMIXERCONTROLDETAILS_UNSIGNED(1)
    i.l
    lngVolMax.l
    lngPer.l

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    ; information about destination
    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Index

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_DESTINATION)
        ProcedureReturn -1
    EndIf

    ; Control Id of volume setting for destination
    udtMXLC\cbStruct = SizeOf(MMIXERLINECONTROLS)
    udtMXLC\dwLineID = udtMXL\dwLineID
    udtMXLC\dwControl = #MIXERCONTROL_CONTROLTYPE_VOLUME
    udtMXLC\cControls = 1
    udtMXLC\cbmxctrl = SizeOf(MMIXERCONTROL)
    udtMXLC\pamxctrl = @udtMC

    If mixerGetLineControls_(hMixer,udtMXLC,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
         ProcedureReturn -1
    EndIf

    ; space for the volume of every channel
    ReDim udtVol.MMIXERCONTROLDETAILS_UNSIGNED(udtMXL\cChannels - 1)

    ; get the volume for every channel of the destination
    udtMXCD\cbStruct = SizeOf(MMIXERCONTROLDETAILS)
    udtMXCD\cChannels = udtMXL\cChannels
    udtMXCD\dwControlID = udtMC\dwControlID
    udtMXCD\cbDetails = SizeOf(MMIXERCONTROLDETAILS_UNSIGNED)
    udtMXCD\paDetails = @udtVol(0)

    If mixerGetControlDetails_(hMixer,udtMXCD,#MIXER_GETCONTROLDETAILSF_VALUE)
       ProcedureReturn -1
    EndIf

    ; volume in percent
    If channel = -1
        ; all channels, return average
        For i = 0 To udtMXL\cChannels - 1
            lngPer = (udtVol(i)\fValue / (udtMC\lMaximum - udtMC\lMinimum) * 100)

            If lngPer > lngVolMax
                lngVolMax = lngPer
            EndIf
        Next

        ProcedureReturn lngVolMax
    Else
        ProcedureReturn udtVol(channel)\fValue / (udtMC\lMaximum - udtMC\lMinimum) * 100
    EndIf
EndProcedure

Procedure SetDestinationVolume(Index.l,lngPercent,channel.l = -1)

    udtMXCD.MMIXERCONTROLDETAILS
    udtMXLC.MMIXERLINECONTROLS
    udtMXL.MMIXERLINE
    udtMC.MMIXERCONTROL
    Dim udtVol.MMIXERCONTROLDETAILS_UNSIGNED(1)
    i.l

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    ; information about destination
    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Index

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_DESTINATION)
        ProcedureReturn -1
    EndIf

    ; get Control Id of volume setting for destination
    udtMXLC\cbStruct = SizeOf(MMIXERLINECONTROLS)
    udtMXLC\dwLineID = udtMXL\dwLineID
    udtMXLC\dwControl = #MIXERCONTROL_CONTROLTYPE_VOLUME
    udtMXLC\cControls = 1
    udtMXLC\cbmxctrl = SizeOf(MMIXERCONTROL)
    udtMXLC\pamxctrl = @udtMC

    If mixerGetLineControls_(hMixer,udtMXLC,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
       ProcedureReturn -1
    EndIf


    ; space for the volume of every channel
    ReDim udtVol.MMIXERCONTROLDETAILS_UNSIGNED(udtMXL\cChannels - 1)

    ; get the volume for every channel in the destination
    udtMXCD\cbStruct = SizeOf(MMIXERCONTROLDETAILS)
    udtMXCD\cChannels = udtMXL\cChannels
    udtMXCD\dwControlID = udtMC\dwControlID
    udtMXCD\cbDetails = SizeOf(MMIXERCONTROLDETAILS_UNSIGNED)
    udtMXCD\paDetails = @udtVol(0)

    If mixerGetControlDetails_(hMixer,udtMXCD,#MIXER_GETCONTROLDETAILSF_VALUE)
       ProcedureReturn -1
    EndIf

    ; set the volume for every or one channeƶ
    If channel = -1
        For i = 0 To udtMXL\cChannels - 1
            udtVol(i)\fValue = (((lngPercent) / 100) + udtMC\lMinimum) * (udtMC\lMaximum - udtMC\lMinimum)
        Next
    Else
        udtVol(channel)\fValue = (((lngPercent) / 100) + udtMC\lMinimum) * (udtMC\lMaximum - udtMC\lMinimum)
    EndIf

    If mixerSetControlDetails_(hMixer,udtMXCD,#MIXER_GETCONTROLDETAILSF_VALUE)
       ProcedureReturn -1
    EndIf
EndProcedure

Procedure GetSourceVolume(Destination.l,Index.l,channel.l = -1)

    udtMXCD.MMIXERCONTROLDETAILS
    udtMXLC.MMIXERLINECONTROLS
    udtMXL.MMIXERLINE
    udtMC.MMIXERCONTROL
    Dim udtVol.MMIXERCONTROLDETAILS_UNSIGNED(1)
    i.l
    lngVolMax.l
    lngPer.l

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    ; information about source
    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Destination
    udtMXL\dwSource = Index

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_SOURCE)
        ProcedureReturn -1
    EndIf

    ; get Control Id of volume setting for source
    udtMXLC\cbStruct = SizeOf(MMIXERLINECONTROLS)
    udtMXLC\dwLineID = udtMXL\dwLineID
    udtMXLC\dwControl = #MIXERCONTROL_CONTROLTYPE_VOLUME
    udtMXLC\cControls = 1
    udtMXLC\cbmxctrl = SizeOf(MMIXERCONTROL)
    udtMXLC\pamxctrl = @udtMC

    If mixerGetLineControls_(hMixer,udtMXLC,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
      ProcedureReturn -1
    EndIf


    ; space for volume of every channel
    ReDim udtVol.MMIXERCONTROLDETAILS_UNSIGNED(udtMXL\cChannels - 1)

    ; get volume for every channel
    udtMXCD\cbStruct = SizeOf(MMIXERCONTROLDETAILS)
    udtMXCD\cChannels = udtMXL\cChannels
    udtMXCD\dwControlID = udtMC\dwControlID
    udtMXCD\cbDetails = SizeOf(MMIXERCONTROLDETAILS_UNSIGNED)
    udtMXCD\paDetails = @udtVol(0)

    If mixerGetControlDetails_(hMixer,udtMXCD,#MIXER_GETCONTROLDETAILSF_VALUE)
        ProcedureReturn -1
    EndIf

    ; volume in percent
    If channel = -1
        ; all channels requested, return average
                 
        For i = 0 To udtMXL\cChannels - 1
            ;lngPer = (udtVol(i)\fValue / (udtMC\lMaximum - udtMC\lMinimum) * 100)
           
            fx.f = udtVol(i)\fValue
            lngPer = (fx / (udtMC\lMaximum - udtMC\lMinimum) * 100)
           
           
            If lngPer > lngVolMax
                lngVolMax = lngPer
            EndIf
        Next

        ProcedureReturn lngVolMax
    Else
        ProcedureReturn udtVol(channel)\fValue / (udtMC\lMaximum - udtMC\lMinimum) * 100
    EndIf
EndProcedure

Procedure SetSourceVolume(Destination.l,Index.l,lngPercent.l,Channel.l = -1)

    udtMXCD.MMIXERCONTROLDETAILS
    udtMXLC.MMIXERLINECONTROLS
    udtMXL.MMIXERLINE
    udtMC.MMIXERCONTROL
    Dim udtVol.MMIXERCONTROLDETAILS_UNSIGNED(1)
    i.l

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    ; information about source
    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Destination
    udtMXL\dwSource = Index

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_SOURCE)
        ProcedureReturn -1
    EndIf

    ; get Control Id of volume setting for source
    udtMXLC\cbStruct = SizeOf(MMIXERLINECONTROLS)
    udtMXLC\dwLineID = udtMXL\dwLineID
    udtMXLC\dwControl = #MIXERCONTROL_CONTROLTYPE_VOLUME
    udtMXLC\cControls = 1
    udtMXLC\cbmxctrl = SizeOf(MMIXERCONTROL)
    udtMXLC\pamxctrl = @udtMC

    If mixerGetLineControls_(hMixer,udtMXLC,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
        ProcedureReturn -1
    EndIf

    ; space for volume of every channel
    ReDim udtVol.MMIXERCONTROLDETAILS_UNSIGNED(udtMXL\cChannels - 1)
   
    udtMXCD\cbStruct = SizeOf(MMIXERCONTROLDETAILS)
    udtMXCD\cChannels = udtMXL\cChannels
    udtMXCD\dwControlID = udtMC\dwControlID
    udtMXCD\cbDetails = SizeOf(MMIXERCONTROLDETAILS_UNSIGNED) * udtMXL\cChannels
    udtMXCD\paDetails = @udtVol(0)

    If mixerGetControlDetails_(hMixer,udtMXCD,#MIXER_GETCONTROLDETAILSF_VALUE)
      ProcedureReturn -1
    EndIf


    ; return volume of all or one channel
    If channel = -1
        For i = 0 To udtMXL\cChannels - 1
            fx.f = lngPercent
            fy.f = ((fx / 100) + udtMC\lMinimum) * (udtMC\lMaximum - udtMC\lMinimum)
            udtVol(i)\fValue = fy ;(((lngPercent) / 100) + udtMC\lMinimum) * (udtMC\lMaximum - udtMC\lMinimum)
        Next
    Else
        fx.f = lngPercent
        fy.f = ((fx / 100) + udtMC\lMinimum) * (udtMC\lMaximum - udtMC\lMinimum)
        udtVol(channel)\fValue = fy ;(((lngPercent) / 100) + udtMC\lMinimum) * (udtMC\lMaximum - udtMC\lMinimum)
    EndIf

    If mixerSetControlDetails_(hMixer,udtMXCD,#MIXER_GETCONTROLDETAILSF_VALUE)
      ProcedureReturn -1
    EndIf
EndProcedure

Procedure.l GetDestinationType(Index.l) ;mixerdestinations

    udtMXL.MMIXERLINE

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Index

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_DESTINATION)
        ProcedureReturn -1
    Else
        ProcedureReturn udtMXL\dwComponentType
    EndIf
EndProcedure

Procedure.l GetSourceType(Destination.L,Index.l) ;mixersources

    udtMXL.MMIXERLINE

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    udtMXL\cbStruct = SizeOf(MMIXERLINE)
    udtMXL\dwDestination = Destination
    udtMXL\dwSource = Index

    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_SOURCE)
       ProcedureReturn -1
    Else
       ProcedureReturn udtMXL\dwComponentType
    EndIf
EndProcedure

;' ; http://www.ureader.com/message/1359669.aspx
Procedure GetSourceSelected(Destination.l,Index.l)

    mxl.MMIXERLINE
    controls.MMIXERLINECONTROLS
    Dim control.MMIXERCONTROL(1)
    cd.MMIXERCONTROLDETAILS
    Dim lv.MMIXERCONTROLDETAILS_BOOLEAN(1)
    c.l
    j.l

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    mxl\cbStruct = SizeOf(MMIXERLINE)
    mxl\dwDestination = Destination

    If mixerGetLineInfo_(hMixer,mxl,#MIXER_GETLINEINFOF_DESTINATION)
        ProcedureReturn -1
    EndIf
   
   
    ReDim control.MMIXERCONTROL(mxl\cControls);' - 1)

    controls\cbStruct = SizeOf(MMIXERLINECONTROLS)
    controls\dwLineID = mxl\dwLineID
    controls\cControls = mxl\cControls
    controls\cbmxctrl = SizeOf(MMIXERCONTROL)
    controls\pamxctrl = @control(0)
    controls\dwControl = #MIXERCONTROL_CONTROLTYPE_MUX

    If mixerGetLineControls_(hMixer,controls,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
        ProcedureReturn -1
    EndIf

    For c = 0 To controls\cControls - 1
        If (#MIXERCONTROL_CONTROLTYPE_MUX = (#MIXERCONTROL_CONTROLTYPE_MUX And control(c)\dwControlType))
            ReDim lv.MMIXERCONTROLDETAILS_BOOLEAN(control(c)\cMultipleItems - 1)

            cd\cbStruct = SizeOf(MMIXERCONTROLDETAILS)
            cd\dwControlID = control(c)\dwControlID
            cd\cChannels = 1
            cd\item = control(c)\cMultipleItems
            cd\cbDetails = SizeOf(MMIXERCONTROLDETAILS_BOOLEAN)
            cd\paDetails = @lv(0)

            mixerGetControlDetails_(hMixer,cd,#MIXER_GETCONTROLDETAILSF_VALUE)

            For j = 0 To cd\item - 1
                If lv(j)\fValue = 1 ;j = (GetSourceCount(Destination) - Index - 1)
                    ;lv(j)\fValue = 1
                    mSourceSelected = lv(j)\fValue
                    Break
                EndIf
            Next
           
           
        EndIf
    Next

    ProcedureReturn mSouceSelected
   
EndProcedure

Procedure SetSourceSelected(Destination.l,Index.l,blnVal.l)

    mxl.MMIXERLINE
    controls.MMIXERLINECONTROLS
    ;Dim control.MMIXERCONTROL(1)
    cd.MMIXERCONTROLDETAILS
    Dim lv.MMIXERCONTROLDETAILS_BOOLEAN(1)
    c.l
    j.l

    If hMixer = 0
        ProcedureReturn -1
    EndIf

    mxl\cbStruct = SizeOf(MMIXERLINE)
    mxl\dwDestination = Destination

    If mixerGetLineInfo_(hMixer,mxl,#MIXER_GETLINEINFOF_DESTINATION)
        ProcedureReturn -1
    EndIf

    Dim control.MMIXERCONTROL(mxl\cControls-1)
    Debug "controls " + Str(mxl\cControls)
   
    controls\cbStruct = SizeOf(MMIXERLINECONTROLS)
    controls\dwLineID = mxl\dwLineID
    controls\cControls = mxl\cControls
    controls\cbmxctrl = SizeOf(MMIXERCONTROL)
    controls\pamxctrl = @control(0)
    controls\dwControl = #MIXERCONTROL_CONTROLTYPE_MUX

    If mixerGetLineControls_(hMixer,controls,#MIXER_GETLINECONTROLSF_ONEBYTYPE)   
        ProcedureReturn -1
    EndIf

    For c = 0 To controls\cControls - 1
        If #MIXERCONTROL_CONTROLTYPE_MUX = (#MIXERCONTROL_CONTROLTYPE_MUX & control(c)\dwControlType)
            ReDim lv.MMIXERCONTROLDETAILS_BOOLEAN(control(c)\cMultipleItems - 1)

            cd\cbStruct = SizeOf(MMIXERCONTROLDETAILS)
            cd\dwControlID = control(c)\dwControlID
            cd\cChannels = 1
            cd\item = control(c)\cMultipleItems
            cd\cbDetails = SizeOf(MMIXERCONTROLDETAILS_BOOLEAN)
            cd\paDetails = @lv(0)

            mixerGetControlDetails_(hMixer,cd,MIXER_GETCONTROLDETAILSF_VALUE)
             
            For i = 0 To cd\item - 1
                       If lv(i)\fValue
                           lv(i)\fValue = 0;
                        EndIf
                  Next
                     lv(index)\fValue = 1;

            mixerSetControlDetails_(hMixer,cd,#MIXER_SETCONTROLDETAILSF_VALUE)
        EndIf
     Next
EndProcedure


Procedure MuteVol(bmute.l)

DeviceClose()

If Not DeviceOpen(0,#MIXER_OPENBY_MIXER_ID)
        MessageRequester("Mixer","Couldn;t open the device!")
    ProcedureReturn 0
EndIf

SetDestinationMute(0,bmute)

EndProcedure

;set recording source to line in

Debug DeviceOpen(0,#MIXER_OPENBY_WAVEIN_ID)
Debug GetDeviceName(0,#MIXER_OPENBY_WAVEIN_ID)
x = GetDestinationCount()
Debug "destination count " + Str(x)
stype.s
For c = 0 To x-1
  ;Debug GetdestinationName(c)
  If GetDestinationType(c) = #MIXERLINE_DST_WAVEIN
     x = GetSourceCount(c)
     For a = 0 To x -1
       If GetSourceType(c,a) = #MIXERLINE_SRC_LINE
         Debug "Source Name= " + GetSourceName(c,a)
         If SetSourceSelected(c,a,#True) =0
           Debug "Setting Source to " + GetSourceName(c,a)
         EndIf
         If SetSourceVolume(c,a,60) =0
           Debug "Set Source Volume 60"
         EndIf
         If GetSourceSelected(c,a) =0
           Debug GetSourceName(c,a) + " is selected"
         EndIf
         Debug  GetSourceName(c,a) + " level =" + Str(GetSourceVolume(c,a)) 
         GetSourceVolume(c,a)
         bfound = #True
         Break;
       EndIf
      Next
  EndIf     
  If bfound
    Break
  EndIf   
Next

;mute the master volume

muteVol(1) 


Posted: Fri Sep 12, 2008 1:30 pm
by srod
Sorry Idle, I have no idea what the code is supposed to do - let alone where the bugs may be? Well it doesn't seem to do anything on my system!

Posted: Fri Sep 12, 2008 7:59 pm
by Rescator
Also remember that a lot of the mixercontrol stuff won't work, only partly works, works differently, or only works within the current application, if running under Vista as Vista has changed the way the sound API's work.

Posted: Fri Sep 12, 2008 8:54 pm
by idle
The code is supposed to switch recording to lineIn set its input to 60 percent and then it mutes the master volume.

As far as I'm aware it should work on Vista the VB version does.

Often the problems people encounter with the mixer is trying to change sources and destinations by name and that's not very practical for instance if you wanted to set recording to WaveOut it might be called WaveOut or WaveOut Mix or Stereo Mix or any number of names. So you really need to do it by type.

Anyway it's fixed now: ! don't know about vista though

Posted: Thu Sep 25, 2008 11:52 pm
by chris319
What is the practical difference between muting something and setting its volume to zero?

Posted: Thu Sep 25, 2008 11:57 pm
by idle
It's just that the volume will be restored to it's current level when you use mute. as opposed to you storing it and resetting it.

Posted: Fri Sep 26, 2008 7:46 am
by chris319
In the second post you have a bug at line 916:

Code: Select all

ReDim control.MMIXERCONTROL(mxl\cControls - 1)
If mxl\cControls equals 0 and you subtract one, you will get a run-time error saying you can't redimension an array to have -1 elements.

Posted: Fri Sep 26, 2008 8:49 am
by idle
thanks for that, think that was left over from debugging.

Posted: Sat Sep 27, 2008 10:07 am
by chris319
Here is a handy procedure which you can add to the first code posting. It steps through all of the available mixers and lists all of the available controls.

I reversed the designations for "auxiliary" and "line in".

Code: Select all

 Procedure ListMixerControls() 
 ret.l 

 ; is there a mixer available? 
 If MixerNumber < 0 Or MixerNumber > mixerGetNumDevs_() - 1 
   ProcedureReturn ret 
 EndIf 

ct = 0
Repeat
mixr = mixerOpen_(@hMixerHandle, ct, 0, 0, 0)
;Debug Str(ct) + "   " + Str(mixr)

ct = ct + 1
Until mixr <> #MMSYSERR_NOERROR
mixrct = ct - 1

For MixerNumber = 0 To mixrct - 1
;Debug mixrct

;End
 ; open the mixer 
 
 ret = mixerOpen_(@hMixerHandle, MixerNumber, 0, 0, 0) 

 If ret <> #MMSYSERR_NOERROR
    Debug "Unable to open mixer"
    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)) 
 If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Speaker (master) volume": EndIf

 ; microphone volume 
 ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, #MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(#MICROPHONE)) 
 If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Microphone volume": EndIf

 ; Auxiliary volume 
 ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY, #MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(#AUXILIARY)) 
 If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Auxiliary volume": EndIf

 ; CD volume 
 ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC, #MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(#COMPACTDISC)) 
 If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Compact disc volume": EndIf

 ; Synthesizer volume 
 ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER, #MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(#SYNTHESIZER)) 
 If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Synthesizer volume": EndIf

 ; wave out volume 
 ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT, #MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(#WAVEOUT)) 
 If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Wave out volume": EndIf

 ; Line in volume 
 ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_LINE, #MIXERCONTROL_CONTROLTYPE_VOLUME, uMixerControls(#LINEIN)) 
 If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Line in volume": EndIf

 ; speaker (master) mute 
 ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#SPEAKER_MUTE)) 
 If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Speaker (master) mute": EndIf

 ; microphone mute 
 ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#MICROPHONE_MUTE)) 
If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Microphone mute": EndIf

 ; Auxiliary mute 
 ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#AUXILIARY_MUTE)) 
If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Auxiliary mute": EndIf

 ; CD mute 
 ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#COMPACTDISC_MUTE)) 
If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Compact disc mute": EndIf

 ; Synthesizer mute 
 ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#SYNTHESIZER_MUTE)) 
If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Synthesizer mute": EndIf

 ; wave out mute 
 ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#WAVEOUT_MUTE)) 
If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Wave out mute": EndIf

 ; Line in mute 
 ret = GetMixerControl(hMixerHandle, #MIXERLINE_COMPONENTTYPE_SRC_LINE, #MIXERCONTROL_CONTROLTYPE_MUTE, uMixerControls(#LINEIN_MUTE)) 
If ret <> 0: Debug "Mixer " + Str(MixerNumber) + ": Line in mute": EndIf

Debug ""

Next
 ; return the mixer handle 
 ProcedureReturn #True 
 EndProcedure

Posted: Sat Sep 27, 2008 5:24 pm
by chris319
So far, no joy in getting any of this code to modify mixer settings under Vista. It can read mixer settings but changing them is another matter.

This might explain why:

http://blogs.msdn.com/larryosterman/arc ... vista.aspx

Posted: Sat Sep 27, 2008 9:54 pm
by idle
Sorry I can't be of any help there, I don't have Vista.

Posted: Sat Sep 27, 2008 11:00 pm
by chris319
idle wrote:Sorry I can't be of any help there, I don't have Vista.
Probably just as well.

Posted: Sun Sep 28, 2008 1:11 am
by idle
It's as the saying goes, if you don't have anything nice to say don't say it!
which sums up my thoughts about Vista!