Click here to Skip to main content
15,892,674 members
Please Sign up or sign in to vote.
4.75/5 (4 votes)
See more:
Hello


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.

My freinds gave me two codes: the first use Naudio it works but worked for I still can't 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 choosing a default audio card from the three external sound cards.

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

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

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 mentioned:
C#
 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();
                 
                }
            }
        }
    }
}

And this is the code of Form1 (from the project using DirectX):

C#
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 > 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 >> 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);
			}
		}
	}
}


And this is the code of ClassAudioDevice (from the same project):
C#
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;
        }
    }
}



Thanks in advance.Good day.
Posted
Updated 3-May-11 1:21am
v2
Comments
Patrick Kalkman 6-May-11 16:35pm    
How many devices are shown in combobox in the directx variant?

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900