Bert Posted September 25, 2007 Share Posted September 25, 2007 I'm working on a replacement for sound.au3. What I've done is to combind sound.au3 with mixer.aue and added some functions to make things easier. Gary, I know I sent you the code, but I know you are busy. I figure I would let others help also.I'm having a issue with getting some of the functions to work. I want to be able to turn on and off the mute for the master volume, as well as mute on the microphone and Wave. I also love to get the balance working, but I've been scratching my head on this one. I figure when it gets fixed, I can post it in the example scripts section. I found a site that lends some info, but I'm still confused as to what to do...http://www.codeproject.com/audio/mixerSetControlDetails.aspexpandcollapse popup#cs Audio.au3 Designed by Gary Frost, RazerM, and a little help from Volly Version info: 1.0.0.0 History: 1.0.0.0 - first release ------------------------------------------- Items to add: 1. Mute for master volume. 2. Mute for input Microphone 3. Mute for Wave 4. Balance on Master, Wave, Microphone ------------------------------------------- The following code is a proposed replacement for sound.au3. Current functions work as expected following testing on XP pc. No test have been performed on other operating systems. ------------------------------------------- Functions: _SoundOpen ( $hFile [, $sAlias ] ) - Opens a sound file for use with other _Sound functions. _SoundClose($sSnd_id) - Closes a sound previously opened with _SoundOpen. _SoundPlay ( $sSnd_id [, $fWait ] ) - Play a sound file. _SoundStop ( $sSnd_id ) - Stop a playing sound. _SoundPause($sSnd_id) - Pause a playing sound. _SoundResume ( $sSnd_id ) - Resume a paused sound. _SoundLength ( $sSnd_id [, $iMode ] ) - Returns the length of the soundfile. _SoundSeek ( $sSnd_id, $iHour, $iMin, $iSec ) - Seeks the sound to the specified position _SoundStatus ( $sSnd_id ) - Returns the status of the sound _SoundPos ( $sSnd_id [, $iMode ] ) - Returns the current position of the sound. _SoundSetMasterVolume($iVolume) - Sets the Master Volume. Does not control an application's volume _SoundGetMasterVolume - Gets the Master Volume level _SoundSetMicrophoneVolume - Sets the Microphone input volume _SoundGetMicrophoneVolume - Gets the Microphone volume level _SoundGetPhoneVolume - Gets the Phone volume on the modem _SoundSetVolumeCD - Sets the Volume level on the CDRom _SoundSetMasterWaveVolume - Sets the Master Wave Volume level #ce #region Const $MMSYSERR_NOERROR = 0 Const $WAVERR_BASE = 32 Const $WAVERR_BADFORMAT = ($WAVERR_BASE + 0) Const $MAXPNAMELEN = 32 Const $MIXERLINE_COMPONENTTYPE_DST_FIRST = 0 Const $MIXER_GETLINEINFOF_COMPONENTTYPE = 3 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 = 0x1000 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) Const $MIXER_GETLINEINFOF_SOURCE = 1 Const $MIXER_GETLINEINFOF_DESTINATION = 0 Const $MIXER_GETLINEINFOF_LINEID = 2 Const $MIXERCONTROL_CT_SC_LIST_SINGLE = 0x00000000 Const $MIXERCONTROL_CT_CLASS_LIST = 0x70000000 Const $MIXERCONTROL_CT_SC_LIST_MULTIPLE = 0x01000000 Const $MIXERCONTROL_CT_UNITS_BOOLEAN = 0x00010000 Const $MIXERCONTROL_CT_CLASS_MASK = 0xF0000000 Const $MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT = BitOR($MIXERCONTROL_CT_CLASS_LIST, $MIXERCONTROL_CT_SC_LIST_MULTIPLE, $MIXERCONTROL_CT_UNITS_BOOLEAN) Const $MIXERCONTROL_CONTROLTYPE_MIXER = ($MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT + 1) Const $MIXERCONTROL_CONTROLTYPE_SINGLESELECT = BitOR($MIXERCONTROL_CT_CLASS_LIST, $MIXERCONTROL_CT_SC_LIST_SINGLE, $MIXERCONTROL_CT_UNITS_BOOLEAN) Const $MIXERCONTROL_CONTROLTYPE_MUX = ($MIXERCONTROL_CONTROLTYPE_SINGLESELECT + 1) Const $MIXER_GETCONTROLDETAILSF_VALUE = 0 Const $MIXER_SETCONTROLDETAILSF_VALUE = 0 Const $MIXERCONTROL_CONTROLF_UNIFORM = 1 Const $MIXERCONTROL_CONTROLF_MULTIPLE = 2 Const $MIXERCONTROL_CT_SC_METER_POLLED = 0 Const $MIXERCONTROL_CT_CLASS_METER = 0x10000000 Const $MIXERCONTROL_CT_UNITS_SIGNED = 0x20000 Const $MIXERCONTROL_CT_UNITS_UNSIGNED = 0x30000 Const $MIXERCONTROL_CT_CLASS_FADER = 0x50000000 Const $MIXERCONTROL_CT_CLASS_NUMBER = 0x30000000 Const $MIXERCONTROL_CONTROLTYPE_FADER = BitOR($MIXERCONTROL_CT_CLASS_FADER, $MIXERCONTROL_CT_UNITS_UNSIGNED) Const $MIXERCONTROL_CONTROLTYPE_VOLUME= ($MIXERCONTROL_CONTROLTYPE_FADER + 1) Const $MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER = BitOR($MIXERCONTROL_CT_CLASS_METER, $MIXERCONTROL_CT_SC_METER_POLLED, $MIXERCONTROL_CT_UNITS_UNSIGNED) Const $MIXERCONTROL_CONTROLTYPE_UNSIGNED = BitOR($MIXERCONTROL_CT_CLASS_NUMBER, $MIXERCONTROL_CT_UNITS_UNSIGNED) Const $MIXERCONTROL_CONTROLTYPE_SIGNED = BitOR($MIXERCONTROL_CT_CLASS_NUMBER, $MIXERCONTROL_CT_UNITS_SIGNED) Const $MIXER_OBJECTF_WAVEIN = 0x20000000 Const $MIXER_SHORT_NAME_CHARS = 16 Const $MIXER_LONG_NAME_CHARS = 64 Const $MIXER_GETLINECONTROLSF_ALL = 0 Const $MIXER_GETLINECONTROLSF_ONEBYID = 1 Const $MIXER_GETLINECONTROLSF_ONEBYTYPE = 2 Const $MIXER_OBJECTF_HANDLE = 0x80000000 Const $MIXER_OBJECTF_MIXER = 0 Const $MIXER_OBJECTF_HMIXER = BitOR($MIXER_OBJECTF_HANDLE, $MIXER_OBJECTF_MIXER) Const $MIXER_GETCONTROLDETAILSF_LISTTEXT = 1 Const $CALLBACK_NULL = 0 Const $WAVE_MAPPED = 4 Const $wMid = 1 Const $wPid = 2 Const $vDriverVersion = 3 Const $szPname = 4 Const $dwFormats = 5 Const $wChannels = 6 Const $wReserved1 = 7 Const $AWICAPS_SIZEOF = $wReserved1 + 1 ;mixer Const $fdwSupport = 5 Const $cDestinations = 6 Const $AMXCAPS_SIZEOF = $cDestinations + 2 ;leave room for num cells ;line struct Const $cbStruct = 1 Const $dwDestination = 2 Const $dwSource = 3 Const $dwLineID = 4 Const $fdwLine = 5 Const $dwUser = 6 Const $dwComponentType = 7 Const $cChannels = 8 Const $cConnections = 9 Const $cControls = 10 Const $szShortName = 11 Const $szName = 12 Const $dwType = 13 Const $dwDeviceID = 14 Const $wMMid = 15 Const $wMPid = 16 Const $vMDriverVersion = 17 Const $szMPname = 18 $AMXLINE_SIZEOF = $szMPname + 2 Const $cbCStruct = 1 Const $dwCLineID = 2 Const $dwControlID = 3 Const $dwControlType = 4 Const $cCControls = 5 Const $cbmxctrl = 6 Const $pamxctrl = 7 Const $MXXTRLS_SIZEOF = $pamxctrl + 2 Const $lst_destname = 1 Const $lst_dwComponentType = 2 Const $lst_ctrid = 3 Const $MIX_HMXOBJ = 1 Const $MIX_DEVNAME = 2 Const $MIX_CAPCDEST = 3 Const $MIX_RECNAME = 4 Const $MIX_CCONNECTIONS = 5 Const $MIX_INCCONTROLS = 6 Const $MIX_DWLINEID = 7 Const $MIX_INCHANNELS = 8 Const $MIX_INMULTIITEMS = 9 Const $MIX_INCTRLID = 10 Const $MIX_OUTCHANNELS = 11 Const $MIX_OUTMULTIEMS = 12 Const $MIX_OUTCTRLID = 13 Const $MIX_LAST = $MIX_OUTCTRLID + 1 Const $AMIX_SIZEOF = $MIX_LAST + 1 Dim $mxline[$AMXLINE_SIZEOF] Dim $mixers[1][$AMIX_SIZEOF] Dim $mxInList[2][4] $mixernames = "" $FormSelectInput = 0 $TV_SelectInput = 0 $CMB_DevName = 0 $CKB_EnableLinefocus = 0 $defaultmixer = 0 $lastlinesrc = -1 $curmixer = $defaultmixer ;=============================================================================== #endregion ;=============================================================================== ; ; Function Name: _SoundOpen ; Description:: Opens a sound file for use with other _Sound functions ; Parameter(s): $hFile - The sound file, $sAlias[optianal] - a name such as sound1, ; if you do not specify one it is randomly generated ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): string(the sound id) - Success, 0 - Failure ; @extended <> 0 - open failed, @error = 2 - File doesn't exist, ; @error = 3 - alias contains whitespace ; Author(s): RazerM ; ;=============================================================================== ; Func _SoundOpen($hFile, $sAlias = "") ;Declare variables Local $sSnd_id, $iCurrentPos, $iRet, $asAlias ;check for file If Not FileExists($hFile) Then Return SetError(2, 0, 0) ;search for whitespace by character $asAlias = StringSplit($sAlias, "") For $iCurrentPos = 1 To $asAlias[0] If StringIsSpace($asAlias[$iCurrentPos]) Then Return SetError(3, 0, 0) Next ;create random alias if one is not supplied If $sAlias = "" Then $sSnd_id = RandomStr(10) Else $sSnd_id = $sAlias EndIf ;open file $iRet = mciSendString("open " & FileGetShortName($hFile) & " alias " & FileGetShortName($sSnd_id)) Return SetError(0, $iRet, $sSnd_id) EndFunc ;==>_SoundOpen ;=============================================================================== ; ; Function Name: _SoundClose ; Description:: Closes a sound ; Parameter(s): $sSnd_id - Sound ID returned by _SoundOpen ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): 1 - Success, 0 and @error = 1 - Failure ; Author(s): RazerM ; ;=============================================================================== ; Func _SoundClose($sSnd_id) If mciSendString("close " & FileGetShortName($sSnd_id)) = 0 Then Return 1 Else Return SetError(1, 0, 0) EndIf EndFunc ;==>_SoundClose ;=============================================================================== ; ; Function Name: _SoundPlay ; Description:: Plays a sound from the current position (beginning is the default) ; Parameter(s): $sSnd_id - Sound ID returned by _SoundOpen or sound file ; $fWait - If set to 1 the script will wait for the sound to finish before continuing ; - If set to 0 the script will continue while the sound is playing ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): 1 - Success, 0 - Failure ; @error = 2 - $fWait is invalid, @error = 1 - play failed ; Author(s): RazerM ; ;=============================================================================== ; Func _SoundPlay($sSnd_id, $fWait = 0) ;Declare variables Local $iRet ;validate $fWait If $fWait <> 0 And $fWait <> 1 Then Return SetError(2, 0, 0) ;if sound has finished, seek to start If _SoundPos($sSnd_id, 2) = _SoundLength($sSnd_id, 2) Then mciSendString("seek " & FileGetShortName($sSnd_id) & " to start") ;If $fWait = 1 then pass wait to mci If $fWait = 1 Then $iRet = mciSendString("play " & FileGetShortName($sSnd_id) & " wait") Else $iRet = mciSendString("play " & FileGetShortName($sSnd_id)) EndIf ;return If $iRet = 0 Then Return 1 Else Return SetError(1, 0, 0) EndIf EndFunc ;==>_SoundPlay ;=============================================================================== ; ; Function Name: _SoundStop ; Description:: Stops the sound ; Parameter(s): $sSnd_id - Sound ID returned by _SoundOpen or sound file ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): 1 - Success, 0 and @error = 1 - Failure, ; Author(s): RazerM ; ;=============================================================================== ; Func _SoundStop($sSnd_id) ;Declare variables Local $iRet, $iRet2 ;seek to start $iRet = mciSendString("seek " & FileGetShortName($sSnd_id) & " to start") ;stop $iRet2 = mciSendString("stop " & FileGetShortName($sSnd_id)) ;return If $iRet = 0 And $iRet2 = 0 Then Return 1 Else Return SetError(1, 0, 0) EndIf EndFunc ;==>_SoundStop ;=============================================================================== ; ; Function Name: _SoundPause ; Description:: Pauses the sound ; Parameter(s): $sSnd_id - Sound ID returned by _SoundOpen or sound file ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): 1 - Success, 0 and @error = 1 - Failure, ; Author(s): RazerM ; ;=============================================================================== ; Func _SoundPause($sSnd_id) ;Declare variables Local $iRet ;pause sound $iRet = mciSendString("pause " & FileGetShortName($sSnd_id)) ;return If $iRet = 0 Then Return 1 Else Return SetError(1, 0, 0) EndIf EndFunc ;==>_SoundPause ;=============================================================================== ; ; Function Name: _SoundResume ; Description:: Resumes the sound after being paused ; Parameter(s): $sSnd_id - Sound ID returned by _SoundOpen or sound file ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): 1 - Success, 0 and @error = 1 - Failure, ; Author(s): RazerM ; ;=============================================================================== ; Func _SoundResume($sSnd_id) ;Declare variables Local $iRet ;resume sound $iRet = mciSendString("resume " & FileGetShortName($sSnd_id)) ;return If $iRet = 0 Then Return 1 Else Return SetError(1, 0, 0) EndIf EndFunc ;==>_SoundResume ;=============================================================================== ; ; Function Name: _SoundLength ; Description:: Returns the length of the sound in the format hh:mm:ss ; Parameter(s): $sSnd_id - Sound ID returned by _SoundOpen or sound file, ; $iMode = 1 - hh:mm:ss, $iMode = 2 - milliseconds ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): Length of the sound - Success, 0 and @error = 1 - $iMode is invalid ; Author(s): RazerM ; ;=============================================================================== ; Func _SoundLength($sSnd_id, $iMode = 1) ;Declare variables Local $iSnd_len_ms, $iSnd_len_min, $iSnd_len_hour, $iSnd_len_sec, $sSnd_len_format ;validate $iMode If $iMode <> 1 And $iMode <> 2 Then Return SetError(1, 0, 0) ;tell mci to use time in milliseconds mciSendString("set " & FileGetShortName($sSnd_id) & " time format miliseconds") ;recieve length of sound $iSnd_len_ms = mciSendString("status " & FileGetShortName($sSnd_id) & " length") ;assign modified data to variables $iSnd_len_min = Int($iSnd_len_ms / 60000) $iSnd_len_hour = Int($iSnd_len_min / 60) $iSnd_len_sec = Int(Int($iSnd_len_ms / 1000) - ($iSnd_len_min * 60)) ;assign formatted data to $sSnd_len_format $sSnd_len_format = StringFormat("%02i:%02i:%02i", $iSnd_len_hour, $iSnd_len_min, $iSnd_len_sec) ;return correct variable If $iMode = 1 Then Return $sSnd_len_format If $iMode = 2 Then Return $iSnd_len_ms EndFunc ;==>_SoundLength ;=============================================================================== ; ; Function Name: _SoundSeek ; Description:: Seeks the sound to a specified time ; Parameter(s): $sSnd_id - Sound ID returned by _SoundOpen (must NOT be a file), $iHour, $iMin, $iSec ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): 1 - Success, 0 and @error = 1 - Failure, ; Author(s): RazerM ; ;=============================================================================== ; Func _SoundSeek($sSnd_id, $iHour, $iMin, $iSec) ;Declare variables Local $iMs = 0 Local $iRet ;prepare mci to recieve time in milliseconds mciSendString("set " & FileGetShortName($sSnd_id) & " time format miliseconds") ;modify the $iHour, $iMin and $iSec parameters to be in milliseconds ;and add to $iMs $iMs += $iSec * 1000 $iMs += $iMin * 60 * 1000 $iMs += $iHour * 60 * 60 * 1000 ; seek sound to time ($iMs) $iRet = mciSendString("seek " & FileGetShortName($sSnd_id) & " to " & $iMs) ;return If $iRet = 0 Then Return 1 Else Return SetError(1, 0, 0) EndIf EndFunc ;==>_SoundSeek ;=============================================================================== ; ; Function Name: _SoundStatus ; Description:: All devices can return the "not ready", "paused", "playing", and "stopped" values. ; Some devices can return the additional "open", "parked", "recording", and "seeking" values.(MSDN) ; Parameter(s): $sSnd_id - Sound ID returned by _SoundOpen or sound file ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): Sound Status ; Author(s): RazerM ; ;=============================================================================== ; Func _SoundStatus($sSnd_id) ;return status Return mciSendString("status " & FileGetShortName($sSnd_id) & " mode") EndFunc ;==>_SoundStatus ;=============================================================================== ; ; Function Name: _SoundPos ; Description:: Returns the current position of the song ; Parameter(s): $sSnd_id - Sound ID returned by _SoundOpen or sound file, ; $iMode = 1 - hh:mm:ss, $iMode = 2 - milliseconds ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): Current Position - Success, @error = 1 - $iMode is invalid ; Author(s): RazerM ; ;=============================================================================== ; Func _SoundPos($sSnd_id, $iMode = 1) ;Declare variables Local $iSnd_pos_ms, $iSnd_pos_min, $iSnd_pos_hour, $iSnd_pos_sec, $sSnd_pos_format ;validate $iMode If $iMode <> 1 And $iMode <> 2 Then Return SetError(1, 0, 0) ;tell mci to use time in milliseconds mciSendString("set " & FileGetShortName($sSnd_id) & " time format miliseconds") ;receive position of sound $iSnd_pos_ms = mciSendString("status " & FileGetShortName($sSnd_id) & " position") ;modify data and assign to variables $iSnd_pos_min = Int($iSnd_pos_ms / 60000) $iSnd_pos_hour = Int($iSnd_pos_min / 60) $iSnd_pos_sec = Int(Int($iSnd_pos_ms / 1000) - ($iSnd_pos_min * 60)) ;assign formatted data to $sSnd_pos_format $sSnd_pos_format = StringFormat("%02i:%02i:%02i", $iSnd_pos_hour, $iSnd_pos_min, $iSnd_pos_sec) ;return correct variable If $iMode = 1 Then Return $sSnd_pos_format If $iMode = 2 Then Return $iSnd_pos_ms EndFunc ;==>_SoundPos ;=============================================================================== ; ; Function Name: _SoundSetMasterVolume ; Description:: Sets the Master Volume. Does not control an application's volume ; Parameter(s): $$iVolume - % to set ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): 1 - Success, 0 - Failure ; Author(s): Volly ; Example: _SoundSetMasterVolume(100) ; ;=============================================================================== ; func _SoundSetMasterVolume($iVolume) _SetMixerVolume($MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, $iVolume) If @error Then SetExtended(0) Return(@extended) else SetExtended(1) Return(@extended) endif EndFunc ;=============================================================================== ; ; Function Name: _SoundGetMasterVolume ; Description:: Gets the Master Volume level ; Parameter(s): none ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): 1 to 100 - Success, -1 - Failure ; Author(s): Volly ; Example: _SoundGetMasterVolume() ; ;=============================================================================== ; func _SoundGetMasterVolume() $percent = _GetMixerVolume($MIXERLINE_COMPONENTTYPE_DST_SPEAKERS) If @error Then SetExtended(-1) Return(@extended) else SetExtended($percent) Return(@extended) endif EndFunc ;=============================================================================== ; ; Function Name: _SoundSetMicrophoneVolume ; Description:: Sets the Microphone input volume ; Parameter(s): $iVolume - % to set ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): 1 - Success, 0 and @error = 1 - Failure ; Author(s): Volly ; Example: _SoundSetMicrophoneVolume(50) ; ;=============================================================================== ; func _SoundSetMicrophoneVolume($iVolume) _SetMixerVolume($MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, $iVolume) If @error Then Exit else SetExtended(1) Return(@extended) endif EndFunc ;=============================================================================== ; ; Function Name: _SoundGetMicrophoneVolume ; Description:: Gets the Microphone volume level ; Parameter(s): none ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): 1 to 100 - Success, -1 - Failure ; Author(s): Volly ; Example: _SoundGetMicrophoneVolume() ; ;=============================================================================== ; func _SoundGetMicrophoneVolume() $percent = _GetMixerVolume($MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE) If @error Then SetExtended(-1) Return(@extended) else SetExtended($percent) Return(@extended) endif EndFunc ;=============================================================================== ; ; Function Name: _SoundGetPhoneVolume ; Description:: Gets the Phone volume on the modem ; Parameter(s): none ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): 1 to 100 - Success, -1 - Failure ; Author(s): Volly ; Example: _SoundGetPhoneVolume() ; Notes: Some modems may not report volume levels. You will need to test. ; ;=============================================================================== ; func _SoundGetPhoneVolume() $percent = _GetMixerVolume($MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE) If @error Then SetExtended(-10) Return(@extended) else SetExtended($percent) Return(@extended) endif EndFunc ;=============================================================================== ; ; Function Name: _SoundSetVolumeCD ; Description:: Sets the Volume level on the CDRom ; Parameter(s): $iVolume - % to set ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): 1 to 100 - Success, -1 - Failure ; Author(s): Volly ; Example: _SoundSetVolumeCD(45) ; ;=============================================================================== func _SoundSetVolumeCD($iVolume) _SetMixerVolume($MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC, $iVolume) If @error Then Exit else SetExtended(1) Return(@extended) endif EndFunc ;=============================================================================== ; ; Function Name: _SoundSetMasterWaveVolume ; Description:: Sets the Master Wave Volume level. ; Parameter(s): $iVolume - % to set ; Requirement(s): AutoIt 3.2 ++ ; Return Value(s): 1 to 100 - Success, -1 - Failure ; Author(s): Volly ; Example: _SoundSetMasterWaveVolume(60) ; ;=============================================================================== func _SoundSetMasterWaveVolume($iVolume) _SetMixerVolume($MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT, $iVolume) If @error Then Exit else SetExtended(1) Return(@extended) endif EndFunc ;=============================================================================== ; ; Internal Functions ; ;=============================================================================== Func mciSendString($string) Local $iRet $iRet = DllCall("winmm.dll", "int", "mciSendStringA", "str", $string, "str", "", "int", 65534, "hwnd", 0) If Not @error Then Return $iRet[2] EndFunc ;==>mciSendString Func RandomStr($len) Local $string For $iCurrentPos = 1 To $len $string &= Chr(Random(97, 122, 1)) Next Return $string EndFunc ;==>RandomStr Func _SetVolume(ByRef $mixers, ByRef $curmixer, ByRef $percent) $x = Mod($percent * 0xffff, 100) $percent = BitAND($percent * 0xffff / 100, 0xffff) $percent = $percent + $x GetSetOutVolume($mixers, $curmixer, $percent) EndFunc ;==>_SetVolume Func _SetMixerVolume($MixerDevice, $percent) ;default mixer is always 0 (so far) which is last audio device installed or prefered deviced selected by user SetExtended(10) $curmixer = 0 Const $MM_MIXM_CONTROL_CHANGE = 0x3D1 Const $CALLBACK_WINDOW = 0x10000 OpenAllMixers($mixers) If @error Then Exit $hmxobj = MixerOpen($curmixer, 0, $MM_MIXM_CONTROL_CHANGE, BitOR($CALLBACK_WINDOW, $MIXER_OBJECTF_MIXER)) GetMXWaveoutID($mixers, $curmixer, $MixerDevice) _SetVolume($mixers, $curmixer, $percent) MixerClose($hmxobj) CloseAllMixers($mixers) SetExtended(1) Return(@extended) EndFunc ;==>_SetMixerVolume Func _GetMixerVolume($MixerDevice) ;default mixer is always 0 (so far) which is last audio device installed or prefered deviced selected by user $curmixer = 0 Const $MM_MIXM_CONTROL_CHANGE = 0x3D1 Const $CALLBACK_WINDOW = 0x10000 OpenAllMixers($mixers) If @error Then Exit $hmxobj = MixerOpen($curmixer, 0, $MM_MIXM_CONTROL_CHANGE, BitOR($CALLBACK_WINDOW, $MIXER_OBJECTF_MIXER)) GetMXWaveoutID($mixers, $curmixer, $MixerDevice) $savevolume = GetSetOutVolume($mixers, $curmixer, 0, 0) $savevolume = BitAND($savevolume / 0xFFFF * 100, 0xffff) MixerClose($hmxobj) CloseAllMixers($mixers) Return $savevolume EndFunc ;==>_GetMixerVolume Func _SetVolume(ByRef $mixers, ByRef $curmixer, ByRef $percent) $x = Mod($percent * 0xffff, 100) $percent = BitAND($percent * 0xffff / 100, 0xffff) $percent = $percent + $x GetSetOutVolume($mixers, $curmixer, $percent) ;this will also trigger callback routine EndFunc ;==>_SetVolume Func GetSetOutVolume($mixers, $index, $vol = 0, $doset = 1) Local $i, $x, $arraysize, $channels, $mtiems Const $MIXERCONTROLDETAILS_UNSIGNED_SIZEOF = 4 Local $mixercontroldetails = DllStructCreate( _ "dword;" & _ ;DWORD cbStruct "dword;" & _ ;DWORD dwControlID "dword;" & _ ;DWORD cChannels; "dword;" & _ ;HWND hwndOwner DWORD cMultipleItems; "dword;" & _ ;DWORD cbDetails; "dword") ;LPVOID paDetails; If @error Then Return False $mitems = $mixers[$index][$MIX_OUTMULTIEMS] $channels = $mixers[$index][$MIX_OUTCHANNELS] $arraysize = $channels If $mitems Then $arraysize = $channels * $mitems Local $plistbool = DllStructCreate("dword[" & $arraysize + 1 & "]") ;give me one mroe than needed If @error Then Return False $hmxobj = $mixers[$index][$MIX_HMXOBJ] $mxcd = $mixercontroldetails DllStructSetData($mxcd, $cbStruct, DllStructGetSize($mxcd)) DllStructSetData($mxcd, 2, $mixers[$index][$MIX_OUTCTRLID]) DllStructSetData($mxcd, 3, $mixers[$index][$MIX_OUTCHANNELS]) DllStructSetData($mxcd, 4, $mixers[$index][$MIX_OUTMULTIEMS]) DllStructSetData($mxcd, 5, $MIXERCONTROLDETAILS_UNSIGNED_SIZEOF) ;cbDetails to sizeof one unsigned struct DllStructSetData($mxcd, 6, DllStructGetPtr($plistbool)) ;paDetails set ptr $ret = DllCall("winmm.dll", "long", "mixerGetControlDetails", "hwnd", $hmxobj, "ptr", DllStructGetPtr($mxcd), "long", BitOR($MIXER_OBJECTF_HMIXER, $MIXER_GETCONTROLDETAILSF_VALUE)) If @error Then Return False If $ret[0] = $MMSYSERR_NOERROR Then $x = DllStructGetData($plistbool, 1, 1) ;just return right channel For $i = 1 To $arraysize DllStructSetData($plistbool, 1, $vol, $i) ;set left right to same value Next ;i If $doset Then $ret = DllCall("winmm.dll", "long", "mixerSetControlDetails", "hwnd", $hmxobj, "ptr", DllStructGetPtr($mxcd), "long", BitOR($MIXER_OBJECTF_HMIXER, $MIXER_SETCONTROLDETAILSF_VALUE)) Return $x EndIf Return False EndFunc ;==>GetSetOutVolume Func GetMXWaveoutID(ByRef $mixers, $index, $linetype) Local $mitems, $chans, $hmxobj, $x, $ret, $lineid ;local structures are nuked on exit...so i have read..LOL Local $mixercontrol = DllStructCreate( _ "dword;" & _ ; DWORD cbStruct; "dword;" & _ ; DWORD dwControlID; "dword;" & _ ; DWORD dwControlType; "dword;" & _ ; DWORD fdwControl; "dword;" & _ ; DWORD cMultipleItems; "char[16];" & _ ;szShortName[MIXER_SHORT_NAME_CHARS]; "char[64];" & _ ;szName[MIXER_LONG_NAME_CHARS]; "dword;" & _ ;lMinimum "dword;" & _ ;lMaximum "dword[4];" & _ ;dwReserved[4]; "dword;" & _ ;cSteps "dword[5]") ; DWORD dwReserved[6]; If @error Then Return False Local $mixerlinecontrols = DllStructCreate( _ "dword;" & _ ; cbStruct; "dword;" & _ ; DWORD dwLineID; "dword;" & _ ; DWORD dwControlID DWORD dwControlType; "dword;" & _ ; DWORD cControls; "dword;" & _ ; DWORD cbmxctrl; "ptr") ; LPMIXERCONTROL pamxctrl; If @error Then Return False $hmxobj = $mixers[$index][$MIX_HMXOBJ] zeroline($mxline) $mxline[$dwLineID] = BitOR($index, 0xFFFF0000) $mxline[$dwComponentType] = $linetype MixerGetLineInfo($hmxobj, $mxline, $MIXER_GETLINEINFOF_COMPONENTTYPE) $lineid = $mxline[$dwLineID] DllStructSetData($mixerlinecontrols, $cbStruct, DllStructGetSize($mixerlinecontrols)) DllStructSetData($mixerlinecontrols, 2, $lineid) DllStructSetData($mixerlinecontrols, 3, $MIXERCONTROL_CONTROLTYPE_VOLUME) DllStructSetData($mixerlinecontrols, 4, 1) DllStructSetData($mixerlinecontrols, 5, DllStructGetSize($mixercontrol)) DllStructSetData($mixerlinecontrols, 6, DllStructGetPtr($mixercontrol)) $ret = DllCall("winmm.dll", "long", "mixerGetLineControls", "hwnd", $hmxobj, "ptr", DllStructGetPtr($mixerlinecontrols), "long", BitOR($MIXER_OBJECTF_HMIXER, $MIXER_GETLINECONTROLSF_ONEBYTYPE)) If $ret[0] <> $MMSYSERR_NOERROR Then Return False $chans = $mxline[$cChannels] $x = DllStructGetData($mixercontrol, 4) ;fwControl If BitAND($x, $MIXERCONTROL_CONTROLF_UNIFORM) Then $chans = 1 $mitems = 0 If BitAND($x, $MIXERCONTROL_CONTROLF_MULTIPLE) Then $mitems = DllStructGetData($mixercontrol, 5) $x = DllStructGetData($mixercontrol, 3) ;fwControl If BitAND($x, $MIXERCONTROL_CT_CLASS_FADER) Then $mixers[$index][$MIX_OUTCHANNELS] = $chans $mixers[$index][$MIX_OUTMULTIEMS] = $mitems $mixers[$index][$MIX_OUTCTRLID] = DllStructGetData($mixercontrol, 2) Return True EndIf Return False EndFunc ;==>GetMXWaveoutID Func zeroline(ByRef $line) Local $i For $i = 0 To UBound($line) - 1 $line[$i] = 0 Next ;i EndFunc ;==>zeroline Func MixerGetLineInfo($hmxobj, ByRef $line, $flag) Local $mixerline = DllStructCreate("dword;dword;dword;dword;dword;dword;dword;dword;dword;dword;char[16];char[64];dword;dword;short;short;dword;char[32]") If @error Then SetError(1) Return False EndIf Local $i For $i = 1 To UBound($line) - 1 DllStructSetData($mixerline, $i, $line[$i]) Next ;i DllStructSetData($mixerline, $cbStruct, DllStructGetSize($mixerline)) $ret = DllCall("winmm.dll", "long", "mixerGetLineInfo", "hwnd", $hmxobj, "ptr", DllStructGetPtr($mixerline), "int", $flag) If @error Then SetError(1) Return False EndIf For $i = 1 To $szMPname $line[$i] = DllStructGetData($mixerline, $i) Next ;i If $ret[0] = $MMSYSERR_NOERROR Then Return True SetError(1) Return False EndFunc ;==>MixerGetLineInfo ;On Exit: MIX_HMXOBJ set to return value from mixeropn...check for @error Func OpenAllMixers(ByRef $mixers) Local $i, $mxnumdevs, $hmxobj $mxnumdevs = mixerGetNumDevs() If $mxnumdevs Then ReDim $mixers[$mxnumdevs + 1][$AMIX_SIZEOF] For $i = 0 To $mxnumdevs - 1 $hmxobj = MixerOpen($i, 0, 0, $MIXER_OBJECTF_MIXER) If @error Then SetError(1) Return False EndIf $mixers[$i][$MIX_HMXOBJ] = $hmxobj Next ;i EndIf $mixers[0][0] = $mxnumdevs EndFunc ;==>OpenAllMixers ;On ENtry: mixer id and flag(s) , if no id passed then the preffered id is used (0) ditto for flag ;on exit: mixer handle Func MixerOpen($uMxid = 0, $hwnd = 0, $instance = 0, $fdwOpen = 0) Local $x, $h_struct $h_struct = DllStructCreate("udword") ;since a local will be deleted on exit of function If @error Then SetError(1) Return False EndIf $ret = DllCall("winmm.dll", "long", "mixerOpen", "ptr", DllStructGetPtr($h_struct), "int", $uMxid, "int", $hwnd, "int", $instance, "int", $fdwOpen) If Not @error Then If $ret[0] <> $MMSYSERR_NOERROR Then Return -1 $x = DllStructGetData($h_struct, 1) Return $x EndIf SetError(1) Return False EndFunc ;==>MixerOpen Func CloseAllMixers($mixers) Local $i, $cnt $cnt = $mixers[0][0] For $i = 0 To $cnt - 1 MixerClose($mixers[$i][$MIX_HMXOBJ]) Next ;i EndFunc ;==>CloseAllMixers ;On Entry: mixer handle Func MixerClose($hmxobj) $ret = DllCall("winmm.dll", "long", "mixerClose", "long", $hmxobj) If Not @error Then Return True Return False EndFunc ;==>MixerClose Func mixerGetNumDevs() $ret = DllCall("winmm.dll", "long", "mixerGetNumDevs") If Not @error Then Return $ret[0] SetError(1) Return False EndFunc ;==>mixerGetNumDevs The Vollatran project My blog: http://www.vollysinterestingshit.com/ Link to comment Share on other sites More sharing options...
Bert Posted September 26, 2007 Author Share Posted September 26, 2007 bump The Vollatran project My blog: http://www.vollysinterestingshit.com/ Link to comment Share on other sites More sharing options...
Bert Posted September 26, 2007 Author Share Posted September 26, 2007 I'm going to post this in example scripts and if someone wants to expand on what I have done, please do! The Vollatran project My blog: http://www.vollysinterestingshit.com/ Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now