Jump to content
Sign in to follow this  
Bert

Audio.au3

Recommended Posts

I've been looking for something like this for a while, glad i found it.

I'm using:

_SoundSetMasterVolume("100")
_SoundSetMicrophoneVolume("100")
_SoundSetMasterWaveVolume("100")

masterwave and master volume work like they should, but microphonevolume does now work like it should.

Ive tested it on a few xp machines and have been unable to get it working correctly.

Share this post


Link to post
Share on other sites

Yo Volly, you know I've been looking all over for a way of generating a sound... I've found lots of information for how to acomplish this using some functions in winmm.dll, but my lack of knowledge didn't even let me get started. Do you think it's possible?

The closest to this is to use your sound card MIDI sounds, heres the link http://www.autoitscript.com/forum/index.ph...072&hl=midi

2015 - Still no flying cars, instead blankets with sleeves.

Share this post


Link to post
Share on other sites

I am using this UDF, and I noticed that there were some notes about missing functions. I did several, but I don't know the process for submitting something to a UDF? The functionality I added to Audio.au3 is:

_unMuteAllInputs()

_muteAllInputs()

_unMuteAllOutputs()

_muteAllOutputs()

getInputMixerHandle()

getOutputMixerHandle()

_getAllInputChannelNames()

_getAllOutputChannelNames

_muteInputChannel($channelName)

_muteOutputChannel($channelName)

_unMuteInputChannel($channelName)

_unMuteOutputChannel($channelName)

In a nutshell, it adds the ability to get the names of all the input or output mixer channel names, and to mute or unmute them each. Volly, if this is something you would be interested in, let me know. I don't mind posting it, but I can't say it has all the proper UDF comments on it, and if there is a method to adding these kinds of things I want to make sure I follow it.

Share this post


Link to post
Share on other sites

I reviewed the code, and he is using access to to master volume GUI to access stuff. You can do this, but I do not recommend that approach to control sound. In Audio.au3, _Ismute does this also, but I left it in. : ;)

asbeer450's method to control sound may address this issue in a better way. Try both and see what works for you!

As of this point, there will be no update for Vista. Vista controls sound using a different method. I do not have access to a Vista PC.

Edited by Volly

Share this post


Link to post
Share on other sites

As of this point, there will be no update for Vista. Vista controls sound using a different method. I do not have access to a Vista PC.

No matter. I won't support Vista anyway. My thinking = if it works on Vista then well and good, if not then "sorry to hear that".

George

Question about decompiling code? Read the decompiling FAQ and don't bother posting the question in the forums.

Be sure to read and follow the forum rules. -AKA the AutoIt Reading and Comprehension Skills test.***

The PCRE (Regular Expression) ToolKit for AutoIT - (Updated Oct 20, 2011 ver:3.0.1.13) - Please update your current version before filing any bug reports. The installer now includes both 32 and 64 bit versions. No change in version number.

Visit my Blog .. currently not active but it will soon be resplendent with news and views. Also please remove any links you may have to my website. it is soon to be closed and replaced with something else.

"Old age and treachery will always overcome youth and skill!"

Share this post


Link to post
Share on other sites

There is a pseudo Vista workaround for these functions. If you set the compiled script to Windows XP compatibility mode, then the master volume functions will control Vista's master volume. The master wave volume controls still do nothing (as far as I can remember) since they do not exist at all in Vista anymore.

Share this post


Link to post
Share on other sites

Hi Volly,

by using Xenobiologist's _isMute(), i've made function _ToggleMuteMaster().

I hope it's useful. :P

Func _ToggleMuteMaster($opt = 1000)
    Local $retVal = 0, $ex = False
    If Not WinExists('[CLASS:Volume Control]') Then
        Run('sndvol32', '', @SW_HIDE)
        $ex = True
    EndIf
    If WinWait('[CLASS:Volume Control]', '', 2) = 0 Then Return -1
    $retVal = ControlCommand('[CLASS:Volume Control]', '', $opt, 'isChecked')
    If @error Then Return -2
    If $retVal Then
    ControlCommand('[CLASS:Volume Control]', '', $opt, 'UnCheck')
    If @error Then Return -2
    Else
        ControlCommand('[CLASS:Volume Control]', '', $opt, 'Check')
        If @error Then Return -2
    EndIf
    If $ex = True Then WinClose('[CLASS:Volume Control]')
    Return
