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

PC にインストールされているすべてのサウンド デバイスのリストを取得しています。みたいな感じ:

{プライマリ サウンド ドライバー、スピーカー (Realtek ハイ デフィニション オーディオ)、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 の下のデバイスの順序は次のとおりです。 {スピーカー (Realtek High Definition Audio)、realtek サウンド カード チャネル (1)、realtek サウンド カード チャネル (2)、realtek サウンド カード チャネル (3)、realtek サウンド カード チャネル (4)、 realtek サウンド カード チャネル (5)}

メソッド PlaySound(4) を呼び出す場合。Realtekサウンドカードチャンネルでmp3を再生します(4)

したがって、DeviceNumber = 1 (deviceList の 2 番目のデバイスを参照) を選択すると、Windows でインデックス 1 を持つデバイスと同じではありません。

私の質問は、リストから正しいサウンドデバイスを選択できるように、デバイスリストでデバイスを並べ替えて、Windows で同じ並べ替えに一致させるにはどうすればよいですか? サウンドデバイスは通常どのように分類されていますか?

どんな助けでも本当に感謝しています..

前もって感謝します

4

1 に答える 1

1

DllImportNAudioがあるのに、なぜ使用しているのですか??

DirectSound デバイスは、インデックスではなく、GUID によって識別されます。それらの順序は不定であり、並べ替えることはできません。

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

DirectSound で特定のデバイスを選択するには、DirectSoundOut コンストラクターに渡すことができる各デバイスの GUID を取得できる静的な DirectSoundOut.Devices プロパティを呼び出すことができます。

于 2013-12-06T13:04:53.317 に答える