Audio.au3, un UDF simile a sound.au3

« Older   Newer »
  Share  
MHack
icon1  CAT_IMG Posted on 12/1/2010, 21:51     +1   -1




Ecco qui Audio.au3 presa direttamente dal forum di autoit,e anche da pimp,il music player di iren.

SPOILER (click to view)
CODICE
#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 _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
 
Top
xdmisterx
CAT_IMG Posted on 13/1/2010, 09:11     +1   -1




l'ho usata tempo fa e devo dire che funziona bene :)
 
Top
»Master
CAT_IMG Posted on 21/7/2011, 22:39     +1   -1




UP.
 
Top
2 replies since 12/1/2010, 21:51   904 views
  Share