You are on page 1of 5

Para modificar los niveles del volumen y del micrfono emplearemos las siguientes funciones del API : - GlobalAlloc

- reserva el nmero de bytes de memoria que se especifiquen. - GlobalLock - bloquea un objeto de memoria global y devuelve un puntero al primer byte del objeto. El bloque de memoria asociado no puede ser movido ni descartado. - GlobalFree - libera el objeto de memoria global e invalida su handle. - mixerClose - cierra el dispositivo mezclador especificado. - mixerGetControlDetails - devuelve detalles sobre un control individual asociado con una lnea de audio. - mixerGetDevCaps - consulta al mezclador especificado para conocer sus capacidades. - mixerGetID - devuelve el identificador de dispositivo del mezclador asociado con el handle de dis positivo especificado. - mixerGetLineControls - devuelve uno o ms controles asociados con una lnea de audio. - mixerGetLineInfo - devuelve informacin sobre una lnea especfica de un dispositivo mezclador. - mixerGetNumDevs - devuelve el nmero de dispo sitivos mezcladores presentes en el sistema. - mixerMessage - manda un mensaje directamente al driver del mezclador. - mixerOpen - abre un mezclador especfico y asegura que el dispositivo no ser eliminado hasta que la aplicacin cierre el handle. - mixerSetControlDetails - establece propiedades de un control asociado con una lnea de audio. Ejemplo Creamos un nuevo proyecto. Se crea el formulario Form1. Aadimos dos botones, dos text box y dos etiquetas al formulario. Aadimosunmdulo (Module1). En la ventana de cdigo del mdulocopiamos el siguientecdigo : Option Explicit Public Const MMSYSERR_NOERROR = 0 Public Const MAXPNAMELEN = 32 Public Const MIXER_LONG_NAME_CHARS = 64 Public Const MIXER_SHORT_NAME_CHARS = 16 Public Const MIXER_GETLINEINFOF_COMPONENTTYPE = &H3& Public Const MIXER_GETCONTROLDETAILSF_VALUE = &H0& Public Const MIXER_GETLINECONTROLSF_ONEBYTYPE = &H2& Public Const MIXERLINE_COMPONENTTYPE_DST_FIRST = &H0& Public Const MIXERLINE_COMPONENTTYPE_SRC_FIRST = &H1000& Public Const MIXERLINE_COMPONENTTYPE_DST_SPEAKERS = _ (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4) Public Const MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE = _ (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3) Public Const MIXERLINE_COMPONENTTYPE_SRC_L INE = _ (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 2) Public Const MIXERCONTROL_CT_CLASS_FADER = &H50000000 Public Const MIXERCONTROL_CT_UNITS_UNSIGNED = &H30000 Public Const MIXERCONTROL_CONTROLTYPE_FADER = _ (MIXERCONTROL_CT_CLASS_FADER Or _ MIXERCONTROL_CT_UNITS_UNSIGNED) Public Const MIXERCONTROL_CONTROLTYPE_VOLUME = _ (MIXERCONTROL_CONTROLTYPE_FADER + 1) Declare Function mixerClose Lib "winmm.dll" (ByValhmx As Long) As Long Declare Function mixerGetControlDeta ils Lib "winmm.dll" _ Alias "mixerGetControlDetailsA" (ByValhmxobj As Long, _ pmxcd As MIXERCONTROLDETAILS, ByValfdwDetails As Long) As Long Declare Function mixerGetDevCaps Lib "winmm.dll" Alias "mixerGetDevCapsA" _ (ByValuMxId As Long, ByValpmxcaps As MIXERCAPS, _

ByValcbmxcaps As Long) As Long Declare Function mixerGetID Lib "winmm.dll" _ (ByValhmxobj As Long, pumxID As Long, ByValfdwId As Long) As Long Declare Function mixerGetLineControls Lib "winmm.dll" _ Alias "mixerGetLineControlsA" (ByValhmxobj As Long, _ pmxlc As MIXERLINECONTROLS, ByValfdwControls As Long) As Long Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoA" _ (ByValhmxobj As Long, pmxl As MIXERLINE, _ ByValfdwInfo As Long) As Long Declare Function mixerGetNumDevs Lib "winmm.dll" () As Long Declare Function mixerMessage Lib "winmm.dll" _ (ByValhmx As Long, ByValuMsg As Long, ByVal dwParam1 As Long, _ ByVal dwParam2 As Long) As Long Declare Function mixerOpen Lib "winmm.dll" (phmx As Long, ByValuMxId As Long, _ ByValdwCallback As Long, ByValdwInstance As Long, _ ByValfdwOpen As Long) As Long Declare Function mixerSetControlDetails Lib "winmm.dll" _ (ByValhmxobj As Long, pm xcd As MIXERCONTROLDETAILS, _ ByValfdwDetails As Long) As Long Declare Sub CopyStructFromPtr Lib "kernel32" Alias "RtlMoveMemory" _ (struct As Any, ByValptr As Long, ByValcb As Long) Declare Sub CopyPtrFromStruct Lib "kernel32" Alias "RtlMoveMeory" _ m (ByValptr As Long, struct As Any, ByValcb As Long) Declare Function GlobalAlloc Lib "kernel32" (ByValwFlags As Long, _ ByValdwBytes As Long) As Long Declare Function GlobalLock Lib "kernel32" (ByValhmem As Long) As Long Declare Function GlobalFree Lib "kernel32" (ByValhmem As Long) As Long Type MIXERCAPS wMid As Integer ' id del fabricante wPid As Integer ' id del producto vDriverVersion As Long ' version del driver szPname As String * MAXPNAMELEN ' nombre del producto fdwSupport As Long ' bits de soporte cDestinations As Long ' numero de destinos End Type Type MIXERCONTROL cbStruct As Long ' tamao en bytes del MIXERCONTROL dwControlID As Long ' id de control nico del mixer dwControlType As Long ' MIXERCONTROL_CONTROLTYPE_xxx fdwControl As Long ' MIXERCONTROL_CONTROLF_xxx cMultipleItems As Long szShortName As String * MIXER_SHORT_NAME_CHARS ' nombrecorto del control szName As String * MIXER_LONG_NAME_CHARS ' nombre largo del control lMinimum As Long ' valor mnimo lMaximum As Long ' valor mximo reserved(10) As Long ' espacioreservado End Type Type MIXERCONTROLDETAILS cbStruct As Long ' tamao en bytes de MIXERCONTROLDETAILS dwControlID As Long ' id del control cChannels As Long ' nmero de canales en el array paDetails item As Long ' hwndOwner o cMultipleItems cbDetails As Long ' tamao de la estructuradetails_XX paDetails As Long ' puntero al array des estructurasdetails_XX End Type Type MIXERCONTROLDETAILS_UNSIGNED dwValue As Long ' valor del control

