Ayuda subir y bajar volumen de aplicaciones

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
star871
Mensajes: 5
Registrado: 14 May 2016, 03:15

Ayuda subir y bajar volumen de aplicaciones

Mensaje por star871 »

Hola a todos, quisiera saber si hay alguna manera de subir y bajar el volumen de aplicaciones de la pc, no necesito que me muestre nada, tan solo que baje progresivamente hasta 0 el volumen de una apli y suba progresivamente el volumen de otra hasta el maximo.
Ej: tengo abierto en la pc chrome y un programa "x" que reproduzca audio, necesitaria ver como bajar el volumen del chrome progresivamente y levantar el del programa "x" y hacer otro programa que realice lo mismo a la inversa, muchas gracias
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Ayuda subir y bajar volumen de aplicaciones

Mensaje por Chefito »

Mira este post del compañero wraithdu del foro ingles, que puede que te sirva: https://www.autoitscript.com/forum/topi ... er-volume/

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
star871
Mensajes: 5
Registrado: 14 May 2016, 03:15

Re: Ayuda subir y bajar volumen de aplicaciones

Mensaje por star871 »

Chefito escribió:Mira este post del compañero wraithdu del foro ingles, que puede que te sirva: https://www.autoitscript.com/forum/topi ... er-volume/

Saludos.
Gracias Chefito por interesarte, igualmente lo habia visto a ese post, pero no se aplica a mi problema, porque con ese codigo se manejaria el volumen en general del sistema, pero no permite identificar a cada una de las fuentes de audio que estén presentes en ese momento y regularlas por separado, igual muchas gracias!!!!!!!1
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Ayuda subir y bajar volumen de aplicaciones

Mensaje por Chefito »

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 :smt024 :smt003 .

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.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Ayuda subir y bajar volumen de aplicaciones

Mensaje por Dany »

Hola. Para lograr eso debes implementar WASAPI https://msdn.microsoft.com/en-us/librar ... s.85).aspx


Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Responder