Code: Alles auswählen
#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)