2009-01-01 61 views
6

新年快乐! 我的问题是如何检查麦克风和扬声器是否来自Windows平台上的同一个声卡。如果它们来自不同的卡片,那么处理时间的逻辑将会不同。我正在使用DSound和WMME API。 在此先感谢。如何检查麦克风和扬声器是否来自同一张声卡?

问候, 云

+0

你能否详细说明你的问题多一点? 你是否拥有这些设备的手柄,还是从其他没有源头的组件传递过来? 你打算用扬声器和麦克风做什么?音频板的模拟输出和输入只有或模拟/数字有重要意义? – Manuel 2009-01-02 18:45:37

回答

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 

我不知道如果有什么事,有没有什么帮助。这是一个棘手的问题。

0

千万不要使用WMI(此处无所作为) 使用MM apis。

1

假设您有输入和输出设备的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; 
    } 
相关问题