【问题标题】:How to enumerate audio out devices in c#如何在 C# 中枚举音频输出设备
【发布时间】:2009-10-06 12:34:10
【问题描述】:

我想知道如何获取机器上已安装音频输出设备 (waveOut) 的列表

操作系统:Windows(XP、Vista、7) 框架:.Net 3.5 语言:c#

在遍历此列表时,我想获取每个设备的标识符、制造商等信息。

有什么提示吗?

【问题讨论】:

    标签: c# windows


    【解决方案1】:

    这是使用 WMI(参考 System.Management)在 C# 中枚举音频设备的代码。

        ManagementObjectSearcher objSearcher = new ManagementObjectSearcher(
               "SELECT * FROM Win32_SoundDevice");
    
        ManagementObjectCollection objCollection = objSearcher.Get();
    
        foreach (ManagementObject obj in objCollection)
        {
            foreach (PropertyData property in obj.Properties)
            {
                Console.Out.WriteLine(String.Format("{0}:{1}", property.Name, property.Value));
            }
        }
    

    这导致输出如下:

    可用性: 标题:USB音频设备 配置管理器错误代码:0 配置管理器用户配置:假 CreationClassName:Win32_SoundDevice 描述:USB音频设备 设备ID:USB\VID_047F&PID_0CA1&MI_00\6&2C037688&0&0000 DMA缓冲区大小: 错误清除: 错误描述: 安装日期: 最后错误代码: 制造商:(通用 USB 音频) MPU401地址: 名称:USB音频设备 PNPDeviceID:USB\VID_047F&PID_0CA1&MI_00\6&2C037688&0&0000 电源管理功能: 电源管理支持:假 产品名称:USB音频设备 状态:OK 状态信息:3 SystemCreationClassName:Win32_ComputerSystem 系统名称: 可用性: 标题:Realtek AC'97 Audio for VIA (R) Audio Controller 配置管理器错误代码:0 配置管理器用户配置:假 CreationClassName:Win32_SoundDevice 描述:Realtek AC'97 Audio for VIA (R) Audio Controller 设备ID:PCI\VEN_1106&DEV_3059&SUBSYS_09011558&REV_60\3&61AAA01&1&8D DMA缓冲区大小: 错误清除: 错误描述: 安装日期: 最后错误代码: 制造商:瑞昱 MPU401地址: 名称:Realtek AC'97 Audio for VIA (R) Audio Controller PNPDeviceID:PCI\VEN_1106&DEV_3059&SUBSYS_09011558&REV_60\3&61AAA01&1&8D 电源管理功能: 电源管理支持:假 产品名称:Realtek AC'97 Audio for VIA (R) Audio Controller 状态:OK 状态信息:3 SystemCreationClassName:Win32_ComputerSystem 系统名称: 可用性:

    令人讨厌的是,WMI 似乎无法简单地区分音频的输入和输出设备。但是,使用 DirectSound 的托管接口和 DevicesCollection 类,如下所示(参考 Microsoft.DirectX.DirectSound),我们可以获得更多面向声音的信息。

            DevicesCollection devColl = new DevicesCollection();
            foreach (DeviceInformation devInfo in devColl)
            {
                Device dev = new Device(devInfo.DriverGuid);   
    
                //use dev.Caps, devInfo to access a fair bit of info about the sound device
            }
    

    【讨论】:

    • 您知道是否可以获取某个音频设备的插孔信息吗?
    • 我不确定,也许看看msdn.microsoft.com/en-us/library/windows/desktop/… - 只是在黑暗中刺伤。
    • 托管 DirectX 已被弃用一段时间。
    • 现在我有了设备,如何开始收听呢?
    【解决方案2】:

    在 Windows Vista 及更高版本中,您可以使用 IMMDeviceEnumerator 为您包装的 NAudio 以枚举音频端点设备。例如:

    var enumerator = new MMDeviceEnumerator();
    foreach (var endpoint in 
             enumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active))
    {
        Console.WriteLine(endpoint.FriendlyName);
    }
    

    【讨论】:

    • 您知道是否可以获取某个音频设备的插孔信息吗?
    【解决方案3】:

    这是一个例子

    添加对 System.Management 的引用

    ManagementObjectSearcher mo = new ManagementObjectSearcher("select * from Win32_SoundDevice");
    
    foreach (ManagementObject soundDevice in mo.Get())
    {
         Console.WriteLine(soundDevice.GetPropertyValue("DeviceId"));
         Console.WriteLine(soundDevice.GetPropertyValue("Manufacturer"));
         // etc                       
    } 
    

    【讨论】:

      【解决方案4】:
              /// <summary>
              /// The DirectSoundEnumerate function enumerates the DirectSound Odrivers installed in the system.
              /// </summary>
              /// <param name="lpDSEnumCallback">callback function</param>
              /// <param name="lpContext">User context</param>
              [DllImport("dsound.dll", EntryPoint = "DirectSoundEnumerateA", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
              static extern void DirectSoundEnumerate(DevicesEnumCallback lpDSEnumCallback, IntPtr lpContext);
      

      回调应该是这样的:

        private static bool DevicesEnumCallbackHandler(IntPtr lpGuid, IntPtr lpcstrDescription, IntPtr lpcstrModule, IntPtr lpContext)
      

      【讨论】:

        【解决方案5】:

        检查 waveOutGetNumDevs API

        [DllImport("winmm.dll", SetLastError = true)]
        public static extern uint waveOutGetNumDevs();
        

        返回设备的数量。返回值为零表示不存在任何设备或发生错误。 http://msdn.microsoft.com/en-us/library/dd743860(v=vs.85).aspx

        【讨论】:

        • 这只会给你设备的数量。你如何列举它们?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        相关资源
        最近更新 更多