31 de marzo de 2005

Obtener y ajustar el volumen de los altavoces

Dos funciones para obtener y ajustar el volumen de los altavoces mediante llamados a la API de Windows.

Para obtener el volumen de los altavoces utilizamos función GetVolume() que retorna una cadena Hexadecimal, donde los 4 primeros caracteres (sin el "0x") es el correspondiente al altavoz derecho, y los siguientes 4 corresponden al altavoz izquierdo.

En el siguiente ejemplo transformamos la cadena retornada para obtener el porcentaje de volumen de cada altavoz.

lcHex = GetVolume()
*-- % volumen altavoz izquierdo
lnIzq = CEILING(BITAND(EVALUATE(lcHex),0xFFFF)*100/0xFFFF)
*-- % volumen altavoz derecho
lnDer = CEILING((BITAND(EVALUATE(lcHex),0xFFFF0000)/0x10000)*100/0xFFFF)

? lcHex    && cadena hexadecimal
? lnIzq    && porcentaje volumen altavoz izquierdo
? lnDer    && porcentaje volumen altavoz derecho

*---------------------------------------------------
* FUNCTION GetVolume()
*---------------------------------------------------
* Toma el valor de volumen de los altavoces de la PC
* RETORNO: Caracter (cadena de caracteres hexadecimal)
* USO: GetVolume()
*---------------------------------------------------
FUNCTION GetVolume()
LOCAL ln
  DECLARE INTEGER waveOutGetVolume IN Winmm ;
    INTEGER wDeviceID, ;
    INTEGER @ dwVolume
    ln = 0x0000
    =waveOutGetVolume(0,@ln)
    RETURN TRANSFORM(ln,";@0")
ENDFUNC
*---------------------------------------------------

Para ajustar el volumen de los altavoces utilizamos la función SetVolume() pasandole como parámetro el porcentaje de cada altavoz (izquierdo y derecho).

En el siguiente ejemplo ajustamos el volumen al 75% cada altavoz.

? SetVolume(75,75)

*---------------------------------------------------
* FUNCTION SetVolume(tnIzq, tnDer)
*---------------------------------------------------
* Configura el volumen de los altavoces de la PC
* PARAMETROS:
*   tnIzq = Porcentaje de volumen altavoz izquierdo
*   tnDer = Porcentaje de volumen altavoz derecho
* RETORNO: Logico .T. si pudo configurar
* USO: SetVolume(50,50)
*---------------------------------------------------
FUNCTION SetVolume(tnIzq, tnDer)
  LOCAL lnVol
  DECLARE INTEGER waveOutSetVolume IN Winmm ;
    INTEGER wDeviceID, ;
    INTEGER dwVolume
  tnIzq = MAX(0,MIN(tnIzq,100))
  tnDer = MAX(0,MIN(tnDer,100))
  lnVol = EVALUATE("0x" + ;
    RIGHT(TRANSFORM(tnDer*0xFFFF/100,";@0"),4) + ;
    RIGHT(TRANSFORM(tnIzq*0xFFFF/100,";@0"),4))
  RETURN 0 = waveOutSetVolume(0,lnVol)
ENDFUNC
*---------------------------------------------------

Nota: El control de volumen con las funciones de la API waveOutSetVolume y waveOutGetVolume de este ejemplo solo trabajan para el tipo Onda (Wave) y no sobre el control de volumen general del sistema.

Luis María Guayán

No hay comentarios. :

Publicar un comentario