End Type Type MIXERLINE cbStruct As Long ' tamao de la estructura dwDestination As Long ' ndice de destino (empieza en cero) dwSource As Long ' ndice de origen (empieza en cero) dwLineID As Long ' id de lneanicopara el mixer fdwLine As Long ' estado/informacin de la lnea dwUser As Long ' informacinespecfica del driver dwComponentType As Long ' component type line connects to cChannels As Long ' n de canales de lneasoportados cConnections As Long ' n de conexionesposibles cControls As Long ' n de controles en estalnea szShortName As String * MIXER_SHORT_NAME_CHARS szName As String * MIXER_LONG_NAME_CHARS dwType As Long dwDeviceID As Long wMid As Integer wPid As Integer vDriverVersion As Long szPname As String * MAXPNAMELEN End Type Type MIXERLINECONTROLS cbStruct As Long ' tamao en bytes de MIXERLINECONTROLS dwLineID As Long ' id de lnea (de MIXERLINE.dwLineID) ' MIXER_GETLINECONTROLSF_ONEBYID o dwControl As Long ' MIXER_GETLINECONTROLSF_ONEBYTYPE cControls As Long ' n de controlespmxctrl en el array cbmxctrl As Long ' tamao en bytes de un MIXERCONTROL pamxctrl As Long ' puntero al primer array MIXERCONTROL End Type Function GetVolumeControl(ByValhmixer As Long, _ ByValcomponentType As Long, _ ByValctrlType As Long, _ ByRef mxc As MIXERCON TROL) As Boolean ' Estafuncinintentaobtener un control mixer. ' Devuelve True si lo consigue Dim mxlc As MIXERLINECONTROLS Dim mxl As MIXERLINE Dim hmem As Long Dim rc As Long mxl.cbStruct = Len(mxl) mxl.dwComponentType = componentType ' Obtenerunalneacorrespondiente al tipo de componente rc = mixerGetLineInfo(hmixer, mxl, MIXER_GETLINEINFOF_COMPONENTTYPE) If (MMSYSERR_NOERROR = rc) Then mxlc.cbStruct = Len(mxlc) mxlc.dwLineID = mxl.dwLineID mxlc.dwControl = ctrlType mxlc.cControls = 1 mxlc.cbmxctrl = Len(mxc) ' reservar un buffer para el control hmem = GlobalAlloc(&H40, Len(mxc)) mxlc.pamxctrl = GlobalLock(hmem) mxc.cbStruct = Len(mxc) ' Obtener el control rc = mixerGetLineControls(hmixer, mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE) If (MMSYSERR_NOERROR = rc) Then GetVolumeControl = True ' Copiar el control en la estructura de destino

