Play a sound in a specific device with C#
<p>My problem is if I want to create 3 buttons and I have 3 sound cards and each button is related to a sound card (for example button1 is related to sound card1 ...)and when I click on button1 I want to hear sound from the speaker wich is related to sound card1 (the same for button2 and button3.</p>

<p>My friends gave me two codes: the first use Naudio it works but worked for I still cant play sound in the three sound cards,I mean only one sound card work when I install the three sound cards,It's like the programm is allways choising a default audio card from the three external sound cards.</p>

<p>The second use DirectX and it works for me but I didn't understand how he call the device number,I mean in the code which use NAudio there is "devicenumber= 1 for example",I need to know how because i'll spicifie a device for each button (for example when I click on button1 the sound will be played in sound card1)?</p>

<p>I want to know how we can correct one of the two codes and how can I specifie a "Device " in the second code,cab you help me please??</p>

<p>This is the Code of Form2 (from the project which use NAudio) you can notices how it specifie a device for each button but unfortunately it cause the problem mentionned:</p>

<pre><code>using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NAudio.Wave;
using NAudio.CoreAudioApi;
namespace AudioWithNAudio
{
    public partial class Form2 : Form
    {
        string fileName = null;
        WaveOut wave = null;
        private NAudio.Wave.WaveFileReader waveReader = null;
        private NAudio.Wave.DirectSoundOut output = null;

        public Form2()
        {
            InitializeComponent();
        }
        private void Form2_Load(object sender, EventArgs e)
        {
            hideButtons();
             fileName = ("alarm.wav");
             detectDevices();          

        }
        public void hideButtons()
        {

            bttnAudioDevice1.Visible = false;
            bttnAudioDevice2.Visible = false;
            bttnAudioDevice3.Visible = false;
            bttnAudioDevice4.Visible = false;
            bttnAudioDevice5.Visible = false;
        }
        public void detectDevices()
        {
            int waveOutDevices = WaveOut.DeviceCount;
            switch (waveOutDevices)
            {
                case 1:
                    bttnAudioDevice1.Visible = true;
                    break;
                case 2:
                    bttnAudioDevice2.Visible = true;
                    bttnAudioDevice1.Visible = true;
                    break;
                case 3:
                      bttnAudioDevice2.Visible = true;
                    bttnAudioDevice1.Visible = true;
                    bttnAudioDevice3.Visible = true;
                    break;
                case 4:
                         bttnAudioDevice2.Visible = true;
                    bttnAudioDevice1.Visible = true;
                    bttnAudioDevice3.Visible = true;
                    bttnAudioDevice4.Visible = true;
                    break;
                case 5:
                            bttnAudioDevice2.Visible = true;
                    bttnAudioDevice1.Visible = true;
                    bttnAudioDevice3.Visible = true;
                    bttnAudioDevice4.Visible = true;
                    bttnAudioDevice5.Visible = true;
                    break;
            }
        }
        private void bttnAudioDevice1_Click(object sender, EventArgs e)
        {
            wave = new WaveOut();
            wave.DeviceNumber = 0;
            playSound();
        }
        private void bttnAudioDevice2_Click(object sender, EventArgs e)
        {
            wave = new WaveOut();
            wave.DeviceNumber = 1;
            playSound();
        }
        private void bttnAudioDevice3_Click(object sender, EventArgs e)
        {
            wave.DeviceNumber = 2;
            playSound();
        }
        private void bttnAudioDevice4_Click(object sender, EventArgs e)
        {
            wave.DeviceNumber = 3;
            playSound();
        }
        private void bttnAudioDevice5_Click(object sender, EventArgs e)
        {
            wave.DeviceNumber = 4;
            playSound();
        }
        public void playSound()
        {
            disposeWave();// stop previous sounds before starting
            waveReader = new NAudio.Wave.WaveFileReader(fileName);
            output = new NAudio.Wave.DirectSoundOut();

            output.Init(new NAudio.Wave.WaveChannel32(waveReader));
            output.Play();
        }
        public void disposeWave()
        {
            if (output != null)
            {
                if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing)
                {
                    output.Stop();
                    output.Dispose();
                    output = null;
                }
            }
            if (wave != null)
            {
                wave.Dispose();
                wave = null;
            }
        }
        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            disposeWave();
        }
        private void bttnStop_Click(object sender, EventArgs e)
        {
            if (output != null)
            {
                if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing)
                {
                    output.Stop();

                }
            }
        }
    }
}
</code></pre>

<p>And this is the code of Form1 (from the project using DirectX):</p>

<pre><code>using System;
using System.Windows.Forms;
using Microsoft.DirectX.DirectSound;
using DirectSound = Microsoft.DirectX.DirectSound;
namespace DirectSoundPlay
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            ReSizeControls();
        }
        private void playToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (listBox2.SelectedItems.Count == 0)
                return;
            if (listBox2.SelectedItems.Count &gt; 1)
            {
                MessageBox.Show("Too many SelectedItems");
                return;
            }
            ClassAudioDevice ad = listBox2.SelectedItem as ClassAudioDevice;
            if (ad == null)
            {
                MessageBox.Show("SelectedItem is not a ClassAudioDevice");
                return;
            }
            DirectSound.Device Device = new DirectSound.Device(ad.DriverGuid);
            Device.SetCooperativeLevel(this.Handle, DirectSound.CooperativeLevel.Priority);
            DirectSound.Buffer AudioBuffer = new DirectSound.Buffer("C:\\Windows\\Media\\notify.wav", Device);
            AudioBuffer.Play(0, BufferPlayFlags.Default);
        }
        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }
        private void Form1_SizeChanged(object sender, EventArgs e)
        {
            ReSizeControls();
        }
        private void ReSizeControls()
        {
            int w = ClientSize.Width &gt;&gt; 1;
            listBox1.Width = w - 1;
            listBox2.Width = w - 1;
            listBox1.Height = ClientSize.Height;
            listBox2.Height = ClientSize.Height;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            DirectSound.DevicesCollection DevicesList = new DirectSound.DevicesCollection();
            DirectSound.CaptureDevicesCollection CaptureDevicesList = new DirectSound.CaptureDevicesCollection();
            ClassAudioDevice ad;
            //
            foreach (DirectSound.DeviceInformation di in CaptureDevicesList)
            {
                ad = new ClassAudioDevice();
                ad.Description = di.Description;
                ad.DriverGuid = di.DriverGuid;
                listBox1.Items.Add(ad);
            }
            foreach (DirectSound.DeviceInformation di in DevicesList)
            {
                ad = new ClassAudioDevice();
                ad.Description = di.Description;
                ad.DriverGuid = di.DriverGuid;
                listBox2.Items.Add(ad);
            }
        }
    }
}
</code></pre>

<p>And this is the code of ClassAudioDevice (from the same project):</p>

<pre><code>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DirectSoundPlay
{
    class ClassAudioDevice
    {
        public string Description = "";

        public Guid DriverGuid = new Guid();

        public override string ToString()
        {
            return Description;
        }
    }
}
</code></pre>

<p>Thank you in advance.Good day.</p>
