如何以编程方式获取计算机的录音设备列表?

4
我正试图以编程方式获取计算机的录音设备列表,然后更改默认设置。我已经在下面的代码中成功地通过播放设备实现了这一点,但是我希望也能够做到这一点并且更改录音设备。下面是代码返回的设备列表: 这是下面的代码返回的设备列表
以下是我想要查看和更改的设备: 这些是我想要查看和更改的设备
class Program
{
    static void Main(string[] args)
    {
        MMDeviceEnumerator DevEnum = new MMDeviceEnumerator();
        MMDeviceCollection devices = DevEnum.EnumerateAudioEndPoints(EDataFlow.eRender, EDeviceState.DEVICE_STATE_ACTIVE);
        MMDevice DefaultDevice = DevEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);
        MMDevice SecondaryDevice = null;
        PolicyConfigClient client = new PolicyConfigClient();

        Console.WriteLine("-----------------------------------");
        Console.WriteLine("List of devices");
        Console.WriteLine("-----------------------------------");
        for (int i = 1; i < devices.Count; i++)
        { 
            if (devices[i].ID != DefaultDevice.ID)
            {
                SecondaryDevice = devices[i];
            }
            Console.WriteLine(devices[i].FriendlyName);
            Console.ReadLine();
        }

        Console.WriteLine("Default Device");
        Console.WriteLine("-----------------------------------");
        Console.WriteLine(DefaultDevice.FriendlyName);
        Console.ReadLine();

        Console.WriteLine("Secondary Device");
        Console.WriteLine("-----------------------------------");
        Console.WriteLine(SecondaryDevice.FriendlyName);
        Console.ReadLine();


        client.SetDefaultEndpoint(SecondaryDevice.ID, ERole.eCommunications);
        client.SetDefaultEndpoint(SecondaryDevice.ID, ERole.eMultimedia);
        client.SetDefaultEndpoint(SecondaryDevice.ID, ERole.eConsole);

        DefaultDevice = DevEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);

        Console.WriteLine("New Default Device");
        Console.WriteLine("-----------------------------------");
        Console.WriteLine(DefaultDevice.FriendlyName);
        Console.ReadLine();
    }
}

5
应使用 EDataFlow.eCapture 而不是 EDataFlow.eRender - Chetan
1
那个已经起作用了,谢谢。 - danfs
你可以实现这个功能的方式取决于你要遵循哪个API。比如说,WPF和UWP以及Net Core之间会有所不同。请问你的目标NET框架是什么? - Yury Schkatula
1个回答

3
要实现这个功能,如评论中所述,需要使用EDataFlow.eCapture而不是EDataFlow.eRender。以下是修订后的工作代码:
class Program
{
    static void Main(string[] args)
    {
        MMDeviceEnumerator DevEnum = new MMDeviceEnumerator();
        MMDeviceCollection devices = DevEnum.EnumerateAudioEndPoints(EDataFlow.eCapture, EDeviceState.DEVICE_STATE_ACTIVE);
        MMDevice DefaultDevice = DevEnum.GetDefaultAudioEndpoint(EDataFlow.eCapture, ERole.eMultimedia);
        MMDevice SecondaryDevice = null;
        PolicyConfigClient client = new PolicyConfigClient();

        Console.WriteLine("-----------------------------------");
        Console.WriteLine("List of sound cards installed");
        Console.WriteLine("-----------------------------------");
        for (int i = 0; i < devices.Count; i++)
        { 
            if (devices[i].ID != DefaultDevice.ID)
            {
                SecondaryDevice = devices[i];
            }
            Console.WriteLine(devices[i].FriendlyName);
            Console.ReadLine();
        }

        Console.WriteLine("Default Device");
        Console.WriteLine("-----------------------------------");
        Console.WriteLine(DefaultDevice.FriendlyName);
        Console.ReadLine();

        Console.WriteLine("Secondary Device");
        Console.WriteLine("-----------------------------------");
        Console.WriteLine(SecondaryDevice.FriendlyName);
        Console.ReadLine();


        client.SetDefaultEndpoint(SecondaryDevice.ID, ERole.eCommunications);
        client.SetDefaultEndpoint(SecondaryDevice.ID, ERole.eMultimedia);
        client.SetDefaultEndpoint(SecondaryDevice.ID, ERole.eConsole);

        DefaultDevice = DevEnum.GetDefaultAudioEndpoint(EDataFlow.eCapture, ERole.eMultimedia);

        Console.WriteLine("New Default Device");
        Console.WriteLine("-----------------------------------");
        Console.WriteLine(DefaultDevice.FriendlyName);
        Console.ReadLine();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接