2009-01-01 131 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; 
    } 
相關問題