Mmmmmm...para eso seguramente deberías mirar la api que maneja el mezclador de sonido. Sería buscar funciones que traten el tema mixer (mixer=mezclador).
Si no te aclaras con esas apis me he entretenido en hacer una funciones que atacan la ventana de windows "Mezclador de volumen". He puesto un ejemplo que debería funcionar si hay dos programas que ejecutan dos sonidos al mismo tiempo. Este ejemplo baja y sube lentamente el volumen de los dos programas.
No es la forma más elegante, pero es la más fácil de comprender. Puede que algún día me entretenga con las apis de sonido
.
Código: Seleccionar todo
#include <WinAPIProc.au3>
#include <GuiSlider.au3>
infoVolumenes()
Local $aSlider=volumenesProgramas()
If @error Then
MsgBox(16, "Error", "Error al intentar conseguir los volumenes de los programas.")
Exit
EndIf
If UBound($aSlider)>2 Then
cambiarVolumen($aSlider[1][0], 100)
If @error Then
MsgBox(16, "Error", "Error al cambiar el volumen del primer programa.")
Exit
EndIf
cambiarVolumen($aSlider[2][0], 0)
If @error Then
MsgBox(16, "Error", "Error al cambiar el volumen del segundo programa.")
Exit
EndIf
For $n=1 To 100
cambiarVolumen($aSlider[1][0], 100-$n)
cambiarVolumen($aSlider[2][0], $n)
Sleep(50)
Next
cerrarMezclador()
Else
MsgBox(16, "Error", "No se han encontrados 2 o más volúmenes de programas.")
EndIf
; Devuelve un array con dos dimensiones. En la primera dimensión se almacena todos los volúmenes que hay en la ventana "Mezclador de volumen".
; La segunda dimensión tiene un tamaño fijo 2. En la primera posición se almacena el handle del control de volumen Slider de la ventana "Mezclador de volumen" (importante),
; en la segunda posición se almacena el nombre del programa al que pertenece el volumen.
Func volumenesProgramas()
Local $aSlider[0][2]
Local $numSlider = 1
Local $lanzarVolumen
Local $pidMezclador = ProcessExists("sndvol.exe")
If $pidMezclador=0 then
Local $pidMezclador = Run("sndvol.exe","", @SW_HIDE)
If @error Then Return SetError(1, 0, 0) ; Error. No puede ejecutar sndvol.exe. Devuelve @error=1 y la función 0.
WinWait("Mezclador de volumen")
EndIf
While 1
$hSlider=ControlGetHandle("Mezclador de volumen","","msctls_trackbar32" & $numSlider)
If @error Then ExitLoop
ReDim $aSlider[$numSlider][2]
$aSlider[$numSlider-1][0] = $hSlider
$aSlider[$numSlider-1][1] = ControlGetText("Mezclador de volumen", "", "Static" & (($numSlider * 2) + ($numSlider - 1)))
$numSlider += 1
WEnd
If UBound($aSlider)=0 Then Return SetError(2, 0, 0) ; Error. No encuentra ningún volumen. Devuelve @error=2 y la función 0.
Return $aSlider
EndFunc
; Cambia el valor del volumen del Slider que le pases a la función. El valor del volumen va de 0 a 100.
Func cambiarVolumen($hSlider, $valorVolumen)
Local $pidMezclador = ProcessExists("sndvol.exe")
If $pidMezclador=0 Then Return SetError(1, 0, 0) ; Si no existe el proceso sndvol.exe devuelve @error=1 y valor 0.
If IsHWnd($hSlider) = 0 Then Return SetError(2, 0, 0) ; Si $hSlider no es un handle devuelve @error=2 y valor 0.
Local $existeSlider
Local $posVolumen
_GUICtrlSlider_SetPos($hSlider, $posVolumen)
If $valorVolumen = 100 Then
_GUICtrlSlider_SetPos($hSlider, $posVolumen)
$lanzarVolumen = "{up}"
Else
$posVolumen = 99 - $valorVolumen
_GUICtrlSlider_SetPos($hSlider, $posVolumen)
$lanzarVolumen = "{down}"
EndIf
$existeSlider = ControlSend("Mezclador de volumen","",$hSlider, $lanzarVolumen)
If $existeSlider Then
Return 1
Else
Return SetError(3, 0, 0)
EndIf
EndFunc
; Te devuelve el valor del volumen especificado.
Func valorVolumen($hSlider)
If IsHWnd($hSlider) = 0 Then Return SetError(1, 0, 0)
Return 100 - _GUICtrlSlider_GetPos($hSlider)
EndFunc
; Te da información en la consola de los volúmenes que contines la ventana "Mezclador de volumen".
Func infoVolumenes()
Local $aSlider = volumenesProgramas()
If @error Then Return SetError(1, 0, 0) ; volumenesProgramas() devuelve un error.
For $n=0 To UBound($aSlider) - 1
ConsoleWrite("Indice array: " & $n & " >>> HANDLE DEL CONTROL DE SONIDO SLIDER: " & $aSlider[$n][0] & " >>> PERTENECE A: " & $aSlider[$n][1] & @cr)
Next
EndFunc
; Mata el proceso SndVol.exe si lo ha abierto la función volumenesProgramas(). Sabe esta situación porque comprueba si está visible la ventana "Mezclador de volumen".
Func cerrarMezclador()
If BitAND(WinGetState("Mezclador de volumen", ""), 2) = 0 Then
ProcessClose("SndVol.exe")
EndIf
EndFunc
El ejemplo están puestos los volúmenes que se almacen en la posición 1 y 2 del array. Parece que normalmente en la posición 0 del array se almacena el volumen del los "Sonidos del sistema", pero he podido comprobar que no siempre. Mirar la información de la consola que lanza el ejemplo y poner las posiciones de array bien.
Como en la segunda posición del la segunda dimensión del array se almacena el nombre de los volúmenes, se puede comprobar con las funciones de tratamiento de cadenas, el nombre de los volúmenes con los que se desea trabajar. Una vez localizados, solo debéis seleccionar éstos.
Como siempre, si tenéis alguna duda, comentarla.
Saludos.