2009-01-01 7 views
6

Bonne année! Ma question est comment vérifier si un microphone et un haut-parleur proviennent de la même carte son sur la plate-forme Windows. Si elles proviennent de cartes différentes, la logique de gestion du timing sera différente. J'utilise DSound et l'API WMME. Merci d'avance.Comment vérifier si un microphone et un haut-parleur proviennent de la même carte son?

salutations, Yun

+0

Pouvez-vous préciser votre question un peu plus? Possédez-vous les poignées de ces périphériques ou sont-elles transmises par un autre composant dont vous ne possédez pas les sources? Qu'entendez-vous avec haut-parleur et micro? La sortie analogique de la carte audio et l'entrée uniquement ou analogique/numérique a-t-elle de l'importance? – Manuel

Répondre

1

WMI ne donne des informations sur les cartes son. Ce que je n'ai pas encore pu découvrir c'est si c'est donner assez. L'utilisation de « WMI Code Creator » les listes de script suivant tout ce que les magasins d'objets 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 

Courir sur mon ordinateur portable qui donne

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

Je ne sais pas s'il y a quelque chose là-dedans qui aide. C'est une question difficile.

0

N'utilisez jamais WMI (rien à faire ici) Utilisez MM apis.

1

En supposant que vous ayez l'ID des périphériques d'entrée et de sortie, vous pouvez utiliser quelque chose comme ce qui suit pour obtenir les ID de mixage correspondants. Si les deux sont identiques, les deux sont attachés au même mélangeur, et font très probablement partie du même matériel physique.

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

Si vous avez seulement le nom du périphérique d'entrée, vous pouvez utiliser quelque chose comme ce qui suit pour trouver l'appareil 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; 
    } 
Questions connexes