Mixer Controls

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
idle
Beiträge: 1
Registriert: 13.09.2008 10:03
Kontaktdaten:

Mixer Controls

Beitrag 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)




Benutzeravatar
Knight_Rider_2000
Beiträge: 145
Registriert: 05.02.2007 20:46
Kontaktdaten:

Beitrag 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
PB 4.20,Blitz3D 1.98,Microsoft Visual Studio 2005 Professional, Microsoft Visual Studio 2008 Professional
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Beitrag 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 :?
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Antworten