如何检查麦克风和扬声器是不是来自同一声卡?

Posted

技术标签:

【中文标题】如何检查麦克风和扬声器是不是来自同一声卡?【英文标题】:How to check if a microphone and a speaker are from the same sound card?如何检查麦克风和扬声器是否来自同一声卡? 【发布时间】:2010-09-29 03:11:22 【问题描述】:

我的问题是如何在 Windows 平台上检查麦克风和扬声器是否来自同一个声卡。如果它们来自不同的卡,那么处理时间的逻辑就会不同。我同时使用 DSound 和 WMME API。

【问题讨论】:

您能否详细说明您的问题?您是否拥有这些设备的句柄,或者这些句柄是从您不拥有源的其他组件传递过来的?你打算用扬声器和麦克风做什么?音频板仅模拟输出和输入或模拟/数字重要吗? 【参考方案1】:

WMI 确实提供了一些有关声卡的信息。我还没有发现的是它的付出是否足够。以下脚本使用“WMI Code Creator”列出了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

我不知道里面有没有什么有用的。这是一个棘手的问题。

【讨论】:

【参考方案2】:

假设您有输入和输出设备的 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;
    

【讨论】:

【参考方案3】:

从不使用 WMI(此处无事可做) 使用 MM api。

【讨论】:

以上是关于如何检查麦克风和扬声器是不是来自同一声卡?的主要内容,如果未能解决你的问题,请参考以下文章

关于电脑声卡的问题

如何防止在同一台电脑上从麦克风到扬声器的回声

如何将输入从一个声卡重定向到另一个?

来自麦克风的声音与来自扬声器的声音

win10电脑麦克风没声音

Web Audio Api 与 Web Speech Api 集成 - 将扬声器/声卡输出流式传输到语音识别 api