C# 从DirectSoundEnumerate返回的播放设备的顺序

C# 从DirectSoundEnumerate返回的播放设备的顺序,c#,directsound,C#,Directsound,在我的应用程序中,我想让用户有机会选择要用于播放给定mp3文件的声音设备。 使用 问题是: 设备列表中声音设备的顺序与windows中的设备顺序不同 windows下的设备顺序为: {扬声器(Realtek高清音频)、Realtek声卡频道(1)、Realtek声卡频道(2)、Realtek声卡频道(3)、Realtek声卡频道(4)、Realtek声卡频道(5)} 如果调用方法PlaySound(4);它将在realtek声卡频道(4)上播放mp3 因此,如果我选择DeviceNumber=1

在我的应用程序中,我想让用户有机会选择要用于播放给定mp3文件的声音设备。 使用

问题是: 设备列表中声音设备的顺序与windows中的设备顺序不同

windows下的设备顺序为: {扬声器(Realtek高清音频)、Realtek声卡频道(1)、Realtek声卡频道(2)、Realtek声卡频道(3)、Realtek声卡频道(4)、Realtek声卡频道(5)}

如果调用方法PlaySound(4);它将在realtek声卡频道(4)上播放mp3

因此,如果我选择DeviceNumber=1(指我的设备列表中的第二个设备),它就不是windows中索引为1的设备

我的问题是: 如何在我的设备列表中对设备进行排序,使它们与windows下的相同排序相匹配,以便从列表中选择正确的声音设备? 音响设备通常是如何分类的

非常感谢你的帮助


提前感谢

当您有NAudio时,为什么要使用
DllImport

DirectSound设备由GUID而不是索引标识。它们的顺序是不确定的,您无法对它们进行排序

要使用DirectSound选择特定设备,可以调用静态DirectSoundOut.Devices属性,该属性将使您获得每个设备的GUID,您可以将GUID传递到DirectSoundOut构造函数中


当您有NAudio时,为什么要使用
DllImport

DirectSound设备由GUID而不是索引标识。它们的顺序是不确定的,您无法对它们进行排序

要使用DirectSound选择特定设备,可以调用静态DirectSoundOut.Devices属性,该属性将使您获得每个设备的GUID,您可以将GUID传递到DirectSoundOut构造函数中

[DllImport("dsound.dll", EntryPoint = "DirectSoundEnumerateA", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        static extern void DirectSoundEnumerate(DSEnumCallback lpDSEnumCallback, IntPtr lpContext);

private static List<DirectSoundDeviceInfo> devices;
var devicesList = new List<DirectSoundDeviceInfo>();
DirectSoundEnumerate(new DSEnumCallback(EnumCallback), IntPtr.Zero);
public void PlaySound(int deviceNumber)
        {
            //disposeWave();// stop previous sounds before starting
            var waveReader = new NAudio.Wave.Mp3FileReader("Kalimba.mp3");
            var waveOut = new NAudio.Wave.WaveOut();
            waveOut.DeviceNumber = deviceNumber;
            var output = waveOut;
            output.Init(waveReader);
            output.Play();
        }