CopyStructFromPtr mxc, mxlc.pamxctrl, Len(mxc) Else GetVolumeControl = False End If GlobalFree (hmem) Exit Function End If GetVolumeControl = Fa lse End Function FunctionSetVolumeControl(ByValhmixer As Long, mxc As MIXERCONTROL, _ ByVal volume As Long) As Boolean ' Estafuncinmodifica el valor del volumen de un control ' Devuelve True si lo consigue Dim mxcd As MIXERCONTROLDETAILS Dim vol As MIXERCONTROLDETAILS_UNSIGNED mxcd.item = 0 mxcd.dwControlID = mxc.dwControlID mxcd.cbStruct = Len(mxcd) mxcd.cbDetails = Len(vol) ' Reservarespaciopara el buffer del valor del control hmem = GlobalAlloc(&H40, Len(vol)) mxcd.paDetails = GlobalLock(hmem) mxcd.cChannels = 1 vol.dwValue = volume ' Copiar los datos en el buffer del valor del control CopyPtrFromStructmxcd.paDetails, vol, Len(vol) ' Modificar el valor del control rc = mixerSetControlDetails(hmixer, mxcd, MIXER_SETCONTROLDETAILSF_VALUE) GlobalFree (hmem) If (MMSYSERR_NOERROR = rc) Then SetVolumeControl = True Else SetVolumeControl = False End If End Function Copiar el siguientecdigo en la ventana de cdigo del formulario Form1: Option Explicit Dim hmixer As Long ' handle del mixer Dim volCtrl As MIXERCONTROL ' control del volumen del waveout Dim micCtrl As MIXERCONTROL ' control del volumen del micrfono Dim rc As Long ' return code Dim ok As Boolean ' return code booleano Private Sub Form_Load() ' Abrir el mixer con deviceID 0. rc = mixerOpen(hmixer, 0, 0, 0, 0) If ((MMSYSERR_NOERROR <>rc)) Then MsgBox "Couldn't open the mixer." Exit Sub End If ' Obtener el control de volumenwaveout ok = GetVolumeControl(hmixer, _ MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, _ MIXERCONTROL_CONTROLTYPE_VOLUME, _ volCtrl) If (ok = True) Then ' Si todofuebien los valoresmximos y mnimoestnespecificados ' en lMaximum y lMinimum

Label1.Caption = volCtrl.lMinimum& " a " &volCtrl.lMaximum End If ' Obtener el control de volumen del micrfono ok = GetVolumeControl(hmixer, _ MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, _ MIXERCONTROL_CONTROLTYPE_VOLUME, _ micCtrl) If (ok = True) Then Label2.Caption = micCtrl.lMinimum& " a " & micCtrl.lMaximum End If End Sub Private Sub Command1_Click() vol = CLng(Text1.Text) SetVolumeControlhmixer, volCtrl, vol End Sub Private Sub Command2_Click() vol = CLng(Text2.Text) SetVolumeControlhmixer, micCtrl, vol End Sub

You might also like