2009-01-01 8 views
6

Frohes neues Jahr! Meine Frage ist, wie man überprüft, ob ein Mikrofon und ein Lautsprecher von der gleichen Soundkarte auf Windows-Plattform sind. Wenn sie von verschiedenen Karten stammen, wird die Logik zur Handhabung des Timings unterschiedlich sein. Ich benutze sowohl DSound als auch WMME API. Vielen Dank im Voraus.Wie überprüft man, ob ein Mikrofon und ein Lautsprecher von derselben Soundkarte stammen?

Grüßen, Yun

+0

Könnten Sie Ihre Frage ein wenig näher erläutern? Besitzen Sie die Handles zu diesen Geräten oder werden diese von einer anderen Komponente weitergegeben, deren Quellen Sie nicht besitzen? Was haben Sie mit Lautsprecher und Mikrofon vor? Die Audio-Platine analogen Ausgang und nur Eingang oder analog/digital hat Bedeutung? – Manuel

Antwort

1

WMI einige Informationen über Soundkarten nicht geben. Was ich noch nicht herausfinden konnte, ist, ob es genug gibt. Mit „WMI Code Creator“ das folgende Skript enthält alles, was das Win32_SoundDevice Objekt speichert:

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 

Laufen, dass auf meinem Laptop gibt

----------------------------------- 
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 

Ich weiß nicht, ob es etwas drin, das hilft. Es ist eine schwierige Frage.

0

Verwenden Sie niemals WMI (nichts zu tun) Verwenden Sie MM Apis.

1

Angenommen, Sie haben die ID der Eingabe- und Ausgabegeräte, können Sie wie folgt die entsprechenden Mixer-IDs verwenden. Wenn beide gleich sind, sind beide an den gleichen Mischer angeschlossen und höchstwahrscheinlich Teil derselben physischen Hardware.

/// <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; 
    } 

Wenn Sie nur den Namen für das Eingabegerät haben, können Sie so etwas wie die folgenden finden Sie die Geräte-ID verwenden:

/// <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; 
    }