1

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

[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);

我正在获取我的电脑上安装的所有声音设备的列表。喜欢:

{Primary Sound Driver, Speakers (Realtek High Definition Audio), realtek 声卡通道(5), realtek 声卡通道(2), realtek 声卡通道(1), realtek 声卡通道(3), realtek 声卡通道( 4)}

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

现在播放 mp3 文件,我正在使用 naudio。

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();
        }

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

windows下设备的顺序为:{Speakers(Realtek High Definition Audio)、realtek声卡通道(1)、realtek声卡通道(2)、realtek声卡通道(3)、realtek声卡通道(4)、 realtek 声卡频道(5)}

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

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

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

任何帮助都非常感谢..

提前致谢

4

1 回答 1

1

DllImport当你有 NAudio的时候你为什么要使用?

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

http://mark-dot-net.blogspot.de/2011/05/naudio-audio-output-devices.html

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

于 2013-12-06T13:04:53.317 回答