Code archives/Audio/Windows Audio Mixer Blitz Functions
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
examplesInclude "audiomixer.bb" ; Watch the windows audio mixer while running this to see levels change. ; examples of setvolume function ; SetVolume(4,2000) this sets main volume to 2000 (0 to 65535 range) ; MixerName$ = SetVolume( MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,NewVolume) This sets main volume ; MixerName$ = SetVolume( 262145,NewVolume,10000 ) This uses LineID to set LineIn/Mic record level. While Not KeyHit(1) Cls Locate 1,10 For controls% = MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED To MIXERLINE_COMPONENTTYPE_SRC_LAST ; loop through all stanard window mixer lines. ; look in audiomixer include file for list of 'standard' types. ; your card will not have all types. If controls = MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED Then MixerControl = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS ; this is the main volume (NOTE: value is 4) Else MixerControl = controls EndIf OldVolume = GetVolume( MixerControl) ; Depending on sound card some special controls will fail ; if OldVolume = -1 it has failed. If OldVolume =>0 Then NewVolume = OldVolume + Rand(-1000,1000) MixerName$ = SetVolume( MixerControl, NewVolume) ; MixerName$ will contain name of Mixer control if volume was set OK. If MixerName$ <> "" Then Print MixerName$ + " number " + controls + " new value " + NewVolume End If End If Next Delay 500 Wend End ; This displays all your mixer line details. ; This info is very different for each sound card. ; It also creates a file containing the Name and lineID's of each mixer line. graphics 800,600,16,2 include "audiomixer.bb" setfont LoadFont("Arial",12,False,False,False) local hMixer% local uMixerCaps.MIXERCAPS = new MIXERCAPS local uMixerDestinationLine.MIXERLINE = new MIXERLINE local uMixerLineControls.MIXERLINECONTROLS = new MIXERLINECONTROLS local uDetails.MIXERCONTROLDETAILS = new MIXERCONTROLDETAILS local mxbank = createbank(52) local mxlbank = createbank(168) local mxlcbank = createbank(24) local mxcbank = createbank(148) local zerobank = createbank(4) rc=mixerGetDevCaps(hmixer, mxbank, 52) wMid% = peekint(mxbank,0) wPid% = peekint(mxbank,4) vDriverVersion% = peekint(mxbank,8) szPname$ = peekstr(mxbank,40,8) fdwSupport = peekint(mxbank,48) cDestinations = peekint(mxbank,44) print print "MIXER FOR " + szPname$ print print " DESTIMATIONS" For iDestIndex = 0 To cDestinations - 1 pokeint(mxlbank,0,banksize(mxlbank)) ;size of the struct pokeint(mxlbank,4,iDestIndex) ;Destination index pokeint(mxlbank,8,0) ;This must be set to zero when calling mixerGetLineInfo ;with the MIXER_GETLINEINFOF_DESTINATION flag. rc=mixerGetLineInfo(hMixer, mxlbank, MIXER_GETLINEINFOF_DESTINATION) if rc = 0 then dwDestination% = peekint(mxlbank,4); zero based destination index dwSource% = peekint(mxlbank,8); zero based source index (if source) dwLineID% = peekint(mxlbank,12); unique line id for mixer device fdwLine% = peekint(mxlbank,16); state/information about line dwUser% = peekint(mxlbank,20); driver specific information cChannels% = peekint(mxlbank,28); number of channels line supports cConnections% = peekint(mxlbank,32); number of connections (possible) cControls% = peekint(mxlbank,36); number of controls at this line szShortName$ = peekstr(mxlbank,16,40) szName$ = peekstr(mxlbank,64,56) dwType% = peekint(mxlbank, 120) dwDeviceID% = peekint(mxlbank,124) wMid% = peekint(mxlbank,128) wPid% = peekint(mxlbank,130) vDriverVersion% = peekint(mxlbank,132) szPname$ = peekstr(mxlbank,32,136) print print " "+szName$ +" Connections "+ cConnections% + " Controls "+ cControls% + " Channels "+ cChannels% + " LineID "+ dwLineID% End if Next print print " LINE ID's" out=writefile("lineIDs.txt") For Index = -65536 To 655350 pokeint(mxlbank,12,Index) ;LineID index pokeint(mxlbank,8,0) ;This must be set to zero when calling mixerGetLineInfo rc=mixerGetLineInfo(hMixer, mxlbank, MIXER_GETLINEINFOF_LINEID) if rc = 0 then dwDestination% = peekint(mxlbank,4); zero based destination index dwSource% = peekint(mxlbank,8); zero based source index (if source) dwLineID% = peekint(mxlbank,12); unique line id for mixer device fdwLine% = peekint(mxlbank,16); state/information about line dwUser% = peekint(mxlbank,20); driver specific information cChannels% = peekint(mxlbank,28); number of channels line supports cConnections% = peekint(mxlbank,32); number of connections (possible) cControls% = peekint(mxlbank,36); number of controls at this line szShortName$ = peekstr(mxlbank,16,40) szName$ = peekstr(mxlbank,64,56) dwType% = peekint(mxlbank, 120) dwDeviceID% = peekint(mxlbank,124) wMid% = peekint(mxlbank,128) wPid% = peekint(mxlbank,130) vDriverVersion% = peekint(mxlbank,132) szPname$ = peekstr(mxlbank,32,136) print print " "+szName$ + " LineID "+ dwLineID% + " Type "+ dwType% + " Connections "+ cConnections% + " Controls "+ cControls% + " Channels "+ cChannels% + " Source "+dwSource% writeline out,"data "+dwLineID% + ","+ chr(34) + szName$ + chr(34) if cControls > 0 then outsize = 148*cControls resizebank mxcbank,outsize pokeint(mxlcbank,0, banksize(mxlcbank)) pokeint(mxlcbank,4,dwLineID) pokeint(mxlcbank,8,0) pokeint(mxlcbank,12,ccontrols) pokeint(mxlcbank,16,148) mem = GlobalAlloc($40, outsize) pokeint(mxlcbank,20,mem) pokeint(mxcbank,0, banksize(mxcbank)) pokeint(mxcbank,4, 0) pokeint(mxcbank,8, 0) pokeint(mxcbank,12,0) ; Get the control rc = mixerGetLineControls(hmixer, mxlcbank, MIXER_GETLINECONTROLSF_ALL) ; stop ; printbank mxlcbank If ( MMSYSERR_NOERROR= rc) Then ; 11 ; Copy the control into the destination structure CopyStructFromPtr mxcbank, peekint(mxlcbank,20), outsize for numctrl = 0 to cControls-1 cbStruct% = peekint(mxcbank,numctrl*148+0) ; size in Byte of MIXERCONTROL dwControlID% = peekint(mxcbank,numctrl*148+4) ; unique control id for mixer device dwControlType% = peekint(mxcbank,numctrl*148+8) ; MIXERCONTROL_CONTROLTYPE_xxx fdwControl% = peekint(mxcbank,numctrl*148+12) ; MIXERCONTROL_CONTROLF_xxx cMultipleItems%= peekint(mxcbank,numctrl*148+16) ; if MIXERCONTROL_CONTROLF_MULTIPLE szShortName$ = peekstr(mxcbank,numctrl*148+16,20) ; set short name of control szName$ = peekstr(mxcbank,numctrl*148+64,36) ; long name of control lMinimum% = peekint(mxcbank,numctrl*148+100); Minimum value lMaximum% = peekint(mxcbank,numctrl*148+104); Maximum value print " * "+szName$ + " ControlType "+GetControlName$(dwControlType%) next End If End If GlobalFree (mem) End If if keyhit(1) end next closefile out print print "hit any key." while not getkey() wend | |||||
; Windows Audio Mixer Blitz Functions ; audiomixer.bb ; v1 ADAmor ZILTCH 31 July 2003 ;---------------------- USERLIBS DECLS NEEDED ; .lib "Kernel32.dll" ; CopyStructFromPtr(struct*,ptr%,cb%):"RtlMoveMemory" ; CopyPtrFromStruct(ptr%, struct*, cb%):"RtlMoveMemory" ; GlobalAlloc%(wFlags%, dwBytes%) ; GlobalLock%(hmem%) ; GlobalFree%(hmem%) ;---------------------- ; .lib "winmm.dll" ; mixerOpen%(phmx%, uMxId%, dwCallback%, dwInstance%, fdwOpen%) ; mixerClose%(hmx%) ; mixerGetControlDetails%(hmxobj%, pmxcd*, fdwDetails%):"mixerGetControlDetailsA" ; mixerGetDevCaps%(uMxId%, pmxcaps*, cbmxcaps%): "mixerGetDevCapsA" ; mixerGetID%(hmxobj%, pumxID%, fdwId%) ; mixerGetLineControls%(hmxobj%, pmxlc*, fdwControls%): "mixerGetLineControlsA" ; mixerGetLineInfo%(hmxobj%, pmxl*, fdwInfo%):"mixerGetLineInfoA" ; mixerGetNumDevs%() ; mixerMessage%(hmx%, uMsg%, dwParam1%, dwParam2%) ; mixerSetControlDetails%(hmxobj%, pmxcd*, fdwDetails%) ;---------------------- ; .lib "Kernel32.dll" ; CopyStructFromPtr(struct*,ptr%,cb%):"RtlMoveMemory" ; CopyPtrFromStruct(ptr%, struct*, cb%):"RtlMoveMemory" ; GlobalAlloc%(wFlags%, dwBytes%) ; GlobalLock%(hmem%) ; GlobalFree%(hmem%) ;---------------------- Const MMSYSERR_NOERROR = 0 Const MMSYSERR_ERROR = 1 ; unspecified error Const MMSYSERR_BADDEVICEID = 2 ; device ID out of range Const MMSYSERR_NOTENABLED = 3 ; driver failed enable Const MMSYSERR_ALLOCATED = 4 ; device already allocated Const MMSYSERR_INVALHANDLE = 5 ; device handle is invalid Const MMSYSERR_NODRIVER = 6 ; no device driver present Const MMSYSERR_NOMEM = 7 ; memory allocation error Const MMSYSERR_NOTSUPPORTED = 8 ; function isn't supported Const MMSYSERR_BADERRNUM = 9 ; error value out of range Const MMSYSERR_INVALFLAG = 10 ; invalid flag passed Const MMSYSERR_INVALPARAM = 11 ; invalid parameter passed Const MMSYSERR_HANDLEBUSY = 12 ; handle being used Const MAXPNAMELEN = 32 Const MIXER_LONG_NAME_CHARS = 64 Const MIXER_SHORT_NAME_CHARS = 16 Const MIXER_GETLINEINFOF_DESTINATION = $00000000 Const MIXER_GETLINEINFOF_SOURCE = $00000001 Const MIXER_GETLINEINFOF_LINEID = $00000002 Const MIXER_GETLINEINFOF_COMPONENTTYPE = $00000003 Const MIXER_GETLINEINFOF_TARGETTYPE = $00000004 Const MIXER_GETCONTROLDETAILSF_VALUE = $0 Const MIXER_GETLINECONTROLSF_ALL = $0 Const MIXER_GETLINECONTROLSF_ONEBYID = $1 Const MIXER_GETLINECONTROLSF_ONEBYTYPE = $2 ;-- MIXERCONTROL.fdwControl Const MIXERCONTROL_CONTROLF_UNIFORM = $00000001 Const MIXERCONTROL_CONTROLF_MULTIPLE = $00000002 Const MIXERCONTROL_CONTROLF_DISABLED = $80000000 ;-- MIXERCONTROL_CONTROLTYPE_xxx building block defines Const MIXERCONTROL_CT_CLASS_MASK = $F0000000 Const MIXERCONTROL_CT_CLASS_CUSTOM = $00000000 Const MIXERCONTROL_CT_CLASS_METER = $10000000 Const MIXERCONTROL_CT_CLASS_SWITCH = $20000000 Const MIXERCONTROL_CT_CLASS_NUMBER = $30000000 Const MIXERCONTROL_CT_CLASS_SLIDER = $40000000 Const MIXERCONTROL_CT_CLASS_FADER = $50000000 Const MIXERCONTROL_CT_CLASS_TIME = $60000000 Const MIXERCONTROL_CT_CLASS_LIST = $70000000 Const MIXERCONTROL_CT_SUBCLASS_MASK = $0F000000 Const MIXERCONTROL_CT_SC_SWITCH_BOOLEAN = $00000000 Const MIXERCONTROL_CT_SC_SWITCH_BUTTON = $01000000 Const MIXERCONTROL_CT_SC_METER_POLLED = $00000000 Const MIXERCONTROL_CT_SC_TIME_MICROSECS = $00000000 Const MIXERCONTROL_CT_SC_TIME_MILLISECS = $01000000 Const MIXERCONTROL_CT_SC_LIST_SINGLE = $00000000 Const MIXERCONTROL_CT_SC_LIST_MULTIPLE = $01000000 Const MIXERCONTROL_CT_UNITS_MASK = $00FF0000 Const MIXERCONTROL_CT_UNITS_CUSTOM = $00000000 Const MIXERCONTROL_CT_UNITS_BOOLEAN = $00010000 Const MIXERCONTROL_CT_UNITS_SIGNED = $00020000 Const MIXERCONTROL_CT_UNITS_UNSIGNED = $00030000 Const MIXERCONTROL_CT_UNITS_DECIBELS = $00040000 ;in 10ths Const MIXERCONTROL_CT_UNITS_PERCENT = $00050000 ;in 10ths ;-- Commonly used control types for specifying MIXERCONTROL.dwControlType Const MIXERCONTROL_CONTROLTYPE_CUSTOM = (MIXERCONTROL_CT_CLASS_CUSTOM Or MIXERCONTROL_CT_UNITS_CUSTOM) Const MIXERCONTROL_CONTROLTYPE_BOOLEANMETER = (MIXERCONTROL_CT_CLASS_METER Or MIXERCONTROL_CT_SC_METER_POLLED Or MIXERCONTROL_CT_UNITS_BOOLEAN) Const MIXERCONTROL_CONTROLTYPE_SIGNEDMETER = (MIXERCONTROL_CT_CLASS_METER Or MIXERCONTROL_CT_SC_METER_POLLED Or MIXERCONTROL_CT_UNITS_SIGNED) Const MIXERCONTROL_CONTROLTYPE_PEAKMETER = (MIXERCONTROL_CONTROLTYPE_SIGNEDMETER + 1) Const MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER = (MIXERCONTROL_CT_CLASS_METER Or MIXERCONTROL_CT_SC_METER_POLLED Or MIXERCONTROL_CT_UNITS_UNSIGNED) Const MIXERCONTROL_CONTROLTYPE_BOOLEAN = (MIXERCONTROL_CT_CLASS_SWITCH Or MIXERCONTROL_CT_SC_SWITCH_BOOLEAN Or MIXERCONTROL_CT_UNITS_BOOLEAN) Const MIXERCONTROL_CONTROLTYPE_ONOFF = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 1) Const MIXERCONTROL_CONTROLTYPE_MUTE = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2) Const MIXERCONTROL_CONTROLTYPE_MONO = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 3) Const MIXERCONTROL_CONTROLTYPE_LOUDNESS = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 4) Const MIXERCONTROL_CONTROLTYPE_STEREOENH = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 5) Const MIXERCONTROL_CONTROLTYPE_BASS_BOOST = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + $00002277) Const MIXERCONTROL_CONTROLTYPE_BUTTON = (MIXERCONTROL_CT_CLASS_SWITCH Or MIXERCONTROL_CT_SC_SWITCH_BUTTON Or MIXERCONTROL_CT_UNITS_BOOLEAN) Const MIXERCONTROL_CONTROLTYPE_DECIBELS = (MIXERCONTROL_CT_CLASS_NUMBER Or MIXERCONTROL_CT_UNITS_DECIBELS) Const MIXERCONTROL_CONTROLTYPE_SIGNED = (MIXERCONTROL_CT_CLASS_NUMBER Or MIXERCONTROL_CT_UNITS_SIGNED) Const MIXERCONTROL_CONTROLTYPE_UNSIGNED = (MIXERCONTROL_CT_CLASS_NUMBER Or MIXERCONTROL_CT_UNITS_UNSIGNED) Const MIXERCONTROL_CONTROLTYPE_PERCENT = (MIXERCONTROL_CT_CLASS_NUMBER Or MIXERCONTROL_CT_UNITS_PERCENT) Const MIXERCONTROL_CONTROLTYPE_SLIDER = (MIXERCONTROL_CT_CLASS_SLIDER Or MIXERCONTROL_CT_UNITS_SIGNED) Const MIXERCONTROL_CONTROLTYPE_PAN = (MIXERCONTROL_CONTROLTYPE_SLIDER + 1) Const MIXERCONTROL_CONTROLTYPE_QSOUNDPAN = (MIXERCONTROL_CONTROLTYPE_SLIDER + 2) Const MIXERCONTROL_CONTROLTYPE_FADER = (MIXERCONTROL_CT_CLASS_FADER Or MIXERCONTROL_CT_UNITS_UNSIGNED) Const MIXERCONTROL_CONTROLTYPE_VOLUME = (MIXERCONTROL_CONTROLTYPE_FADER + 1) Const MIXERCONTROL_CONTROLTYPE_BASS = (MIXERCONTROL_CONTROLTYPE_FADER + 2) Const MIXERCONTROL_CONTROLTYPE_TREBLE = (MIXERCONTROL_CONTROLTYPE_FADER + 3) Const MIXERCONTROL_CONTROLTYPE_EQUALIZER = (MIXERCONTROL_CONTROLTYPE_FADER + 4) Const MIXERCONTROL_CONTROLTYPE_SINGLESELECT = (MIXERCONTROL_CT_CLASS_LIST Or MIXERCONTROL_CT_SC_LIST_SINGLE Or MIXERCONTROL_CT_UNITS_BOOLEAN) Const MIXERCONTROL_CONTROLTYPE_MUX = (MIXERCONTROL_CONTROLTYPE_SINGLESELECT + 1) Const MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT= (MIXERCONTROL_CT_CLASS_LIST Or MIXERCONTROL_CT_SC_LIST_MULTIPLE Or MIXERCONTROL_CT_UNITS_BOOLEAN) Const MIXERCONTROL_CONTROLTYPE_MIXER = (MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT + 1) Const MIXERCONTROL_CONTROLTYPE_MICROTIME = (MIXERCONTROL_CT_CLASS_TIME Or MIXERCONTROL_CT_SC_TIME_MICROSECS Or MIXERCONTROL_CT_UNITS_UNSIGNED) Const MIXERCONTROL_CONTROLTYPE_MILLITIME = (MIXERCONTROL_CT_CLASS_TIME Or MIXERCONTROL_CT_SC_TIME_MILLISECS Or MIXERCONTROL_CT_UNITS_UNSIGNED) .CONTROLTYPES Data "MIXERCONTROL_CONTROLTYPE_CUSTOM ",(MIXERCONTROL_CT_CLASS_CUSTOM Or MIXERCONTROL_CT_UNITS_CUSTOM) Data "MIXERCONTROL_CONTROLTYPE_BOOLEANMETER ",(MIXERCONTROL_CT_CLASS_METER Or MIXERCONTROL_CT_SC_METER_POLLED Or MIXERCONTROL_CT_UNITS_BOOLEAN) Data "MIXERCONTROL_CONTROLTYPE_SIGNEDMETER ",(MIXERCONTROL_CT_CLASS_METER Or MIXERCONTROL_CT_SC_METER_POLLED Or MIXERCONTROL_CT_UNITS_SIGNED) Data "MIXERCONTROL_CONTROLTYPE_PEAKMETER ",(MIXERCONTROL_CONTROLTYPE_SIGNEDMETER + 1) Data "MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER",(MIXERCONTROL_CT_CLASS_METER Or MIXERCONTROL_CT_SC_METER_POLLED Or MIXERCONTROL_CT_UNITS_UNSIGNED) Data "MIXERCONTROL_CONTROLTYPE_BOOLEAN ",(MIXERCONTROL_CT_CLASS_SWITCH Or MIXERCONTROL_CT_SC_SWITCH_BOOLEAN Or MIXERCONTROL_CT_UNITS_BOOLEAN) Data "MIXERCONTROL_CONTROLTYPE_ONOFF ",(MIXERCONTROL_CONTROLTYPE_BOOLEAN + 1) Data "MIXERCONTROL_CONTROLTYPE_MUTE ",(MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2) Data "MIXERCONTROL_CONTROLTYPE_MONO ",(MIXERCONTROL_CONTROLTYPE_BOOLEAN + 3) Data "MIXERCONTROL_CONTROLTYPE_LOUDNESS ",(MIXERCONTROL_CONTROLTYPE_BOOLEAN + 4) Data "MIXERCONTROL_CONTROLTYPE_STEREOENH ",(MIXERCONTROL_CONTROLTYPE_BOOLEAN + 5) Data "MIXERCONTROL_CONTROLTYPE_BASS_BOOST ",(MIXERCONTROL_CONTROLTYPE_BOOLEAN + $00002277) Data "MIXERCONTROL_CONTROLTYPE_BUTTON ",(MIXERCONTROL_CT_CLASS_SWITCH Or MIXERCONTROL_CT_SC_SWITCH_BUTTON Or MIXERCONTROL_CT_UNITS_BOOLEAN) Data "MIXERCONTROL_CONTROLTYPE_DECIBELS ",(MIXERCONTROL_CT_CLASS_NUMBER Or MIXERCONTROL_CT_UNITS_DECIBELS) Data "MIXERCONTROL_CONTROLTYPE_SIGNED ",(MIXERCONTROL_CT_CLASS_NUMBER Or MIXERCONTROL_CT_UNITS_SIGNED) Data "MIXERCONTROL_CONTROLTYPE_UNSIGNED ",(MIXERCONTROL_CT_CLASS_NUMBER Or MIXERCONTROL_CT_UNITS_UNSIGNED) Data "MIXERCONTROL_CONTROLTYPE_PERCENT ",(MIXERCONTROL_CT_CLASS_NUMBER Or MIXERCONTROL_CT_UNITS_PERCENT) Data "MIXERCONTROL_CONTROLTYPE_SLIDER ",(MIXERCONTROL_CT_CLASS_SLIDER Or MIXERCONTROL_CT_UNITS_SIGNED) Data "MIXERCONTROL_CONTROLTYPE_PAN ",(MIXERCONTROL_CONTROLTYPE_SLIDER + 1) Data "MIXERCONTROL_CONTROLTYPE_QSOUNDPAN ",(MIXERCONTROL_CONTROLTYPE_SLIDER + 2) Data "MIXERCONTROL_CONTROLTYPE_FADER ",(MIXERCONTROL_CT_CLASS_FADER Or MIXERCONTROL_CT_UNITS_UNSIGNED) Data "MIXERCONTROL_CONTROLTYPE_VOLUME ",(MIXERCONTROL_CONTROLTYPE_FADER + 1) Data "MIXERCONTROL_CONTROLTYPE_BASS ",(MIXERCONTROL_CONTROLTYPE_FADER + 2) Data "MIXERCONTROL_CONTROLTYPE_TREBLE ",(MIXERCONTROL_CONTROLTYPE_FADER + 3) Data "MIXERCONTROL_CONTROLTYPE_EQUALIZER ",(MIXERCONTROL_CONTROLTYPE_FADER + 4) Data "MIXERCONTROL_CONTROLTYPE_SINGLESELECT ",(MIXERCONTROL_CT_CLASS_LIST Or MIXERCONTROL_CT_SC_LIST_SINGLE Or MIXERCONTROL_CT_UNITS_BOOLEAN) Data "MIXERCONTROL_CONTROLTYPE_MUX ",(MIXERCONTROL_CONTROLTYPE_SINGLESELECT + 1) Data "MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT", (MIXERCONTROL_CT_CLASS_LIST Or MIXERCONTROL_CT_SC_LIST_MULTIPLE Or MIXERCONTROL_CT_UNITS_BOOLEAN) Data "MIXERCONTROL_CONTROLTYPE_MIXER ",(MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT + 1) Data "MIXERCONTROL_CONTROLTYPE_MICROTIME ",(MIXERCONTROL_CT_CLASS_TIME Or MIXERCONTROL_CT_SC_TIME_MICROSECS Or MIXERCONTROL_CT_UNITS_UNSIGNED) Data "MIXERCONTROL_CONTROLTYPE_MILLITIME ",(MIXERCONTROL_CT_CLASS_TIME Or MIXERCONTROL_CT_SC_TIME_MILLISECS Or MIXERCONTROL_CT_UNITS_UNSIGNED) Restore CONTROLTYPES Dim CONTROLTYPES_Name$(31) Dim CONTROLTYPES_Val$(31) For count = 1 To 31 Read CONTROLTYPES_Name$(count),CONTROLTYPES_Val$(count) Next ; -- Component types for mixer destinations and sources Const MIXERLINE_COMPONENTTYPE_DST_FIRST = $0 Const MIXERLINE_COMPONENTTYPE_DST_UNDEFINED = MIXERLINE_COMPONENTTYPE_DST_FIRST + 0 Const MIXERLINE_COMPONENTTYPE_DST_DIGITAL = MIXERLINE_COMPONENTTYPE_DST_FIRST + 1 Const MIXERLINE_COMPONENTTYPE_DST_LINE = MIXERLINE_COMPONENTTYPE_DST_FIRST + 2 Const MIXERLINE_COMPONENTTYPE_DST_MONITOR = MIXERLINE_COMPONENTTYPE_DST_FIRST + 3 Const MIXERLINE_COMPONENTTYPE_DST_SPEAKERS = MIXERLINE_COMPONENTTYPE_DST_FIRST + 4 Const MIXERLINE_COMPONENTTYPE_DST_HEADPHONES = MIXERLINE_COMPONENTTYPE_DST_FIRST + 5 Const MIXERLINE_COMPONENTTYPE_DST_TELEPHONE = MIXERLINE_COMPONENTTYPE_DST_FIRST + 6 Const MIXERLINE_COMPONENTTYPE_DST_WAVEIN = MIXERLINE_COMPONENTTYPE_DST_FIRST + 7 Const MIXERLINE_COMPONENTTYPE_DST_VOICEIN = MIXERLINE_COMPONENTTYPE_DST_FIRST + 8 Const MIXERLINE_COMPONENTTYPE_DST_LAST = MIXERLINE_COMPONENTTYPE_DST_FIRST + 8 Const MIXERLINE_COMPONENTTYPE_SRC_FIRST = $1000 Const MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED = MIXERLINE_COMPONENTTYPE_SRC_FIRST + 0 Const MIXERLINE_COMPONENTTYPE_SRC_DIGITAL = MIXERLINE_COMPONENTTYPE_SRC_FIRST + 1 Const MIXERLINE_COMPONENTTYPE_SRC_LINE = MIXERLINE_COMPONENTTYPE_SRC_FIRST + 2 Const MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE = MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3 Const MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER = MIXERLINE_COMPONENTTYPE_SRC_FIRST + 4 Const MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC = MIXERLINE_COMPONENTTYPE_SRC_FIRST + 5 Const MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE = MIXERLINE_COMPONENTTYPE_SRC_FIRST + 6 Const MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER = MIXERLINE_COMPONENTTYPE_SRC_FIRST + 7 Const MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT = MIXERLINE_COMPONENTTYPE_SRC_FIRST + 8 Const MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY = MIXERLINE_COMPONENTTYPE_SRC_FIRST + 9 Const MIXERLINE_COMPONENTTYPE_SRC_ANALOG = MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10 Const MIXERLINE_COMPONENTTYPE_SRC_LAST = MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10 ; -- MIXERLINE.Target.dwType Const MIXERLINE_TARGETTYPE_UNDEFINED = 0 Const MIXERLINE_TARGETTYPE_WAVEOUT = 1 Const MIXERLINE_TARGETTYPE_WAVEIN = 2 Const MIXERLINE_TARGETTYPE_MIDIOUT = 3 Const MIXERLINE_TARGETTYPE_MIDIIN = 4 Const MIXERLINE_TARGETTYPE_AUX = 5 Type MIXERCAPS Field wMid% ;0 manufacturer id Field wPid% ;4 product id Field vDriverVersion% ;8 version of the driver Field szPname$ ;12 product name Field fdwSupport% ;44 misc. support bits Field cDestinations% ;48 count of destinations End Type ;Size 52 Type MIXERCONTROL Field cbStruct% ;0 size in Byte of MIXERCONTROL Field dwControlID% ;4 unique control id for mixer device Field dwControlType% ;8 MIXERCONTROL_CONTROLTYPE_xxx Field fdwControl% ;12 MIXERCONTROL_CONTROLF_xxx Field cMultipleItems% ;16 if MIXERCONTROL_CONTROLF_MULTIPLE Field szShortName$ ;20 short name of control Field szName$ ;36 long name of control Field lMinimum% ;100 Minimum value Field lMaximum% ;104 Maximum value ; field reserved()% ;108 reserved structure space End Type ;size 148 Type MIXERCONTROLDETAILS Field cbStruct% ;0 size in Byte of MIXERCONTROLDETAILS Field dwControlID% ;4 control id to get/set details on Field cChannels% ;8 number of channels in paDetails array Field item% ;12 hwndOwner or cMultipleItems Field cbDetails% ;16 size of _one_ details_XX struct Field paDetails% ;20 pointer to array of details_XX structs End Type ;size 24 Type MIXERCONTROLDETAILS_UNSIGNED Field dwValue% ;0 value of the control End Type ;size 4 Type MIXERLINE Field cbStruct% ;0 size of MIXERLINE structure Field dwDestination% ;4 zero based destination index Field dwSource% ;8 zero based source index (if source) Field dwLineID% ;12 unique line id for mixer device Field fdwLine% ;16 state/information about line Field dwUser% ;20 driver specific information Field dwComponentType% ;24 component type line connects to Field cChannels% ;28 number of channels line supports Field cConnections% ;32 number of connections (possible) Field cControls% ;36 number of controls at this line Field szShortName$ ;40 Field szName$ ;56 Field dwType% ;120 Field dwDeviceID% ;124 Field wMid% ;128 Field wPid% ;130 Field vDriverVersion% ;132 Field szPname$ ;136 End Type ;size 168 Type MIXERLINECONTROLS Field cbStruct% ;0 size in Byte of MIXERLINECONTROLS Field dwLineID% ;4 line id (from MIXERLINE.dwLineID) ; MIXER_GETLINECONTROLSF_ONEBYID or Field dwControl% ;8 MIXER_GETLINECONTROLSF_ONEBYTYPE Field cControls% ;12 count of controls pmxctrl points to Field cbmxctrl% ;16 size in Byte of _one_ MIXERCONTROL Field pamxctrl% ;20 pointer to first MIXERCONTROL array End Type ;size 24 Type MIXERCONTROLDETAILS_LISTTEXT Field dwParam1 ;0 Field dwParam2 ;4 Field szname$ ;8 End Type ;len 72 Function GetControlName$(ControlNum) Local count For count = 1 To 31 If controlnum = CONTROLTYPES_Val$(count) Then Return CONTROLTYPES_Name$(count) End If Next Return "Control type unkown " + Controlnum End Function Function GetMixerControl(hmixer%, componentType%, ctrlType%, mxc.MIXERCONTROL,mode=0) ; This function attempts to obtain a mixer control. ; Returns True if successful. ;mode 1 uses lineID instead of control type Local mxlc.MIXERLINECONTROLS = New MIXERLINECONTROLS Local mxl.MIXERLINE = New MIXERLINE Local hmem% Local rc% Local mxlcbank = CreateBank(24) Local mxlbank = CreateBank(168) mxl\cbStruct = BankSize(mxlbank) mxl\dwComponentType = componentType PokeInt(mxlbank,0,BankSize(mxlbank)) Select mode Case 0; Obtain a line corresponding to the component type PokeInt(mxlbank,24,componentType) rc = mixerGetLineInfo(hmixer, mxlbank, MIXER_GETLINEINFOF_COMPONENTTYPE) Case 1; Obtain a line from its lineID PokeInt(mxlbank,8,0) PokeInt(mxlbank,12,componentType) rc=mixerGetLineInfo(hMixer, mxlbank, MIXER_GETLINEINFOF_LINEID) End Select If (MMSYSERR_NOERROR <> rc) Then DebugLog "error "+rc+" mixer get line info failed. For lineID/componentType of "+componentType Else mxl\dwDestination% = PeekInt(mxlbank,4); zero based destination index mxl\dwSource% = PeekInt(mxlbank,8); zero based source index (if source) mxl\dwLineID% = PeekInt(mxlbank,12); unique line id for mixer device mxl\fdwLine% = PeekInt(mxlbank,16); state/information about line mxl\dwUser% = PeekInt(mxlbank,20); driver specific information mxl\cChannels% = PeekInt(mxlbank,28); number of channels line supports mxl\cConnections% = PeekInt(mxlbank,32); number of connections (possible) mxl\cControls% = PeekInt(mxlbank,36); number of controls at this line mxl\szShortName$ = peekstr(mxlbank,16,40) mxl\szName$ = peekstr(mxlbank,64,56) mxl\dwType% = PeekInt(mxlbank, 120) mxl\dwDeviceID% = PeekInt(mxlbank,124) mxl\wMid% = PeekInt(mxlbank,128) mxl\wPid% = PeekInt(mxlbank,130) mxl\vDriverVersion% = PeekInt(mxlbank,132) mxl\szPname$ = peekstr(mxlbank,32,136) mxlc\cbStruct = BankSize(mxlcbank);24 mxlc\dwLineID = mxl\dwLineID mxlc\dwControl = ctrlType mxlc\cControls = 1 PokeInt(mxlcbank,0, BankSize(mxlcbank));24 PokeInt(mxlcbank,4,mxl\dwLineID) PokeInt(mxlcbank,8,ctrlType) PokeInt(mxlcbank,12,1) outsize=148 ; Allocate a buffer for the control hmem = GlobalAlloc($40, outsize) ;$40 mxlc\pamxctrl = GlobalLock(hmem) mxlc\cbmxctrl = outsize PokeInt(mxlcbank,16,outsize) PokeInt(mxlcbank,20,mxlc\pamxctrl) mxc\cbStruct = outsize mxcbank = CreateBank(outsize) PokeInt(mxcbank,0,mxc\cbStruct) ; Get the control rc = mixerGetLineControls(hmixer, mxlcbank, MIXER_GETLINECONTROLSF_ONEBYTYPE) ; debuglog componentType%+" " +mxl\szShortName$ GetMixerControl = False If ( MMSYSERR_NOERROR= rc) Then GetMixerControl = True ; Copy the control into the destination structure CopyStructFromPtr mxcbank, mxlc\pamxctrl, outsize mxc\cbStruct% = PeekInt(mxcbank,0) ; size in Byte of MIXERCONTROL mxc\dwControlID% = PeekInt(mxcbank,4) ; unique control id for mixer device mxc\dwControlType% = PeekInt(mxcbank,8) ; MIXERCONTROL_CONTROLTYPE_xxx mxc\fdwControl% = PeekInt(mxcbank,12) ; MIXERCONTROL_CONTROLF_xxx mxc\cMultipleItems%= PeekInt(mxcbank,16) ; if MIXERCONTROL_CONTROLF_MULTIPLE mxc\szShortName$ = peekstr(mxcbank,16,20) ; set short name of control mxc\szName$ = peekstr(mxcbank,64,36) ; long name of control mxc\lMinimum% = PeekInt(mxcbank,100); Minimum value mxc\lMaximum% = PeekInt(mxcbank,104); Maximum value End If GlobalFree (hmem) FreeBank mxcbank End If FreeBank mxlcbank FreeBank mxcbank FreeBank mxlbank Return GetMixerControl End Function Function SetVolumeControl(hmixer% , mxc.MIXERCONTROL, volume% ) ; This function sets the value for a volume control. ; Returns True if successful Local mxcd.MIXERCONTROLDETAILS = New MIXERCONTROLDETAILS Local vol.MIXERCONTROLDETAILS_UNSIGNED = New MIXERCONTROLDETAILS_UNSIGNED Local mxcdbank = CreateBank(24) Local volbank = CreateBank(4) Local mem,rc mxcd\cbStruct = BankSize(mxcdbank) mxcd\cbDetails = 4 mxcd\item = 0 mxcd\dwControlID = mxc\dwControlID PokeInt(mxcdbank,0, BankSize(mxcdbank));24 PokeInt(mxcdbank,4, mxc\dwControlID) PokeInt(mxcdbank,8, 1) PokeInt(mxcdbank,12,0) PokeInt(mxcdbank,16,BankSize(volbank) ) ; Allocate a buffer for the control value buffer mem = GlobalAlloc($40, 4) mxcd\paDetails = GlobalLock(mem) mxcd\cChannels = 1 PokeInt(mxcdbank,20,mxcd\paDetails ) ; debuglog "max "+mxc\lMaximum% If volume < mxc\lMinimum% Then volume = mxc\lMinimum% vol\dwValue% = volume Mod mxc\lMaximum% PokeInt volbank,0,volume ; Copy the data into the control value buffer CopyPtrFromStruct mxcd\paDetails, vol, BankSize(volbank) ; Set the control value rc = mixerSetControlDetails(hmixer, mxcdbank, MIXER_SETCONTROLDETAILSF_VALUE) GlobalFree (mem) FreeBank mxcdbank FreeBank volbank If (MMSYSERR_NOERROR = rc) Then SetVolumeControl = True Else SetVolumeControl = False End If Return SetVolumeControl End Function Function GetVolumeControlLevel(hmixer% , mxc.MIXERCONTROL) ; This function sets the value for a volume control. ; Returns True if successful Local mxcd.MIXERCONTROLDETAILS = New MIXERCONTROLDETAILS Local vol.MIXERCONTROLDETAILS_UNSIGNED = New MIXERCONTROLDETAILS_UNSIGNED Local mxcdbank = CreateBank(24) Local volbank = CreateBank(4) Local mem,rc mxcd\cbStruct = BankSize(mxcdbank) mxcd\cbDetails = 4 mxcd\item = mxc\cMultipleItems mxcd\dwControlID = mxc\dwControlID PokeInt(mxcdbank,0, BankSize(mxcdbank));24 PokeInt(mxcdbank,4, mxc\dwControlID) PokeInt(mxcdbank,8, 1) PokeInt(mxcdbank,12,mxc\cMultipleItems) PokeInt(mxcdbank,16,BankSize(volbank) ) ; Allocate a buffer for the control value buffer mem = GlobalAlloc($40, 4) mxcd\paDetails = GlobalLock(mem) mxcd\cChannels = 1 PokeInt(mxcdbank,20,mxcd\paDetails ) ; Set the control value rc = mixerGetControlDetails(hmixer, mxcdbank, MIXER_GETCONTROLDETAILSF_VALUE) If rc <> 0 Then DebugLog "error "+rc+" can not get control" End If CopyStructFromPtr volbank, mxcd\paDetails, 4 OUTvolume = PeekInt(volbank,0) If (OUTvolume < 0) Then OUTvolume = -OUTvolume GlobalFree (mem) FreeBank mxcdbank FreeBank volbank If (MMSYSERR_NOERROR = rc) Then SetVolumeControl = True Else SetVolumeControl = False OUTvolume = -1 End If Return OUTVolume End Function Function SetVolume$(Control=4,NewVolume,mode=0) ;returns name of Control if OK ;mode 1 uses lineID instead of control type Local ok, hmixer = 0 volCtrl.mixercontrol = New mixercontrol ; ok = GetMixerControl(hmixer, Control, MIXERCONTROL_CONTROLTYPE_VOLUME, volCtrl.mixercontrol,mode) If ok Then ok = SetVolumeControl(hmixer, volCtrl, NewVolume) If ok Then ShortName$ = volCtrl\szShortName$ Delete volctrl Return ShortName$ End If End Function Function GetVolume$(Control=4) ;returns name of Control if OK Local ok, hmixer = 0 volCtrl.mixercontrol = New mixercontrol ok = GetMixerControl(hmixer, Control,MIXERCONTROL_CONTROLTYPE_VOLUME , volCtrl.mixercontrol) If ok Then OUTVolume = GetVolumeControlLevel(hmixer, volCtrl) Else OUTVolume = - 1 End If Delete volctrl Return OUTVolume End Function ;-- bank funcions Function PeekStr$(Tbank,Size=64,Offset=0) ;note offset is 3rd param not 2nd like peekint, etc. Local count,newchr Local NewStr$ = "" Local bsize = BankSize(tbank) Local lastbyte = (offset+size-1) If lastbyte > bsize Then lastbyte = bsize For count = offset To lastbyte newchr = PeekByte(Tbank,count) If (newchr = 0) Then Exit newstr$ = newstr$ + Chr$(newchr) Next Return Newstr$ End Function |
Comments
None.
Code Archives Forum