frankmorrison
asked on
HOW to select "MICROPHONE" as recording input device
I need a sample Visual Basic application with 3 buttons:
Button 1) checks what is the current recording input device
Button 2) selects the microphone as the recording input device
Button 3) restores back the initial recording input device if button 2 was clicked
A TOP-DOG Expert will be able to give me code on all 3 buttons. However, I am mainly interested in Button 2.
I will only give points if you provide me with full working sample code. Please do not send me links.
Thanks.
Button 1) checks what is the current recording input device
Button 2) selects the microphone as the recording input device
Button 3) restores back the initial recording input device if button 2 was clicked
A TOP-DOG Expert will be able to give me code on all 3 buttons. However, I am mainly interested in Button 2.
I will only give points if you provide me with full working sample code. Please do not send me links.
Thanks.
Paste the above code in a module and in command2 paste Call SelectMicrophone(0)
ASKER
Rubyn,
I tried your code, but all it does is increase the volume of recording input microphone. But it does NOT select it. Example: I have recording microphone volume to lowest and "line in" selected as the default recording device. When command2 is pressed, "line in" remains as the default recording device and microphone's volume increases to 85%.
I tried your code, but all it does is increase the volume of recording input microphone. But it does NOT select it. Example: I have recording microphone volume to lowest and "line in" selected as the default recording device. When command2 is pressed, "line in" remains as the default recording device and microphone's volume increases to 85%.
ASKER
Rubyn,
I tested your code a little more.... Actually, it IS selecting the "Line In" as the default recording device and NOT the microphone. So, your code may just need a small fine tunning....
I tested your code a little more.... Actually, it IS selecting the "Line In" as the default recording device and NOT the microphone. So, your code may just need a small fine tunning....
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Rubyn, your code works excellent!!!.
I am about to give you the 500 points; but, Is there anyway you can also give the code for button1 and 3?
I am about to give you the 500 points; but, Is there anyway you can also give the code for button1 and 3?
frankmorrison, Yes I can give, but there is a rule in expert-exchange that i cant do homework, I can only give solutions in the place you can't do it by yourself. If you want I can explain the concept behind the code I presented. I can suggest you onething, you try it to do by yourself by the existing code. If you got struck then you open a new thread and ask the doubt, many experts are there to solve and give you knowledge. You can also send a notice to me, so I'll try to guide you. :)
ASKER
Rubyn,
I looked everywhere on expert-exchange for that rule that you mention. Could you please send me a link as to where this is posted?. Additionally, I would not ask you if I could do it myself.
I looked everywhere on expert-exchange for that rule that you mention. Could you please send me a link as to where this is posted?. Additionally, I would not ask you if I could do it myself.
ASKER
Rubyn,
I am not a student. So, this is NOT homework. Anyways, Here's your 500 points.
I am not a student. So, this is NOT homework. Anyways, Here's your 500 points.
The solution for Visual Basic .NET would be:
create a module, and call the Sub with parameter 0.
Option Strict Off
Option Explicit On
Imports System.Runtime.InteropServ ices
Module Module1
' version for Visual Basic DotNet by Martin Martien van der Burgt
Private Const MAXPNAMELEN As Short = 32 ' max product name length (including NULL)
'Private Const MIXER_GETCONTROLDETAILSF_L ISTTEXT As Integer = &H1
'Private Const MIXER_GETCONTROLDETAILSF_Q UERYMASK As Integer = &HF
Private Const MIXER_GETCONTROLDETAILSF_V ALUE As Integer = &H0
Private Const MIXER_GETLINECONTROLSF_ALL As Integer = &H0
'Private Const MIXER_GETLINECONTROLSF_ONE BYID As Integer = &H1
'Private Const MIXER_GETLINECONTROLSF_ONE BYTYPE As Integer = &H2
'Private Const MIXER_GETLINECONTROLSF_QUE RYMASK As Integer = &HF
Private Const MIXER_GETLINEINFOF_COMPONE NTTYPE As Integer = &H3
'Private Const MIXER_GETLINEINFOF_DESTINA TION As Integer = &H0
'Private Const MIXER_GETLINEINFOF_LINEID As Integer = &H2
'Private Const MIXER_GETLINEINFOF_QUERYMA SK As Integer = &HF
Private Const MIXER_GETLINEINFOF_SOURCE As Integer = &H1
'Private Const MIXER_GETLINEINFOF_TARGETT YPE As Integer = &H4
Private Const MIXER_LONG_NAME_CHARS As Short = 64
Private Const MIXER_SHORT_NAME_CHARS As Short = 16
'Private Const MIXER_OBJECTF_AUX As Integer = &H50000000
'Private Const MIXER_OBJECTF_HANDLE As Integer = &H80000000
'Private Const MIXER_OBJECTF_MIDIIN As Integer = &H40000000
'Private Const MIXER_OBJECTF_MIDIOUT As Integer = &H30000000
'Private Const MIXER_OBJECTF_MIXER As Integer = &H0
Private Const MIXER_OBJECTF_WAVEIN As Integer = &H20000000
'Private Const MIXER_OBJECTF_WAVEOUT As Integer = &H10000000
'Private Const MIXER_OBJECTF_HMIDIIN As Integer = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_MIDIIN)
'Private Const MIXER_OBJECTF_HMIDIOUT As Integer = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_MIDIOUT)
'Private Const MIXER_OBJECTF_HMIXER As Integer = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_MIXER)
'Private Const MIXER_OBJECTF_HWAVEIN As Integer = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_WAVEIN)
'Private Const MIXER_OBJECTF_HWAVEOUT As Integer = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_WAVEOUT)
'Private Const MIXER_SETCONTROLDETAILSF_C USTOM As Integer = &H1
'Private Const MIXER_SETCONTROLDETAILSF_Q UERYMASK As Integer = &HF
'Private Const MIXER_SETCONTROLDETAILSF_V ALUE As Integer = &H0
'Private Const MIXERCONTROL_CONTROLF_DISA BLED As Integer = &H80000000
'Private Const MIXERCONTROL_CONTROLF_MULT IPLE As Integer = &H2
'Private Const MIXERCONTROL_CONTROLF_UNIF ORM As Integer = &H1
'Private Const MIXERCONTROL_CT_CLASS_CUST OM As Integer = &H0
Private Const MIXERCONTROL_CT_CLASS_FADE R As Integer = &H50000000
Private Const MIXERCONTROL_CT_CLASS_LIST As Integer = &H70000000
'Private Const MIXERCONTROL_CT_CLASS_MASK As Integer = &HF0000000
'Private Const MIXERCONTROL_CT_CLASS_METE R As Integer = &H10000000
'Private Const MIXERCONTROL_CT_CLASS_NUMB ER As Integer = &H30000000
'Private Const MIXERCONTROL_CT_CLASS_SLID ER As Integer = &H40000000
Private Const MIXERCONTROL_CT_CLASS_SWIT CH As Integer = &H20000000
'Private Const MIXERCONTROL_CT_CLASS_TIME As Integer = &H60000000
'Private Const MIXERCONTROL_CT_SC_LIST_MU LTIPLE As Integer = &H1000000
'Private Const MIXERCONTROL_CT_SC_LIST_SI NGLE As Integer = &H0
'Private Const MIXERCONTROL_CT_SC_METER_P OLLED As Integer = &H0
Private Const MIXERCONTROL_CT_SC_SWITCH_ BOOLEAN As Integer = &H0
'Private Const MIXERCONTROL_CT_SC_SWITCH_ BUTTON As Integer = &H1000000
'Private Const MIXERCONTROL_CT_SC_TIME_MI CROSECS As Integer = &H0
'Private Const MIXERCONTROL_CT_SC_TIME_MI LLISECS As Integer = &H1000000
'Private Const MIXERCONTROL_CT_SUBCLASS_M ASK As Integer = &HF000000
Private Const MIXERCONTROL_CT_UNITS_BOOL EAN As Integer = &H10000
'Private Const MIXERCONTROL_CT_UNITS_CUST OM As Integer = &H0
'Private Const MIXERCONTROL_CT_UNITS_DECI BELS As Integer = &H40000 ' in 10ths
'Private Const MIXERCONTROL_CT_UNITS_MASK As Integer = &HFF0000
'Private Const MIXERCONTROL_CT_UNITS_PERC ENT As Integer = &H50000 ' in 10ths
'Private Const MIXERCONTROL_CT_UNITS_SIGN ED As Integer = &H20000
'Private Const MIXERCONTROL_CT_UNITS_UNSI GNED As Integer = &H30000
'Private Const MIXERCONTROL_CONTROLTYPE_F ADER As Integer = (MIXERCONTROL_CT_CLASS_FAD ER Or MIXERCONTROL_CT_UNITS_UNSI GNED)
'Private Const MIXERCONTROL_CONTROLTYPE_S LIDER As Integer = (MIXERCONTROL_CT_CLASS_SLI DER Or MIXERCONTROL_CT_UNITS_SIGN ED)
'Private Const MIXERCONTROL_CONTROLTYPE_U NSIGNEDMET ER As Integer = (MIXERCONTROL_CT_CLASS_MET ER Or MIXERCONTROL_CT_SC_METER_P OLLED Or MIXERCONTROL_CT_UNITS_UNSI GNED)
'Private Const MIXERCONTROL_CONTROLTYPE_S IGNEDMETER As Integer = (MIXERCONTROL_CT_CLASS_MET ER Or MIXERCONTROL_CT_SC_METER_P OLLED Or MIXERCONTROL_CT_UNITS_SIGN ED)
'Private Const MIXERCONTROL_CONTROLTYPE_S INGLESELEC T As Integer = (MIXERCONTROL_CT_CLASS_LIS T Or MIXERCONTROL_CT_SC_LIST_SI NGLE Or MIXERCONTROL_CT_UNITS_BOOL EAN)
'Private Const MIXERCONTROL_CONTROLTYPE_M ULTIPLESEL ECT As Integer = (MIXERCONTROL_CT_CLASS_LIS T Or MIXERCONTROL_CT_SC_LIST_MU LTIPLE Or MIXERCONTROL_CT_UNITS_BOOL EAN)
'Private Const MIXERCONTROL_CONTROLTYPE_B ASS As Integer = ((MIXERCONTROL_CONTROLTYPE _FADER) + 2)
Private Const MIXERCONTROL_CONTROLTYPE_B OOLEAN As Integer = (MIXERCONTROL_CT_CLASS_SWI TCH Or MIXERCONTROL_CT_SC_SWITCH_ BOOLEAN Or MIXERCONTROL_CT_UNITS_BOOL EAN)
'Private Const MIXERCONTROL_CONTROLTYPE_B OOLEANMETE R As Integer = (MIXERCONTROL_CT_CLASS_MET ER Or MIXERCONTROL_CT_SC_METER_P OLLED Or MIXERCONTROL_CT_UNITS_BOOL EAN)
'Private Const MIXERCONTROL_CONTROLTYPE_B UTTON As Integer = (MIXERCONTROL_CT_CLASS_SWI TCH Or MIXERCONTROL_CT_SC_SWITCH_ BUTTON Or MIXERCONTROL_CT_UNITS_BOOL EAN)
'Private Const MIXERCONTROL_CONTROLTYPE_C USTOM As Integer = (MIXERCONTROL_CT_CLASS_CUS TOM Or MIXERCONTROL_CT_UNITS_CUST OM)
'Private Const MIXERCONTROL_CONTROLTYPE_D ECIBELS As Integer = (MIXERCONTROL_CT_CLASS_NUM BER Or MIXERCONTROL_CT_UNITS_DECI BELS)
'Private Const MIXERCONTROL_CONTROLTYPE_E QUALIZER As Integer = ((MIXERCONTROL_CONTROLTYPE _FADER) + 4)
'Private Const MIXERCONTROL_CONTROLTYPE_L OUDNESS As Integer = ((MIXERCONTROL_CONTROLTYPE _BOOLEAN) + 4)
'Private Const MIXERCONTROL_CONTROLTYPE_M ICROTIME As Integer = (MIXERCONTROL_CT_CLASS_TIM E Or MIXERCONTROL_CT_SC_TIME_MI CROSECS Or MIXERCONTROL_CT_UNITS_UNSI GNED)
'Private Const MIXERCONTROL_CONTROLTYPE_M ILLITIME As Integer = (MIXERCONTROL_CT_CLASS_TIM E Or MIXERCONTROL_CT_SC_TIME_MI LLISECS Or MIXERCONTROL_CT_UNITS_UNSI GNED)
'Private Const MIXERCONTROL_CONTROLTYPE_M IXER As Integer = ((MIXERCONTROL_CONTROLTYPE _MULTIPLES ELECT) + 1)
'Private Const MIXERCONTROL_CONTROLTYPE_M ONO As Integer = ((MIXERCONTROL_CONTROLTYPE _BOOLEAN) + 3)
'Private Const MIXERCONTROL_CONTROLTYPE_M UTE As Integer = ((MIXERCONTROL_CONTROLTYPE _BOOLEAN) + 2)
'Private Const MIXERCONTROL_CONTROLTYPE_M UX As Integer = ((MIXERCONTROL_CONTROLTYPE _SINGLESEL ECT) + 1)
'Private Const MIXERCONTROL_CONTROLTYPE_O NOFF As Integer = ((MIXERCONTROL_CONTROLTYPE _BOOLEAN) + 1)
'Private Const MIXERCONTROL_CONTROLTYPE_P AN As Integer = ((MIXERCONTROL_CONTROLTYPE _SLIDER) + 1)
'Private Const MIXERCONTROL_CONTROLTYPE_P EAKMETER As Integer = ((MIXERCONTROL_CONTROLTYPE _SIGNEDMET ER) + 1)
'Private Const MIXERCONTROL_CONTROLTYPE_P ERCENT As Integer = (MIXERCONTROL_CT_CLASS_NUM BER Or MIXERCONTROL_CT_UNITS_PERC ENT)
'Private Const MIXERCONTROL_CONTROLTYPE_Q SOUNDPAN As Integer = ((MIXERCONTROL_CONTROLTYPE _SLIDER) + 2)
'Private Const MIXERCONTROL_CONTROLTYPE_S IGNED As Integer = (MIXERCONTROL_CT_CLASS_NUM BER Or MIXERCONTROL_CT_UNITS_SIGN ED)
'Private Const MIXERCONTROL_CONTROLTYPE_S TEREOENH As Integer = ((MIXERCONTROL_CONTROLTYPE _BOOLEAN) + 5)
'Private Const MIXERCONTROL_CONTROLTYPE_T REBLE As Integer = ((MIXERCONTROL_CONTROLTYPE _FADER) + 3)
'Private Const MIXERCONTROL_CONTROLTYPE_U NSIGNED As Integer = (MIXERCONTROL_CT_CLASS_NUM BER Or MIXERCONTROL_CT_UNITS_UNSI GNED)
'Private Const MIXERCONTROL_CONTROLTYPE_V OLUME As Integer = ((MIXERCONTROL_CONTROLTYPE _FADER) + 1)
Private Const MIXERLINE_COMPONENTTYPE_SR C_FIRST As Integer = &H1000
Private Const MIXERLINE_COMPONENTTYPE_DS T_FIRST As Integer = &H0
'Private Const MIXERLINE_COMPONENTTYPE_DS T_DIGITAL As Integer = (MIXERLINE_COMPONENTTYPE_D ST_FIRST + 1)
'Private Const MIXERLINE_COMPONENTTYPE_DS T_HEADPHON ES As Integer = (MIXERLINE_COMPONENTTYPE_D ST_FIRST + 5)
'Private Const MIXERLINE_COMPONENTTYPE_DS T_LAST As Integer = (MIXERLINE_COMPONENTTYPE_D ST_FIRST + 8)
'Private Const MIXERLINE_COMPONENTTYPE_DS T_LINE As Integer = (MIXERLINE_COMPONENTTYPE_D ST_FIRST + 2)
'Private Const MIXERLINE_COMPONENTTYPE_DS T_MONITOR As Integer = (MIXERLINE_COMPONENTTYPE_D ST_FIRST + 3)
'Private Const MIXERLINE_COMPONENTTYPE_DS T_SPEAKERS As Integer = (MIXERLINE_COMPONENTTYPE_D ST_FIRST + 4)
'Private Const MIXERLINE_COMPONENTTYPE_DS T_TELEPHON E As Integer = (MIXERLINE_COMPONENTTYPE_D ST_FIRST + 6)
'Private Const MIXERLINE_COMPONENTTYPE_DS T_UNDEFINE D As Integer = (MIXERLINE_COMPONENTTYPE_D ST_FIRST + 0)
'Private Const MIXERLINE_COMPONENTTYPE_DS T_VOICEIN As Integer = (MIXERLINE_COMPONENTTYPE_D ST_FIRST + 8)
Private Const MIXERLINE_COMPONENTTYPE_DS T_WAVEIN As Integer = (MIXERLINE_COMPONENTTYPE_D ST_FIRST + 7)
'Private Const MIXERLINE_COMPONENTTYPE_SR C_ANALOG As Integer = (MIXERLINE_COMPONENTTYPE_S RC_FIRST + 10)
'Private Const MIXERLINE_COMPONENTTYPE_SR C_AUXILIAR Y As Integer = (MIXERLINE_COMPONENTTYPE_S RC_FIRST + 9)
'Private Const MIXERLINE_COMPONENTTYPE_SR C_COMPACTD ISC As Integer = (MIXERLINE_COMPONENTTYPE_S RC_FIRST + 5)
'Private Const MIXERLINE_COMPONENTTYPE_SR C_DIGITAL As Integer = (MIXERLINE_COMPONENTTYPE_S RC_FIRST + 1)
'Private Const MIXERLINE_COMPONENTTYPE_SR C_LAST As Integer = (MIXERLINE_COMPONENTTYPE_S RC_FIRST + 10)
'Private Const MIXERLINE_COMPONENTTYPE_SR C_LINE As Integer = (MIXERLINE_COMPONENTTYPE_S RC_FIRST + 2)
Private Const MIXERLINE_COMPONENTTYPE_SR C_MICROPHO NE As Integer = (MIXERLINE_COMPONENTTYPE_S RC_FIRST + 3)
'Private Const MIXERLINE_COMPONENTTYPE_SR C_PCSPEAKE R As Integer = (MIXERLINE_COMPONENTTYPE_S RC_FIRST + 7)
'Private Const MIXERLINE_COMPONENTTYPE_SR C_SYNTHESI ZER As Integer = (MIXERLINE_COMPONENTTYPE_S RC_FIRST + 4)
'Private Const MIXERLINE_COMPONENTTYPE_SR C_TELEPHON E As Integer = (MIXERLINE_COMPONENTTYPE_S RC_FIRST + 6)
'Private Const MIXERLINE_COMPONENTTYPE_SR C_UNDEFINE D As Integer = (MIXERLINE_COMPONENTTYPE_S RC_FIRST + 0)
'Private Const MIXERLINE_COMPONENTTYPE_SR C_WAVEOUT As Integer = (MIXERLINE_COMPONENTTYPE_S RC_FIRST + 8)
'Private Const MIXERLINE_LINEF_ACTIVE As Integer = &H1
'Private Const MIXERLINE_LINEF_DISCONNECT ED As Integer = &H8000
'Private Const MIXERLINE_LINEF_SOURCE As Integer = &H80000000
'Private Const MIXERLINE_TARGETTYPE_AUX As Short = 5
'Private Const MIXERLINE_TARGETTYPE_MIDII N As Short = 4
'Private Const MIXERLINE_TARGETTYPE_MIDIO UT As Short = 3
'Private Const MIXERLINE_TARGETTYPE_UNDEF INED As Short = 0
'Private Const MIXERLINE_TARGETTYPE_WAVEI N As Short = 2
'Private Const MIXERLINE_TARGETTYPE_WAVEO UT As Short = 1
'Private Const MIXERR_BASE As Short = 1024
'Private Const MIXERR_INVALCONTROL As Integer = (MIXERR_BASE + 1)
'Private Const MIXERR_INVALLINE As Integer = (MIXERR_BASE + 0)
'Private Const MIXERR_INVALVALUE As Integer = (MIXERR_BASE + 2)
'Private Const MIXERR_LASTERROR As Integer = (MIXERR_BASE + 2)
Private Const maxMIXERCONTROLS As Integer = 32
Private Structure MIXERCONTROLS
<MarshalAs(UnmanagedType.B yValArray, SizeConst:=maxMIXERCONTROL S)> _
Dim omc() As MIXERCONTROL ' one mixer control
End Structure
Private Structure MIXERCONTROL
Dim cbStruct As Integer ' size in Byte of MIXERCONTROL
Dim dwControlID As Integer ' unique control id for mixer device
Dim dwControlType As Integer ' MIXERCONTROL_CONTROLTYPE_x xx
Dim fdwControl As Integer ' MIXERCONTROL_CONTROLF_xxx
Dim cMultipleItems As Integer ' if MIXERCONTROL_CONTROLF_MULT IPLE set
<MarshalAs(UnmanagedType.B yValTStr, SizeConst:=MIXER_SHORT_NAM E_CHARS)> _
Dim szShortName As String
<MarshalAs(UnmanagedType.B yValTStr, SizeConst:=MIXER_LONG_NAME _CHARS)> _
Dim szName As String
Dim Bounds0 As Integer : Dim Bounds1 As Integer : Dim Bounds2 As Integer : Dim Bounds3 As Integer : Dim Bounds4 As Integer : Dim Bounds5 As Integer
Dim Metrics0 As Integer : Dim Metrics1 As Integer : Dim Metrics2 As Integer : Dim Metrics3 As Integer : Dim Metrics4 As Integer : Dim Metrics5 As Integer
End Structure
Private Structure MIXERCONTROLDETAILS
Dim cbStruct As Integer ' size in Byte of MIXERCONTROLDETAILS
Dim dwControlID As Integer ' control id to get/set details on
Dim cChannels As Integer ' number of channels in paDetails array
Dim item As Integer ' hwndOwner or cMultipleItems
Dim cbDetails As Integer ' size of _one_ details_XX struct
Dim paDetails As IntPtr ' pointer to array of details_XX structs
End Structure
Private Structure Target ' for use in MIXERLINE and others (embedded structure)
Dim dwType As Integer ' MIXERLINE_TARGETTYPE_xxxx
Dim dwDeviceID As Integer ' target device ID of device type
Dim wMid As Short ' of target device
Dim wPid As Short ' "
Dim vDriverVersion As Integer ' "
<VBFixedString(MAXPNAMELEN ), MarshalAs(UnmanagedType.By ValArray, SizeConst:=MAXPNAMELEN)> _
Public szPname() As Char
End Structure
Private Structure MIXERLINE
Dim cbStruct As Integer ' size of MIXERLINE structure
Dim dwDestination As Integer ' zero based destination index
Dim dwSource As Integer ' zero based source index (if source)
Dim dwLineID As Integer ' unique line id for mixer device
Dim fdwLine As Integer ' state/information about line
Dim dwUser As Integer ' driver specific information
Dim dwComponentType As Integer ' component type line connects to
Dim cChannels As Integer ' number of channels line supports
Dim cConnections As Integer ' number of connections (possible)
Dim cControls As Integer ' number of controls at this line
<VBFixedString(MIXER_SHORT _NAME_CHAR S), MarshalAs(UnmanagedType.By ValArray, SizeConst:=MIXER_SHORT_NAM E_CHARS)> _
Public szShortName() As Char
<VBFixedString(MIXER_LONG_ NAME_CHARS ), MarshalAs(UnmanagedType.By ValArray, SizeConst:=MIXER_LONG_NAME _CHARS)> _
Public szName() As Char
Dim tTarget As Target
End Structure
Private Structure MIXERLINECONTROLS
Dim cbStruct As Integer ' size in Byte of MIXERLINECONTROLS
Dim dwLineID As Integer ' line id (from MIXERLINE.dwLineID)
' union: MIXER_GETLINECONTROLSF_ONE BYID or
Dim dwControl As Integer ' MIXER_GETLINECONTROLSF_ONE BYTYPE
Dim cControls As Integer ' count of controls pmxctrl points to
Dim cbmxctrl As Integer ' size in Byte of _one_ MIXERCONTROL
Dim pamxctrl As IntPtr ' pointer to first MIXERCONTROL array
End Structure
Private Const maxPDATA As Integer = 64
Private Structure PDATAS
<MarshalAs(UnmanagedType.B yValArray, SizeConst:=maxPDATA)> _
Dim pData() As Integer
End Structure
Private Declare Function mixerGetControlDetails Lib "winmm.dll" Alias "mixerGetControlDetailsA" (ByVal hmxobj As Integer, ByRef pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Integer) As Integer
Private Declare Function mixerGetLineControls Lib "winmm.dll" Alias "mixerGetLineControlsA" (ByVal hmxobj As Integer, ByRef pmxlc As MIXERLINECONTROLS, ByVal fdwControls As Integer) As Integer
Private Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoA" (ByVal hmxobj As Integer, ByRef pmxl As MIXERLINE, ByVal fdwInfo As Integer) As Integer
Private Declare Function mixerSetControlDetails Lib "winmm.dll" (ByVal hmxobj As Integer, ByRef pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Integer) As Integer
Public Function SetMicrophoneOK(ByRef DeviceID As Integer, Optional ByRef sError As String = "") As Boolean
' DeviceID usually = 0
'Dim pmxcaps As MIXERCAPS
Dim pmxl As MIXERLINE = Nothing
Dim pmxlc As MIXERLINECONTROLS
Dim pmxc As MIXERCONTROLS
Dim pmxcd As MIXERCONTROLDETAILS
Dim pdt As PDATAS
Dim rc, Index As Integer
Dim Text(63) As Byte
Dim MicIndex As Integer
'Get WaveIn Destination Number
pmxl.cbStruct = Marshal.SizeOf(pmxl)
pmxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DS T_WAVEIN
rc = mixerGetLineInfo(DeviceID, pmxl, MIXER_OBJECTF_WAVEIN Or MIXER_GETLINEINFOF_COMPONE NTTYPE)
If rc <> 0 Then GoTo Exception 'Error Trap
'Check For Microphone Source in that destination
For Index = 0 To pmxl.cConnections - 1
pmxl.dwSource = Index
rc = mixerGetLineInfo(DeviceID, pmxl, MIXER_GETLINEINFOF_SOURCE)
If rc <> 0 Then GoTo Exception 'Error Trap
If pmxl.dwComponentType = MIXERLINE_COMPONENTTYPE_SR C_MICROPHO NE Then MicIndex = Index : Exit For
Next
'Adjust Recording Level of that Microphone
'ReDim pmxc.omc(pmxl.cControls - 1) would be better, but Marshaling allows only Fixed Length Arrays in structures. Hope 32 is enough
ReDim pmxc.omc(maxMIXERCONTROLS - 1)
pmxlc.cbStruct = Marshal.SizeOf(pmxlc)
pmxlc.dwLineID = pmxl.dwLineID
pmxlc.cControls = pmxl.cControls
pmxlc.cbmxctrl = Marshal.SizeOf(pmxc.omc(0) )
pmxlc.pamxctrl = Marshal.AllocCoTaskMem(Mar shal.SizeO f(pmxc.omc (0)) * maxMIXERCONTROLS)
rc = mixerGetLineControls(Devic eID, pmxlc, MIXER_OBJECTF_WAVEIN Or MIXER_GETLINECONTROLSF_ALL )
If rc <> 0 Then GoTo Exception 'Error Trap
pmxc = CType(Marshal.PtrToStructu re(pmxlc.p amxctrl, GetType(MIXERCONTROLS)), MIXERCONTROLS)
Marshal.FreeCoTaskMem(pmxl c.pamxctrl )
ReDim pdt.pData(maxPDATA)
For Index = LBound(pmxc.omc) To LBound(pmxc.omc) + pmxl.cControls - 1
If pmxc.omc(Index).dwControlT ype = (pmxc.omc(Index).dwControl Type Or MIXERCONTROL_CT_CLASS_FADE R) Then
'set its fader control to 75% of maximum
pmxcd.cbStruct = Marshal.SizeOf(pmxcd)
pmxcd.cChannels = 1
pmxcd.dwControlID = pmxc.omc(Index).dwControlI D
pmxcd.cbDetails = Marshal.SizeOf(pdt.pData(0 ))
pmxcd.paDetails = Marshal.AllocCoTaskMem(Mar shal.SizeO f(pdt.pDat a(0)) * maxPDATA)
pdt.pData(0) = pmxc.omc(Index).Bounds1 * 0.75 ' zet volume op 75%
Marshal.StructureToPtr(pdt , pmxcd.paDetails, False)
rc = mixerSetControlDetails(Dev iceID, pmxcd, MIXER_GETCONTROLDETAILSF_V ALUE)
Marshal.FreeCoTaskMem(pmxc d.paDetail s)
If rc <> 0 Then GoTo Exception 'Error Trap
ElseIf pmxc.omc(Index).dwControlT ype = (pmxc.omc(Index).dwControl Type Or MIXERCONTROL_CONTROLTYPE_B OOLEAN) Then
'Set Boost/ACG/Incr/... to ON
pmxcd.cbStruct = Marshal.SizeOf(pmxcd)
pmxcd.cChannels = 1
pmxcd.dwControlID = pmxc.omc(Index).dwControlI D
pmxcd.cbDetails = Marshal.SizeOf(pdt.pData(0 ))
pmxcd.paDetails = Marshal.AllocCoTaskMem(Mar shal.SizeO f(pdt.pDat a(0)) * maxPDATA)
pdt.pData(0) = 1 'On
Marshal.StructureToPtr(pdt , pmxcd.paDetails, False)
rc = mixerSetControlDetails(Dev iceID, pmxcd, MIXER_GETCONTROLDETAILSF_V ALUE)
Marshal.FreeCoTaskMem(pmxc d.paDetail s)
If rc <> 0 Then GoTo Exception 'Error Trap
End If
Next
pmxl.cbStruct = Marshal.SizeOf(pmxl)
pmxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DS T_WAVEIN
rc = mixerGetLineInfo(DeviceID, pmxl, MIXER_OBJECTF_WAVEIN Or MIXER_GETLINEINFOF_COMPONE NTTYPE)
'ReDim pmxc.omc(pmxl.cControls - 1)
ReDim pmxc.omc(maxMIXERCONTROLS - 1)
pmxlc.cbStruct = Marshal.SizeOf(pmxlc)
pmxlc.dwLineID = pmxl.dwLineID
pmxlc.cControls = pmxl.cControls
pmxlc.cbmxctrl = Marshal.SizeOf(pmxc.omc(0) )
pmxlc.pamxctrl = Marshal.AllocCoTaskMem(Mar shal.SizeO f(pmxc.omc (0)) * maxMIXERCONTROLS)
rc = mixerGetLineControls(Devic eID, pmxlc, MIXER_OBJECTF_WAVEIN Or MIXER_GETLINECONTROLSF_ALL )
If rc <> 0 Then GoTo Exception 'Error Trap
pmxc = CType(Marshal.PtrToStructu re(pmxlc.p amxctrl, GetType(MIXERCONTROLS)), MIXERCONTROLS)
Marshal.FreeCoTaskMem(pmxl c.pamxctrl )
For Index = LBound(pmxc.omc) To LBound(pmxc.omc) + pmxl.cControls - 1
'set the microphone in multiple select to "selected"
If pmxc.omc(Index).dwControlT ype = (pmxc.omc(Index).dwControl Type Or MIXERCONTROL_CT_CLASS_LIST Or MIXERCONTROL_CT_UNITS_BOOL EAN) Then
'ReDim pdata(pmxc.omc(Index).cMul tipleItems - 1)
ReDim pdt.pData(maxPDATA) ' Marshal allows Fixed length arrays in structures only
pmxcd.dwControlID = pmxc.omc(Index).dwControlI D
pmxcd.item = pmxc.omc(Index).cMultipleI tems
pmxcd.paDetails = Marshal.AllocCoTaskMem(Mar shal.SizeO f(pdt.pDat a(0)) * maxPDATA)
pdt.pData(pmxcd.item - MicIndex - 1) = 1 ' select microphone
Marshal.StructureToPtr(pdt , pmxcd.paDetails, False)
rc = mixerSetControlDetails(Dev iceID, pmxcd, MIXER_GETCONTROLDETAILSF_V ALUE)
Marshal.FreeCoTaskMem(pmxc d.paDetail s)
If rc <> 0 Then GoTo Exception 'Error Trap
End If
Next
SetMicrophoneOK = True
Exit Function
Exception:
SetMicrophoneOK = False
End Function
End Modul
create a module, and call the Sub with parameter 0.
Option Strict Off
Option Explicit On
Imports System.Runtime.InteropServ
Module Module1
' version for Visual Basic DotNet by Martin Martien van der Burgt
Private Const MAXPNAMELEN As Short = 32 ' max product name length (including NULL)
'Private Const MIXER_GETCONTROLDETAILSF_L
'Private Const MIXER_GETCONTROLDETAILSF_Q
Private Const MIXER_GETCONTROLDETAILSF_V
Private Const MIXER_GETLINECONTROLSF_ALL
'Private Const MIXER_GETLINECONTROLSF_ONE
'Private Const MIXER_GETLINECONTROLSF_ONE
'Private Const MIXER_GETLINECONTROLSF_QUE
Private Const MIXER_GETLINEINFOF_COMPONE
'Private Const MIXER_GETLINEINFOF_DESTINA
'Private Const MIXER_GETLINEINFOF_LINEID As Integer = &H2
'Private Const MIXER_GETLINEINFOF_QUERYMA
Private Const MIXER_GETLINEINFOF_SOURCE As Integer = &H1
'Private Const MIXER_GETLINEINFOF_TARGETT
Private Const MIXER_LONG_NAME_CHARS As Short = 64
Private Const MIXER_SHORT_NAME_CHARS As Short = 16
'Private Const MIXER_OBJECTF_AUX As Integer = &H50000000
'Private Const MIXER_OBJECTF_HANDLE As Integer = &H80000000
'Private Const MIXER_OBJECTF_MIDIIN As Integer = &H40000000
'Private Const MIXER_OBJECTF_MIDIOUT As Integer = &H30000000
'Private Const MIXER_OBJECTF_MIXER As Integer = &H0
Private Const MIXER_OBJECTF_WAVEIN As Integer = &H20000000
'Private Const MIXER_OBJECTF_WAVEOUT As Integer = &H10000000
'Private Const MIXER_OBJECTF_HMIDIIN As Integer = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_MIDIIN)
'Private Const MIXER_OBJECTF_HMIDIOUT As Integer = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_MIDIOUT)
'Private Const MIXER_OBJECTF_HMIXER As Integer = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_MIXER)
'Private Const MIXER_OBJECTF_HWAVEIN As Integer = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_WAVEIN)
'Private Const MIXER_OBJECTF_HWAVEOUT As Integer = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_WAVEOUT)
'Private Const MIXER_SETCONTROLDETAILSF_C
'Private Const MIXER_SETCONTROLDETAILSF_Q
'Private Const MIXER_SETCONTROLDETAILSF_V
'Private Const MIXERCONTROL_CONTROLF_DISA
'Private Const MIXERCONTROL_CONTROLF_MULT
'Private Const MIXERCONTROL_CONTROLF_UNIF
'Private Const MIXERCONTROL_CT_CLASS_CUST
Private Const MIXERCONTROL_CT_CLASS_FADE
Private Const MIXERCONTROL_CT_CLASS_LIST
'Private Const MIXERCONTROL_CT_CLASS_MASK
'Private Const MIXERCONTROL_CT_CLASS_METE
'Private Const MIXERCONTROL_CT_CLASS_NUMB
'Private Const MIXERCONTROL_CT_CLASS_SLID
Private Const MIXERCONTROL_CT_CLASS_SWIT
'Private Const MIXERCONTROL_CT_CLASS_TIME
'Private Const MIXERCONTROL_CT_SC_LIST_MU
'Private Const MIXERCONTROL_CT_SC_LIST_SI
'Private Const MIXERCONTROL_CT_SC_METER_P
Private Const MIXERCONTROL_CT_SC_SWITCH_
'Private Const MIXERCONTROL_CT_SC_SWITCH_
'Private Const MIXERCONTROL_CT_SC_TIME_MI
'Private Const MIXERCONTROL_CT_SC_TIME_MI
'Private Const MIXERCONTROL_CT_SUBCLASS_M
Private Const MIXERCONTROL_CT_UNITS_BOOL
'Private Const MIXERCONTROL_CT_UNITS_CUST
'Private Const MIXERCONTROL_CT_UNITS_DECI
'Private Const MIXERCONTROL_CT_UNITS_MASK
'Private Const MIXERCONTROL_CT_UNITS_PERC
'Private Const MIXERCONTROL_CT_UNITS_SIGN
'Private Const MIXERCONTROL_CT_UNITS_UNSI
'Private Const MIXERCONTROL_CONTROLTYPE_F
'Private Const MIXERCONTROL_CONTROLTYPE_S
'Private Const MIXERCONTROL_CONTROLTYPE_U
'Private Const MIXERCONTROL_CONTROLTYPE_S
'Private Const MIXERCONTROL_CONTROLTYPE_S
'Private Const MIXERCONTROL_CONTROLTYPE_M
'Private Const MIXERCONTROL_CONTROLTYPE_B
Private Const MIXERCONTROL_CONTROLTYPE_B
'Private Const MIXERCONTROL_CONTROLTYPE_B
'Private Const MIXERCONTROL_CONTROLTYPE_B
'Private Const MIXERCONTROL_CONTROLTYPE_C
'Private Const MIXERCONTROL_CONTROLTYPE_D
'Private Const MIXERCONTROL_CONTROLTYPE_E
'Private Const MIXERCONTROL_CONTROLTYPE_L
'Private Const MIXERCONTROL_CONTROLTYPE_M
'Private Const MIXERCONTROL_CONTROLTYPE_M
'Private Const MIXERCONTROL_CONTROLTYPE_M
'Private Const MIXERCONTROL_CONTROLTYPE_M
'Private Const MIXERCONTROL_CONTROLTYPE_M
'Private Const MIXERCONTROL_CONTROLTYPE_M
'Private Const MIXERCONTROL_CONTROLTYPE_O
'Private Const MIXERCONTROL_CONTROLTYPE_P
'Private Const MIXERCONTROL_CONTROLTYPE_P
'Private Const MIXERCONTROL_CONTROLTYPE_P
'Private Const MIXERCONTROL_CONTROLTYPE_Q
'Private Const MIXERCONTROL_CONTROLTYPE_S
'Private Const MIXERCONTROL_CONTROLTYPE_S
'Private Const MIXERCONTROL_CONTROLTYPE_T
'Private Const MIXERCONTROL_CONTROLTYPE_U
'Private Const MIXERCONTROL_CONTROLTYPE_V
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_DS
'Private Const MIXERLINE_COMPONENTTYPE_DS
'Private Const MIXERLINE_COMPONENTTYPE_DS
'Private Const MIXERLINE_COMPONENTTYPE_DS
'Private Const MIXERLINE_COMPONENTTYPE_DS
'Private Const MIXERLINE_COMPONENTTYPE_DS
'Private Const MIXERLINE_COMPONENTTYPE_DS
'Private Const MIXERLINE_COMPONENTTYPE_DS
'Private Const MIXERLINE_COMPONENTTYPE_DS
'Private Const MIXERLINE_COMPONENTTYPE_DS
Private Const MIXERLINE_COMPONENTTYPE_DS
'Private Const MIXERLINE_COMPONENTTYPE_SR
'Private Const MIXERLINE_COMPONENTTYPE_SR
'Private Const MIXERLINE_COMPONENTTYPE_SR
'Private Const MIXERLINE_COMPONENTTYPE_SR
'Private Const MIXERLINE_COMPONENTTYPE_SR
'Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_SR
'Private Const MIXERLINE_COMPONENTTYPE_SR
'Private Const MIXERLINE_COMPONENTTYPE_SR
'Private Const MIXERLINE_COMPONENTTYPE_SR
'Private Const MIXERLINE_COMPONENTTYPE_SR
'Private Const MIXERLINE_COMPONENTTYPE_SR
'Private Const MIXERLINE_LINEF_ACTIVE As Integer = &H1
'Private Const MIXERLINE_LINEF_DISCONNECT
'Private Const MIXERLINE_LINEF_SOURCE As Integer = &H80000000
'Private Const MIXERLINE_TARGETTYPE_AUX As Short = 5
'Private Const MIXERLINE_TARGETTYPE_MIDII
'Private Const MIXERLINE_TARGETTYPE_MIDIO
'Private Const MIXERLINE_TARGETTYPE_UNDEF
'Private Const MIXERLINE_TARGETTYPE_WAVEI
'Private Const MIXERLINE_TARGETTYPE_WAVEO
'Private Const MIXERR_BASE As Short = 1024
'Private Const MIXERR_INVALCONTROL As Integer = (MIXERR_BASE + 1)
'Private Const MIXERR_INVALLINE As Integer = (MIXERR_BASE + 0)
'Private Const MIXERR_INVALVALUE As Integer = (MIXERR_BASE + 2)
'Private Const MIXERR_LASTERROR As Integer = (MIXERR_BASE + 2)
Private Const maxMIXERCONTROLS As Integer = 32
Private Structure MIXERCONTROLS
<MarshalAs(UnmanagedType.B
Dim omc() As MIXERCONTROL ' one mixer control
End Structure
Private Structure MIXERCONTROL
Dim cbStruct As Integer ' size in Byte of MIXERCONTROL
Dim dwControlID As Integer ' unique control id for mixer device
Dim dwControlType As Integer ' MIXERCONTROL_CONTROLTYPE_x
Dim fdwControl As Integer ' MIXERCONTROL_CONTROLF_xxx
Dim cMultipleItems As Integer ' if MIXERCONTROL_CONTROLF_MULT
<MarshalAs(UnmanagedType.B
Dim szShortName As String
<MarshalAs(UnmanagedType.B
Dim szName As String
Dim Bounds0 As Integer : Dim Bounds1 As Integer : Dim Bounds2 As Integer : Dim Bounds3 As Integer : Dim Bounds4 As Integer : Dim Bounds5 As Integer
Dim Metrics0 As Integer : Dim Metrics1 As Integer : Dim Metrics2 As Integer : Dim Metrics3 As Integer : Dim Metrics4 As Integer : Dim Metrics5 As Integer
End Structure
Private Structure MIXERCONTROLDETAILS
Dim cbStruct As Integer ' size in Byte of MIXERCONTROLDETAILS
Dim dwControlID As Integer ' control id to get/set details on
Dim cChannels As Integer ' number of channels in paDetails array
Dim item As Integer ' hwndOwner or cMultipleItems
Dim cbDetails As Integer ' size of _one_ details_XX struct
Dim paDetails As IntPtr ' pointer to array of details_XX structs
End Structure
Private Structure Target ' for use in MIXERLINE and others (embedded structure)
Dim dwType As Integer ' MIXERLINE_TARGETTYPE_xxxx
Dim dwDeviceID As Integer ' target device ID of device type
Dim wMid As Short ' of target device
Dim wPid As Short ' "
Dim vDriverVersion As Integer ' "
<VBFixedString(MAXPNAMELEN
Public szPname() As Char
End Structure
Private Structure MIXERLINE
Dim cbStruct As Integer ' size of MIXERLINE structure
Dim dwDestination As Integer ' zero based destination index
Dim dwSource As Integer ' zero based source index (if source)
Dim dwLineID As Integer ' unique line id for mixer device
Dim fdwLine As Integer ' state/information about line
Dim dwUser As Integer ' driver specific information
Dim dwComponentType As Integer ' component type line connects to
Dim cChannels As Integer ' number of channels line supports
Dim cConnections As Integer ' number of connections (possible)
Dim cControls As Integer ' number of controls at this line
<VBFixedString(MIXER_SHORT
Public szShortName() As Char
<VBFixedString(MIXER_LONG_
Public szName() As Char
Dim tTarget As Target
End Structure
Private Structure MIXERLINECONTROLS
Dim cbStruct As Integer ' size in Byte of MIXERLINECONTROLS
Dim dwLineID As Integer ' line id (from MIXERLINE.dwLineID)
' union: MIXER_GETLINECONTROLSF_ONE
Dim dwControl As Integer ' MIXER_GETLINECONTROLSF_ONE
Dim cControls As Integer ' count of controls pmxctrl points to
Dim cbmxctrl As Integer ' size in Byte of _one_ MIXERCONTROL
Dim pamxctrl As IntPtr ' pointer to first MIXERCONTROL array
End Structure
Private Const maxPDATA As Integer = 64
Private Structure PDATAS
<MarshalAs(UnmanagedType.B
Dim pData() As Integer
End Structure
Private Declare Function mixerGetControlDetails Lib "winmm.dll" Alias "mixerGetControlDetailsA" (ByVal hmxobj As Integer, ByRef pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Integer) As Integer
Private Declare Function mixerGetLineControls Lib "winmm.dll" Alias "mixerGetLineControlsA" (ByVal hmxobj As Integer, ByRef pmxlc As MIXERLINECONTROLS, ByVal fdwControls As Integer) As Integer
Private Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoA" (ByVal hmxobj As Integer, ByRef pmxl As MIXERLINE, ByVal fdwInfo As Integer) As Integer
Private Declare Function mixerSetControlDetails Lib "winmm.dll" (ByVal hmxobj As Integer, ByRef pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Integer) As Integer
Public Function SetMicrophoneOK(ByRef DeviceID As Integer, Optional ByRef sError As String = "") As Boolean
' DeviceID usually = 0
'Dim pmxcaps As MIXERCAPS
Dim pmxl As MIXERLINE = Nothing
Dim pmxlc As MIXERLINECONTROLS
Dim pmxc As MIXERCONTROLS
Dim pmxcd As MIXERCONTROLDETAILS
Dim pdt As PDATAS
Dim rc, Index As Integer
Dim Text(63) As Byte
Dim MicIndex As Integer
'Get WaveIn Destination Number
pmxl.cbStruct = Marshal.SizeOf(pmxl)
pmxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DS
rc = mixerGetLineInfo(DeviceID,
If rc <> 0 Then GoTo Exception 'Error Trap
'Check For Microphone Source in that destination
For Index = 0 To pmxl.cConnections - 1
pmxl.dwSource = Index
rc = mixerGetLineInfo(DeviceID,
If rc <> 0 Then GoTo Exception 'Error Trap
If pmxl.dwComponentType = MIXERLINE_COMPONENTTYPE_SR
Next
'Adjust Recording Level of that Microphone
'ReDim pmxc.omc(pmxl.cControls - 1) would be better, but Marshaling allows only Fixed Length Arrays in structures. Hope 32 is enough
ReDim pmxc.omc(maxMIXERCONTROLS - 1)
pmxlc.cbStruct = Marshal.SizeOf(pmxlc)
pmxlc.dwLineID = pmxl.dwLineID
pmxlc.cControls = pmxl.cControls
pmxlc.cbmxctrl = Marshal.SizeOf(pmxc.omc(0)
pmxlc.pamxctrl = Marshal.AllocCoTaskMem(Mar
rc = mixerGetLineControls(Devic
If rc <> 0 Then GoTo Exception 'Error Trap
pmxc = CType(Marshal.PtrToStructu
Marshal.FreeCoTaskMem(pmxl
ReDim pdt.pData(maxPDATA)
For Index = LBound(pmxc.omc) To LBound(pmxc.omc) + pmxl.cControls - 1
If pmxc.omc(Index).dwControlT
'set its fader control to 75% of maximum
pmxcd.cbStruct = Marshal.SizeOf(pmxcd)
pmxcd.cChannels = 1
pmxcd.dwControlID = pmxc.omc(Index).dwControlI
pmxcd.cbDetails = Marshal.SizeOf(pdt.pData(0
pmxcd.paDetails = Marshal.AllocCoTaskMem(Mar
pdt.pData(0) = pmxc.omc(Index).Bounds1 * 0.75 ' zet volume op 75%
Marshal.StructureToPtr(pdt
rc = mixerSetControlDetails(Dev
Marshal.FreeCoTaskMem(pmxc
If rc <> 0 Then GoTo Exception 'Error Trap
ElseIf pmxc.omc(Index).dwControlT
'Set Boost/ACG/Incr/... to ON
pmxcd.cbStruct = Marshal.SizeOf(pmxcd)
pmxcd.cChannels = 1
pmxcd.dwControlID = pmxc.omc(Index).dwControlI
pmxcd.cbDetails = Marshal.SizeOf(pdt.pData(0
pmxcd.paDetails = Marshal.AllocCoTaskMem(Mar
pdt.pData(0) = 1 'On
Marshal.StructureToPtr(pdt
rc = mixerSetControlDetails(Dev
Marshal.FreeCoTaskMem(pmxc
If rc <> 0 Then GoTo Exception 'Error Trap
End If
Next
pmxl.cbStruct = Marshal.SizeOf(pmxl)
pmxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DS
rc = mixerGetLineInfo(DeviceID,
'ReDim pmxc.omc(pmxl.cControls - 1)
ReDim pmxc.omc(maxMIXERCONTROLS - 1)
pmxlc.cbStruct = Marshal.SizeOf(pmxlc)
pmxlc.dwLineID = pmxl.dwLineID
pmxlc.cControls = pmxl.cControls
pmxlc.cbmxctrl = Marshal.SizeOf(pmxc.omc(0)
pmxlc.pamxctrl = Marshal.AllocCoTaskMem(Mar
rc = mixerGetLineControls(Devic
If rc <> 0 Then GoTo Exception 'Error Trap
pmxc = CType(Marshal.PtrToStructu
Marshal.FreeCoTaskMem(pmxl
For Index = LBound(pmxc.omc) To LBound(pmxc.omc) + pmxl.cControls - 1
'set the microphone in multiple select to "selected"
If pmxc.omc(Index).dwControlT
'ReDim pdata(pmxc.omc(Index).cMul
ReDim pdt.pData(maxPDATA) ' Marshal allows Fixed length arrays in structures only
pmxcd.dwControlID = pmxc.omc(Index).dwControlI
pmxcd.item = pmxc.omc(Index).cMultipleI
pmxcd.paDetails = Marshal.AllocCoTaskMem(Mar
pdt.pData(pmxcd.item - MicIndex - 1) = 1 ' select microphone
Marshal.StructureToPtr(pdt
rc = mixerSetControlDetails(Dev
Marshal.FreeCoTaskMem(pmxc
If rc <> 0 Then GoTo Exception 'Error Trap
End If
Next
SetMicrophoneOK = True
Exit Function
Exception:
SetMicrophoneOK = False
End Function
End Modul
If Rubyn is still around to provide an explanation about how this code works, that would be great. I'm not a VB programmer but the code is readable anyway. The issue is more at the level of the system calls. It turns out that I'm attempting to perform this same function but the results are limited. For example, I'm having trouble selecting a USB microphone as it does not have a 'select' component associated with its line. Excuse me if I'm missing something obvious.
Private Const MAXPNAMELEN = 32 ' max product name length (including NULL)
Private Const MIXER_GETCONTROLDETAILSF_L
Private Const MIXER_GETCONTROLDETAILSF_Q
Private Const MIXER_GETCONTROLDETAILSF_V
Private Const MIXER_GETLINECONTROLSF_ALL
Private Const MIXER_GETLINECONTROLSF_ONE
Private Const MIXER_GETLINECONTROLSF_ONE
Private Const MIXER_GETLINECONTROLSF_QUE
Private Const MIXER_GETLINEINFOF_COMPONE
Private Const MIXER_GETLINEINFOF_DESTINA
Private Const MIXER_GETLINEINFOF_LINEID = &H2&
Private Const MIXER_GETLINEINFOF_QUERYMA
Private Const MIXER_GETLINEINFOF_SOURCE = &H1&
Private Const MIXER_GETLINEINFOF_TARGETT
Private Const MIXER_LONG_NAME_CHARS = 64
Private Const MIXER_SHORT_NAME_CHARS = 16
Private Const MIXER_OBJECTF_AUX = &H50000000
Private Const MIXER_OBJECTF_HANDLE = &H80000000
Private Const MIXER_OBJECTF_MIDIIN = &H40000000
Private Const MIXER_OBJECTF_MIDIOUT = &H30000000
Private Const MIXER_OBJECTF_MIXER = &H0&
Private Const MIXER_OBJECTF_WAVEIN = &H20000000
Private Const MIXER_OBJECTF_WAVEOUT = &H10000000
Private Const MIXER_OBJECTF_HMIDIIN = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_MIDIIN)
Private Const MIXER_OBJECTF_HMIDIOUT = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_MIDIOUT)
Private Const MIXER_OBJECTF_HMIXER = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_MIXER)
Private Const MIXER_OBJECTF_HWAVEIN = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_WAVEIN)
Private Const MIXER_OBJECTF_HWAVEOUT = (MIXER_OBJECTF_HANDLE Or MIXER_OBJECTF_WAVEOUT)
Private Const MIXER_SETCONTROLDETAILSF_C
Private Const MIXER_SETCONTROLDETAILSF_Q
Private Const MIXER_SETCONTROLDETAILSF_V
Private Const MIXERCONTROL_CONTROLF_DISA
Private Const MIXERCONTROL_CONTROLF_MULT
Private Const MIXERCONTROL_CONTROLF_UNIF
Private Const MIXERCONTROL_CT_CLASS_CUST
Private Const MIXERCONTROL_CT_CLASS_FADE
Private Const MIXERCONTROL_CT_CLASS_LIST
Private Const MIXERCONTROL_CT_CLASS_MASK
Private Const MIXERCONTROL_CT_CLASS_METE
Private Const MIXERCONTROL_CT_CLASS_NUMB
Private Const MIXERCONTROL_CT_CLASS_SLID
Private Const MIXERCONTROL_CT_CLASS_SWIT
Private Const MIXERCONTROL_CT_CLASS_TIME
Private Const MIXERCONTROL_CT_SC_LIST_MU
Private Const MIXERCONTROL_CT_SC_LIST_SI
Private Const MIXERCONTROL_CT_SC_METER_P
Private Const MIXERCONTROL_CT_SC_SWITCH_
Private Const MIXERCONTROL_CT_SC_SWITCH_
Private Const MIXERCONTROL_CT_SC_TIME_MI
Private Const MIXERCONTROL_CT_SC_TIME_MI
Private Const MIXERCONTROL_CT_SUBCLASS_M
Private Const MIXERCONTROL_CT_UNITS_BOOL
Private Const MIXERCONTROL_CT_UNITS_CUST
Private Const MIXERCONTROL_CT_UNITS_DECI
Private Const MIXERCONTROL_CT_UNITS_MASK
Private Const MIXERCONTROL_CT_UNITS_PERC
Private Const MIXERCONTROL_CT_UNITS_SIGN
Private Const MIXERCONTROL_CT_UNITS_UNSI
Private Const MIXERCONTROL_CONTROLTYPE_F
Private Const MIXERCONTROL_CONTROLTYPE_S
Private Const MIXERCONTROL_CONTROLTYPE_U
Private Const MIXERCONTROL_CONTROLTYPE_S
Private Const MIXERCONTROL_CONTROLTYPE_S
Private Const MIXERCONTROL_CONTROLTYPE_M
Private Const MIXERCONTROL_CONTROLTYPE_B
Private Const MIXERCONTROL_CONTROLTYPE_B
Private Const MIXERCONTROL_CONTROLTYPE_B
Private Const MIXERCONTROL_CONTROLTYPE_B
Private Const MIXERCONTROL_CONTROLTYPE_C
Private Const MIXERCONTROL_CONTROLTYPE_D
Private Const MIXERCONTROL_CONTROLTYPE_E
Private Const MIXERCONTROL_CONTROLTYPE_L
Private Const MIXERCONTROL_CONTROLTYPE_M
Private Const MIXERCONTROL_CONTROLTYPE_M
Private Const MIXERCONTROL_CONTROLTYPE_M
Private Const MIXERCONTROL_CONTROLTYPE_M
Private Const MIXERCONTROL_CONTROLTYPE_M
Private Const MIXERCONTROL_CONTROLTYPE_M
Private Const MIXERCONTROL_CONTROLTYPE_O
Private Const MIXERCONTROL_CONTROLTYPE_P
Private Const MIXERCONTROL_CONTROLTYPE_P
Private Const MIXERCONTROL_CONTROLTYPE_P
Private Const MIXERCONTROL_CONTROLTYPE_Q
Private Const MIXERCONTROL_CONTROLTYPE_S
Private Const MIXERCONTROL_CONTROLTYPE_S
Private Const MIXERCONTROL_CONTROLTYPE_T
Private Const MIXERCONTROL_CONTROLTYPE_U
Private Const MIXERCONTROL_CONTROLTYPE_V
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_DS
Private Const MIXERLINE_COMPONENTTYPE_DS
Private Const MIXERLINE_COMPONENTTYPE_DS
Private Const MIXERLINE_COMPONENTTYPE_DS
Private Const MIXERLINE_COMPONENTTYPE_DS
Private Const MIXERLINE_COMPONENTTYPE_DS
Private Const MIXERLINE_COMPONENTTYPE_DS
Private Const MIXERLINE_COMPONENTTYPE_DS
Private Const MIXERLINE_COMPONENTTYPE_DS
Private Const MIXERLINE_COMPONENTTYPE_DS
Private Const MIXERLINE_COMPONENTTYPE_DS
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_COMPONENTTYPE_SR
Private Const MIXERLINE_LINEF_ACTIVE = &H1&
Private Const MIXERLINE_LINEF_DISCONNECT
Private Const MIXERLINE_LINEF_SOURCE = &H80000000
Private Const MIXERLINE_TARGETTYPE_AUX = 5
Private Const MIXERLINE_TARGETTYPE_MIDII
Private Const MIXERLINE_TARGETTYPE_MIDIO
Private Const MIXERLINE_TARGETTYPE_UNDEF
Private Const MIXERLINE_TARGETTYPE_WAVEI
Private Const MIXERLINE_TARGETTYPE_WAVEO
Private Const MIXERR_BASE = 1024
Private Const MIXERR_INVALCONTROL = (MIXERR_BASE + 1)
Private Const MIXERR_INVALLINE = (MIXERR_BASE + 0)
Private Const MIXERR_INVALVALUE = (MIXERR_BASE + 2)
Private Const MIXERR_LASTERROR = (MIXERR_BASE + 2)
Private Type MIXERCAPS
wMid As Integer ' manufacturer id
wPid As Integer ' product id
vDriverVersion As Long ' version of the driver
szPname As String * MAXPNAMELEN ' product name
fdwSupport As Long ' misc. support bits
cDestinations As Long ' count of destinations
End Type
Private Type MIXERCONTROL
cbStruct As Long ' size in Byte of MIXERCONTROL
dwControlID As Long ' unique control id for mixer device
dwControlType As Long ' MIXERCONTROL_CONTROLTYPE_x
fdwControl As Long ' MIXERCONTROL_CONTROLF_xxx
cMultipleItems As Long ' if MIXERCONTROL_CONTROLF_MULT
szShortName(MIXER_SHORT_NA
szName(MIXER_LONG_NAME_CHA
Bounds(5) As Long ' Longest member of the Bounds union
Metrics(5) As Long ' Longest member of the Metrics union
End Type
Private Type MIXERCONTROLDETAILS
cbStruct As Long ' size in Byte of MIXERCONTROLDETAILS
dwControlID As Long ' control id to get/set details on
cChannels As Long ' number of channels in paDetails array
item As Long ' hwndOwner or cMultipleItems
cbDetails As Long ' size of _one_ details_XX struct
paDetails As Long ' pointer to array of details_XX structs
End Type
Private Type Target ' for use in MIXERLINE and others (embedded structure)
dwType As Long ' MIXERLINE_TARGETTYPE_xxxx
dwDeviceID As Long ' target device ID of device type
wMid As Integer ' of target device
wPid As Integer ' "
vDriverVersion As Long ' "
szPname As String * MAXPNAMELEN
End Type
Private Type MIXERLINE
cbStruct As Long ' size of MIXERLINE structure
dwDestination As Long ' zero based destination index
dwSource As Long ' zero based source index (if source)
dwLineID As Long ' unique line id for mixer device
fdwLine As Long ' state/information about line
dwUser As Long ' driver specific information
dwComponentType As Long ' component type line connects to
cChannels As Long ' number of channels line supports
cConnections As Long ' number of connections (possible)
cControls As Long ' number of controls at this line
szShortName As String * MIXER_SHORT_NAME_CHARS
szName As String * MIXER_LONG_NAME_CHARS
tTarget As Target
End Type
Private Type MIXERLINECONTROLS
cbStruct As Long ' size in Byte of MIXERLINECONTROLS
dwLineID As Long ' line id (from MIXERLINE.dwLineID)
' MIXER_GETLINECONTROLSF_ONE
dwControl As Long ' MIXER_GETLINECONTROLSF_ONE
cControls As Long ' count of controls pmxctrl points to
cbmxctrl As Long ' size in Byte of _one_ MIXERCONTROL
pamxctrl As Long ' pointer to first MIXERCONTROL array
End Type
Private Declare Function mixerClose Lib "winmm.dll" (ByVal hmx As Long) As Long
Private Declare Function mixerGetControlDetails Lib "winmm.dll" Alias "mixerGetControlDetailsA" (ByVal hmxobj As Long, pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Long) As Long
Private Declare Function mixerGetDevCaps Lib "winmm.dll" Alias "mixerGetDevCapsA" (ByVal uMxId As Long, ByVal pmxcaps As MIXERCAPS, ByVal cbmxcaps As Long) As Long
Private Declare Function mixerGetID Lib "winmm.dll" (ByVal hmxobj As Long, pumxID As Long, ByVal fdwId As Long) As Long
Private Declare Function mixerGetLineControls Lib "winmm.dll" Alias "mixerGetLineControlsA" (ByVal hmxobj As Long, pmxlc As MIXERLINECONTROLS, ByVal fdwControls As Long) As Long
Private Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoA" (ByVal hmxobj As Long, pmxl As MIXERLINE, ByVal fdwInfo As Long) As Long
Private Declare Function mixerGetNumDevs Lib "winmm.dll" () As Long
Private Declare Function mixerMessage Lib "winmm.dll" (ByVal hmx As Long, ByVal uMsg As Long, ByVal dwParam1 As Long, ByVal dwParam2 As Long) As Long
Private Declare Function mixerOpen Lib "winmm.dll" (phmx As Long, ByVal uMxId As Long, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal fdwOpen As Long) As Long
Private Declare Function mixerSetControlDetails Lib "winmm.dll" (ByVal hmxobj As Long, pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, ByVal Source As Long, ByVal length As Long)
Public Function SelectMicrophone(DeviceID As Long, Optional sError As String) As Boolean
Dim pmxcaps As MIXERCAPS, pmxl As MIXERLINE, pmxlc As MIXERLINECONTROLS, pmxc() As MIXERCONTROL, pmxcd As MIXERCONTROLDETAILS, pdata() As Long
Dim rc As Long, Index As Long, Text(63) As Byte, Msg As String, Str1 As String
Dim MicIndex As Long
On Error GoTo Exception
'Get WaveIn Destination Number
Let pmxl.cbStruct = Len(pmxl)
Let pmxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DS
Let rc = mixerGetLineInfo(DeviceID,
If rc <> 0 Then GoTo Exception 'Error Trap
'Check For Microphone Source in that distination
For Index = 0 To pmxl.cConnections - 1
Let pmxl.dwSource = Index
Let rc = mixerGetLineInfo(DeviceID,
If rc <> 0 Then GoTo Exception 'Error Trap
If pmxl.dwComponentType = MIXERLINE_COMPONENTTYPE_SR
Next
'Adjust Recording Level of that Microphone
ReDim pmxc(pmxl.cControls - 1)
Let pmxlc.cbStruct = Len(pmxlc)
Let pmxlc.dwLineID = pmxl.dwLineID
Let pmxlc.cControls = pmxl.cControls
Let pmxlc.cbmxctrl = Len(pmxc(0))
Let pmxlc.pamxctrl = VarPtr(pmxc(0))
Let rc = mixerGetLineControls(Devic
If rc <> 0 Then GoTo Exception 'Error Trap
For Index = LBound(pmxc) To UBound(pmxc)
'Check its fader control
If pmxc(Index).dwControlType = (pmxc(Index).dwControlType
ReDim pdata(0) As Long
Let pmxcd.cbStruct = Len(pmxcd)
Let pmxcd.cChannels = 1
Let pmxcd.dwControlID = pmxc(Index).dwControlID
Let pmxcd.cbDetails = Len(pdata(0))
Let pmxcd.paDetails = VarPtr(pdata(0))
Let pdata(0) = pmxc(Index).Bounds(1) * 0.75 'Max
Let rc = mixerSetControlDetails(Dev
If rc <> 0 Then GoTo Exception 'Error Trap
'Check Boost
ElseIf pmxc(Index).dwControlType = (pmxc(Index).dwControlType
ReDim pdata(0) As Long
Let pmxcd.cbStruct = Len(pmxcd)
Let pmxcd.cChannels = 1
Let pmxcd.dwControlID = pmxc(Index).dwControlID
Let pmxcd.cbDetails = Len(pdata(0))
Let pmxcd.paDetails = VarPtr(pdata(0))
Let pdata(0) = 1 'On
Let rc = mixerSetControlDetails(Dev
If rc <> 0 Then GoTo Exception 'Error Trap
End If
Next
Let pmxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DS
Let rc = mixerGetLineInfo(DeviceID,
ReDim pmxc(pmxl.cControls - 1)
Let pmxlc.dwLineID = pmxl.dwLineID
Let pmxlc.cControls = pmxl.cControls
Let pmxlc.pamxctrl = VarPtr(pmxc(0))
Let rc = mixerGetLineControls(Devic
If rc <> 0 Then GoTo Exception 'Error Trap
For Index = LBound(pmxc) To UBound(pmxc)
'Check its multiple select
If pmxc(Index).dwControlType = (pmxc(Index).dwControlType
ReDim pdata(pmxc(Index).cMultipl
Let pmxcd.dwControlID = pmxc(Index).dwControlID
Let pmxcd.item = pmxc(Index).cMultipleItems
Let pmxcd.paDetails = VarPtr(pdata(0))
Let pdata(pmxcd.item - MicIndex - 1) = 1
Let rc = mixerSetControlDetails(Dev
If rc <> 0 Then GoTo Exception 'Error Trap
End If
Next
Let SelectMicrophone = True
Exit Function
Exception:
End Function