[英]How to check if a microphone and a speaker are from the same sound card?
我的問題是如何檢查麥克風和揚聲器是否來自Windows平台上的同一聲卡。 如果它們來自不同的卡,則處理時序的邏輯將是不同的。 我正在使用DSound和WMME API。
WMI確實提供了有關聲卡的一些信息。 我還沒有發現的是它是否給予足夠的支持。 使用“ WMI代碼創建器 ”,以下腳本列出了Win32_SoundDevice對象存儲的所有內容:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_SoundDevice",,48)
For Each objItem in colItems
Wscript.Echo "-----------------------------------"
Wscript.Echo "Win32_SoundDevice instance"
Wscript.Echo "-----------------------------------"
Wscript.Echo "Availability: " & objItem.Availability
Wscript.Echo "Caption: " & objItem.Caption
Wscript.Echo "ConfigManagerErrorCode: " & objItem.ConfigManagerErrorCode
Wscript.Echo "ConfigManagerUserConfig: " & objItem.ConfigManagerUserConfig
Wscript.Echo "CreationClassName: " & objItem.CreationClassName
Wscript.Echo "Description: " & objItem.Description
Wscript.Echo "DeviceID: " & objItem.DeviceID
Wscript.Echo "DMABufferSize: " & objItem.DMABufferSize
Wscript.Echo "ErrorCleared: " & objItem.ErrorCleared
Wscript.Echo "ErrorDescription: " & objItem.ErrorDescription
Wscript.Echo "InstallDate: " & objItem.InstallDate
Wscript.Echo "LastErrorCode: " & objItem.LastErrorCode
Wscript.Echo "Manufacturer: " & objItem.Manufacturer
Wscript.Echo "MPU401Address: " & objItem.MPU401Address
Wscript.Echo "Name: " & objItem.Name
Wscript.Echo "PNPDeviceID: " & objItem.PNPDeviceID
If isNull(objItem.PowerManagementCapabilities) Then
Wscript.Echo "PowerManagementCapabilities: "
Else
Wscript.Echo "PowerManagementCapabilities: " & Join(objItem.PowerManagementCapabilities, ",")
End If
Wscript.Echo "PowerManagementSupported: " & objItem.PowerManagementSupported
Wscript.Echo "ProductName: " & objItem.ProductName
Wscript.Echo "Status: " & objItem.Status
Wscript.Echo "StatusInfo: " & objItem.StatusInfo
Wscript.Echo "SystemCreationClassName: " & objItem.SystemCreationClassName
Wscript.Echo "SystemName: " & objItem.SystemName
Next
在我的筆記本電腦上運行它
-----------------------------------
Win32_SoundDevice instance
-----------------------------------
Availability:
Caption: ATI Function Driver for High Definition Audio - ATI AA01
ConfigManagerErrorCode: 0
ConfigManagerUserConfig: False
CreationClassName: Win32_SoundDevice
Description: ATI Function Driver for High Definition Audio - ATI AA01
DeviceID: HDAUDIO\FUNC_01&VEN_1002&DEV_AA01&SUBSYS_00AA0100&REV_1000\5&BB7E0F3&0&0001
DMABufferSize:
ErrorCleared:
ErrorDescription:
InstallDate:
LastErrorCode:
Manufacturer: ATI
MPU401Address:
Name: ATI Function Driver for High Definition Audio - ATI AA01
PNPDeviceID: HDAUDIO\FUNC_01&VEN_1002&DEV_AA01&SUBSYS_00AA0100&REV_1000\5&BB7E0F3&0&0001
PowerManagementCapabilities:
PowerManagementSupported: False
ProductName: ATI Function Driver for High Definition Audio - ATI AA01
Status: OK
StatusInfo: 3
SystemCreationClassName: Win32_ComputerSystem
SystemName: BABEL
-----------------------------------
Win32_SoundDevice instance
-----------------------------------
Availability:
Caption: Conexant High Definition SmartAudio 221
ConfigManagerErrorCode: 0
ConfigManagerUserConfig: False
CreationClassName: Win32_SoundDevice
Description: Conexant High Definition SmartAudio 221
DeviceID: HDAUDIO\FUNC_01&VEN_14F1&DEV_5051&SUBSYS_1179FF5B&REV_1000\4&2DBDAC14&0&0001
DMABufferSize:
ErrorCleared:
ErrorDescription:
InstallDate:
LastErrorCode:
Manufacturer: Conexant
MPU401Address:
Name: Conexant High Definition SmartAudio 221
PNPDeviceID: HDAUDIO\FUNC_01&VEN_14F1&DEV_5051&SUBSYS_1179FF5B&REV_1000\4&2DBDAC14&0&0001
PowerManagementCapabilities:
PowerManagementSupported: False
ProductName: Conexant High Definition SmartAudio 221
Status: OK
StatusInfo: 3
SystemCreationClassName: Win32_ComputerSystem
SystemName: BABEL
我不知道那里有什么東西有幫助。 這是一個棘手的問題。
假設您擁有輸入和輸出設備的ID,您可以使用以下內容來獲取相應的混音器ID。 如果兩者相同,則兩者都連接到同一個混音器,並且很可能是同一物理硬件的一部分。
/// <summary>
/// Get the ID of the mixer associated with the given input device ID
/// Returns -1 if no such mixer can be found
/// </summary>
static public int GetMixerIdInput(int inputId)
{
int mixerId = -1;
int result = MmeMixerApi.mixerGetID(inputId, ref mixerId, MIXER_OBJECTFLAG.WAVEIN);
if (((MMError)result != MMError.MMSYSERR_NOERROR) &&
((MMError)result != MMError.MMSYSERR_NODRIVER))
{
throw new MmeException((MMError)result);
}
return mixerId;
}
/// <summary>
/// Get the ID of the mixer associated with the given output device ID
/// Returns -1 if no such mixer can be found
/// </summary>
static public int GetMixerIdOutput(int outputId)
{
int mixerId = -1;
int result = MmeMixerApi.mixerGetID(outputId, ref mixerId, MIXER_OBJECTFLAG.WAVEOUT);
if (((MMError)result != MMError.MMSYSERR_NOERROR) &&
((MMError)result != MMError.MMSYSERR_NODRIVER))
{
throw new MmeException((MMError)result);
}
return mixerId;
}
如果您只有輸入設備的名稱,則可以使用以下內容查找設備ID:
/// <summary>
/// Find the ID of the input device given a name
/// </summary>
static public int GetWaveInputId(string name)
{
int id = MmeWaveApi.WAVE_MAPPER;
int devCount = MmeWaveApi.waveInGetNumDevs();
WAVEINCAPS caps = new WAVEINCAPS();
for (int dev = 0; (dev < devCount) && (id == MmeWaveApi.WAVE_MAPPER); dev++)
{
int result = MmeWaveApi.waveInGetDevCaps(dev, ref caps, Marshal.SizeOf(caps));
if ((MMError)result == MMError.MMSYSERR_NOERROR)
{
if (string.Compare(name, 0, caps.szPname, 0, Math.Min(name.Length, caps.szPname.Length)) == 0)
{
id = dev;
}
}
}
return id;
}
永遠不要使用WMI(此處無所事事)使用MM apis。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.