EndFunc  ;==>_ToggleMuteMasteroÝ÷ Ù±!?Û:¸­)äÝý±·­µêö~éܱú+ë^jwnk­y«­¢+ÙÕ¹}5ÕÑY½° ÀÌØí½ÁÐôÄÀÀÀ¤(1½°ÀÌØíÉÑY°ôÀ°ÀÌØíàô±Í(%9½Ð]¥¹á¥ÍÑÌ Ìäím
1MLéY½±Õµ
½¹Ñɽ±tÌäì¤Q¡¸(IÕ¸ Ìäí͹ٽ°ÌÈÌäì°ÌäìÌäì°M]}!%¤(ÀÌØíàôQÉÕ(¹%(%]¥¹]¥Ð Ìäím
1MLéY½±Õµ
½¹Ñɽ±tÌäì°ÌäìÌäì°È¤ôÀQ¡¸IÑÕɸ´Ä(ÀÌØíÉÑY°ô
½¹Ñɽ±
½µµ¹ Ìäím
1MLéY½±Õµ
½¹Ñɽ±tÌäì°ÌäìÌäì°ÀÌØí½ÁаÌäí¥Í
¡­Ìäì¤(%ÉɽÈQ¡¸IÑÕɸ´È(%%9½ÐÀÌØíÉÑY°Q¡¸($%
½¹Ñɽ±
½µµ¹ Ìäím
1MLéY½±Õµ
½¹Ñɽ±tÌäì°ÌäìÌäì°ÀÌØí½ÁаÌäí
¡¬Ìäì¤($%%ÉɽÈQ¡¸IÑÕɸ´È(%¹%(%ÀÌØíàôQÉÕQ¡¸]¥¹
±½Í Ìäím
1MLéY½±Õµ
½¹Ñɽ±tÌäì¤(IÑÕɸ)¹Õ¹ìôôÐí}5ÕÑY½°()Õ¹}5ÕÑY½° ÀÌØí½ÁÐôÄÀÀÀ¤(1½°ÀÌØíÉÑY°ôÀ°ÀÌØíàô±Í(%9½Ð]¥¹á¥ÍÑÌ Ìäím
1MLéY½±Õµ
½¹Ñɽ±tÌäì¤Q¡¸(IÕ¸ Ìäí͹ٽ°ÌÈÌäì°ÌäìÌäì°M]}!%¤(ÀÌØíàôQÉÕ(¹%(%]¥¹]¥Ð Ìäím
1MLéY½±Õµ
½¹Ñɽ±tÌäì°ÌäìÌäì°È¤ôÀQ¡¸IÑÕɸ´Ä(ÀÌØíÉÑY°ô
½¹Ñɽ±
½µµ¹ Ìäím
1MLéY½±Õµ
½¹Ñɽ±tÌäì°ÌäìÌäì°ÀÌØí½ÁаÌäí¥Í
¡­Ìäì¤(%ÉɽÈQ¡¸IÑÕɸ´È(%%ÀÌØíÉÑY°Q¡¸($%
½¹Ñɽ±
½µµ¹ Ìäím
1MLéY½±Õµ
½¹Ñɽ±tÌäì°ÌäìÌäì°ÀÌØí½ÁаÌäíU¹
¡¬Ìäì¤($%%ÉɽÈQ¡¸IÑÕɸ´È(%¹%(%ÀÌØíàôQÉÕQ¡¸]¥¹
±½Í Ìäím
1MLéY½±Õµ
½¹Ñɽ±tÌäì¤(IÑÕɸ)¹Õ¹ìôôÐí}5ÕÑY½
Edited by BugFix

Best Regards BugFix  

Share this post


Link to post
Share on other sites

Hi Volly,

thank you for great sound code for AutoIt.

I've made it MustDeclareVars compliant and also added SoundGetMasterWaveVolume function.

#cs
Audio.au3
Designed by Gary Frost, RazerM, Xenobiologist, and a little help from Volly
Version info: 1.0.0.2
History:
1.0.0.1 - Ismute function added - thanks Xenobiologist
1.0.0.2 - SoundGetMasterWaveVolume added
       -  Opt("MustDeclareVars", 1) compliant

-------------------------------------------
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
_SoundGetMasterWaveVolume                     - Gets the Master Wave Volume level
_Ismute                                       - Checks for mute sound
#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 _SoundGetMasterWaveVolume()
    Local $percent
    $percent = _GetMixerVolume($MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT)
    If @error Then 
        SetExtended(-1)
        Return(@extended)
    else    
        SetExtended($percent)
        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()
    Local $percent
    $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 _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)
    Local $savevolume
    ;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)
    Local $x
    $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
    Local $ret
    Local $mitems, $mxcd
    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 $ret
    ;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]")
    Local $ret
    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,$ret
    $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)
    Local $ret
    $ret = DllCall("winmm.dll", "long", "mixerClose", "long", $hmxobj)
    If Not @error Then Return True
    Return False
EndFunc   ;==>MixerClose

Func mixerGetNumDevs()
    Local $ret
    $ret = DllCall("winmm.dll", "long", "mixerGetNumDevs")
    If Not @error Then Return $ret[0]
    SetError(1)
    Return False
EndFunc   ;==>mixerGetNumDevs

;~ $re = _isMute(1000)
;~ If @error Then ConsoleWrite(@error & @CRLF)
;~ ConsoleWrite($re & @CRLF)
;===============================================================================
;
; Function Name:  _isMute
; Description::   Check for mute sound
; Parameter(s):   ControlID
;    Voulme            = 1000
;    Wave             = 2000
;    SW-Synthesizer     = 3000
;    CD-Player         = 4000
;    Mikrofon         = 5000
;    Line-In         = 6000
; Requirement(s):  ---
; Return Value(s): 0 = not muted, 1 = muted, -1 = timeout, -2 = ControlID not found
; Author(s):       Thorsten Meger (Xenobiologist)
;
;===============================================================================

Func _isMute($opt = 1000)
    Local $retVal = 0, $ex = False
    If Not WinExists('[CLASS:Volume Control]') Then
        Run('sndvol32', '', @SW_HIDE)
        $ex = True
    EndIf
    If WinWait('[CLASS:Volume Control]', '', 2) = 0 Then Return -1
    $retVal = ControlCommand('[CLASS:Volume Control]', '', $opt, 'isChecked')
    If @error Then Return -2
    If $ex = True Then WinClose('[CLASS:Volume Control]')
    Return $retVal
EndFunc  ;==>_isMute

Share this post


Link to post
Share on other sites

Can it possibly change the "microphone boost" option?

BugFix could you please try it? ^_^

Edited by LoWang

Share this post


Link to post
Share on other sites

OK so here it is, but I am a newbie ^_^

Func _switchonmicboost()
    Local $retVal = 0, $ex = False
    If Not WinExists('[CLASS:Volume Control]') Then
        Run('sndvol32', '', @SW_HIDE)
        $ex = True
    EndIf
    If WinWait('[CLASS:Volume Control]', '', 2) = 0 Then Return -1
    controlclick('[CLASS:Volume Control]',"","Button9")
     winwait("Advanced Controls for Microphone","")
    controlcommand("Advanced Controls for Microphone","","Button3","Check")
    winclose("Advanced Controls for Microphone","")
    winclose('[CLASS:Volume Control]', '')
endfunc

Also the second window (with mic boost checkbox) is visible and I don't know if it can be made invisible...

Edited by LoWang

Share this post


Link to post
Share on other sites

After upgrading to 3.3.1.3 the script crashes for me when running "_SoundSetMasterVolume("100")"

No errors are outputted, the scripts just crashes.

Share this post


Link to post
Share on other sites

After upgrading to 3.3.1.3 the script crashes for me when running "_SoundSetMasterVolume("100")"

No errors are outputted, the scripts just crashes.

Changing DllStructCreate in MixerOpen fixed it for me.

Func MixerOpen($uMxid = 0, $hwnd = 0, $instance = 0, $fdwOpen = 0)
    Local $x, $h_struct
    $h_struct = DllStructCreate("dword") ; fix for 3.3.1.3 beta 
    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

Share this post


Link to post
Share on other sites

Hi, im from Germany,

please can anyone help me how to control and read the volume (the green bar in the windows mixer) from an specific application (not master volume) in win vista / win7?

i hope you understand me, any help to this would be great, thanks ;)

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...