Play sound on a specific device

I am starting work at Csharp, and I am trying to develop using NAudio.I found a code on the NAudio website that gives me the ability to play sound. In my case, I will create three buttons, and each button is connected to an external sound card, when I press the button, I want to hear the sound from the speaker that is associated with my sound card (button 1 refers to sound card 1, ...). Thus, each “play” function should produce sound in a particular device. To ensure performance, it’s not very important to create a “play” function for each button (so for each sound card), and my sound allows me to play sound only in the sound card, please can you help me fix the code ???? ??? It is very important for me.

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using NAudio.Wave;
using NAudio.CoreAudioApi;
namespace PaGa
{
public partial class PlaybackForm : Form
{
    IWavePlayer waveOut;
    string fileName = null;
    WaveStream mainOutputStream;
    WaveChannel32 volumeStream;
    public PlaybackForm()
    {
        InitializeComponent();
    }
    private void buttonPlay_Click(object sender, EventArgs e)
    {
        if (waveOut != null)
        {
            if (waveOut.PlaybackState == PlaybackState.Playing)
            {
                return;
            }
            else if (waveOut.PlaybackState == PlaybackState.Paused)
            {
                waveOut.Play();
                return;
            }
        }
        // we are in a stopped state
        // TODO: only re-initialise if necessary
        if (String.IsNullOrEmpty(fileName))
        {
            toolStripButtonOpenFile_Click(sender, e);
        }
        if (String.IsNullOrEmpty(fileName))
        {
            return;
        }
        try
        {
            CreateWaveOut();
        }
        catch (Exception driverCreateException)
        {
            MessageBox.Show(String.Format("{0}", driverCreateException.Message));
            return;
        }
        mainOutputStream = CreateInputStream(fileName);
        trackBarPosition.Maximum = (int)mainOutputStream.TotalTime.TotalSeconds;
        labelTotalTime.Text = String.Format("{0:00}:{1:00}",   (int)mainOutputStream.TotalTime.TotalMinutes,
            mainOutputStream.TotalTime.Seconds);
        trackBarPosition.TickFrequency = trackBarPosition.Maximum / 30;
        try
        {
            waveOut.Init(mainOutputStream);
        }
        catch (Exception initException)
        {
            MessageBox.Show(String.Format("{0}", initException.Message), "Error Initializing Output");
            return;
        }
        // not doing Volume on IWavePlayer any more
        volumeStream.Volume = volumeSlider1.Volume;
        waveOut.Play();
    }
    private WaveStream CreateInputStream(string fileName)
    {
        WaveChannel32 inputStream;
        if (fileName.EndsWith(".wav"))
        {
            WaveStream readerStream = new WaveFileReader(fileName);
            if (readerStream.WaveFormat.Encoding != WaveFormatEncoding.Pcm)
            {
                readerStream = WaveFormatConversionStream.CreatePcmStream(readerStream);
                readerStream = new BlockAlignReductionStream(readerStream);
            }
            if (readerStream.WaveFormat.BitsPerSample != 16)
            {
                var format = new WaveFormat(readerStream.WaveFormat.SampleRate,
                    16, readerStream.WaveFormat.Channels);
                readerStream = new WaveFormatConversionStream(format, readerStream);
            }
            inputStream = new WaveChannel32(readerStream);
        }
        else if (fileName.EndsWith(".mp3"))
        {
            WaveStream mp3Reader = new Mp3FileReader(fileName);
            WaveStream pcmStream = WaveFormatConversionStream.CreatePcmStream(mp3Reader);
            WaveStream blockAlignedStream = new BlockAlignReductionStream(pcmStream);
            inputStream = new WaveChannel32(blockAlignedStream);
        }
        else
        {
            throw new InvalidOperationException("Unsupported extension");
        }
        // we are not going into a mixer so we don't need to zero pad
        //((WaveChannel32)inputStream).PadWithZeroes = false;
        volumeStream = inputStream;
        var meteringStream = new MeteringStream(inputStream, inputStream.WaveFormat.SampleRate / 10);
        meteringStream.StreamVolume += new EventHandler<StreamVolumeEventArgs>(meteringStream_StreamVolume);
        return meteringStream;
    }
    void meteringStream_StreamVolume(object sender, StreamVolumeEventArgs e)
    {
        volumeMeter1.Amplitude = e.MaxSampleValues[0];
        waveformPainter1.AddMax(e.MaxSampleValues[0]);
        if (e.MaxSampleValues.Length > 1)
        {
            volumeMeter2.Amplitude = e.MaxSampleValues[1];
            waveformPainter2.AddMax(e.MaxSampleValues[1]);
        }
    }
    private void CreateWaveOut()
    {
        CloseWaveOut();
        int latency = (int)comboBoxLatency.SelectedItem;
        //if (radioButtonWaveOut.Checked)
        {
            //WaveCallbackInfo callbackInfo = checkBoxWaveOutWindow.Checked ?
            WaveCallbackInfo callbackInfo = WaveCallbackInfo.FunctionCallback();
            // WaveCallbackInfo callbackInfo = WaveCallbackInfo.FunctionCallback();
            // WaveCallbackInfo.NewWindow(): WaveCallbackInfo.FunctionCallback();
            WaveOut outputDevice = new WaveOut(callbackInfo);
            outputDevice.DesiredLatency = latency;
            waveOut = outputDevice;
        }
    }
    private void CloseWaveOut()
    {
        if (waveOut != null)
        {
            waveOut.Stop();
        }
        if (mainOutputStream != null)
        {
            // this one really closes the file and ACM conversion
            volumeStream.Close();
            volumeStream = null;
            // this one does the metering stream
            mainOutputStream.Close();
            mainOutputStream = null;
        }
        if (waveOut != null)
        {
            waveOut.Dispose();
            waveOut = null;
        }
    }
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        CloseWaveOut();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        comboBoxLatency.Items.Add(25);
        comboBoxLatency.Items.Add(50);
        comboBoxLatency.Items.Add(100);
        comboBoxLatency.Items.Add(150);
        comboBoxLatency.Items.Add(200);
        comboBoxLatency.Items.Add(300);
        comboBoxLatency.Items.Add(400);
        comboBoxLatency.Items.Add(500);
        comboBoxLatency.SelectedIndex = 5;
    }
    private void buttonPause_Click(object sender, EventArgs e)
    {
        if (waveOut != null)
        {
            if (waveOut.PlaybackState == PlaybackState.Playing)
            {
                waveOut.Pause();
            }
        }
    }
    private void volumeSlider1_VolumeChanged(object sender, EventArgs e)
    {
        if (mainOutputStream != null)
        {
            volumeStream.Volume = volumeSlider1.Volume;
        }
    }
    private void buttonControlPanel_Click(object sender, EventArgs e)
    {
        AsioOut asio = waveOut as AsioOut;
        if (asio != null)
        {
            asio.ShowControlPanel();
        }
    }
    private void buttonStop_Click(object sender, EventArgs e)
    {
        if (waveOut != null)
        {
            waveOut.Stop();
            trackBarPosition.Value = 0;
        }
    }
    private void timer1_Tick(object sender, EventArgs e)
    {
        if (waveOut != null)
        {
            if (mainOutputStream.Position >= mainOutputStream.Length)
            {
                buttonStop_Click(sender, e);
            }
            else
            {
                TimeSpan currentTime = mainOutputStream.CurrentTime;
                trackBarPosition.Value = (int)currentTime.TotalSeconds;
                labelCurrentTime.Text = String.Format("{0:00}:{1:00}", (int)currentTime.TotalMinutes,
                    currentTime.Seconds);
            }
        }
    }
    private void trackBarPosition_Scroll(object sender, EventArgs e)
    {
        if (waveOut != null)
        {
            mainOutputStream.CurrentTime = TimeSpan.FromSeconds(trackBarPosition.Value);
        }
    }
    private void toolStripButtonOpenFile_Click(object sender, EventArgs e)
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        openFileDialog.Filter = "All Supported Files (*.wav, *.mp3)|*.wav;*.mp3|All Files (*.*)|*.*";
        openFileDialog.FilterIndex = 1;
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            fileName = openFileDialog.FileName;
        }
       }

       }
       }

Thanks in advance. Good afternoon.

+3
1

NAudio , :

waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()) {DeviceNumber = OUTdeviceID };  

WaveOut DeviceNumer, -1 ( Windows).
, , waveOut

0

All Articles