Seite 1 von 1

Mixer Controls

Verfasst: 13.09.2008 10:07
von idle
Don't know if they work on Vista

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)





Verfasst: 13.09.2008 11:15
von Knight_Rider_2000
Tested on Vista
Debug Output says:

Code: Alles auswählen

6944960
Mic (Vinyl AC'97 Codec Combo Dr
destination count 1

Verfasst: 13.09.2008 12:33
von c4s
Output:
1329424
Realtek AC97 Audio
destination count 2
Source Name= Line-In
controls 1
Setting Source to Line-In
Set Source Volume 60
Line-In is selected
Line-In level =60

-> XP, SP3
But it doesn't seem to be "proof" for different windows versions, right?

btw:
Deutsches Forum hier :?