none
lire un fichier son sur une carte son externe RRS feed

  • Question

  • Bonjour

    Je suis entrain de développer une application dans Csharp,Je veux lire un fichier son sur une carte son externe.Est ce qu'il y'a une fonction qui me permet de lire un fichier audio en appelant comme paramètres le nom du fichier et le nom (ou le ID) de la carte son externe?

    Merci d'avance :) 

    lundi 25 avril 2011 13:17

Réponses

  • Bonjour,

    Tout d’abord, il faut copier NAudio.dll sur votre ordinateur et puis ajoutez une référence vers ce .dll dans votre projet. Voilà un petit exemple de code pour identifier la carte son:

     

         WaveStream mainOutputStream = CreateInputStream("audioFileName"); ;

     

                WaveOut wo = new WaveOut();

     

                for (int i = 0; i < WaveOut.DeviceCount; i++)

                {

                    WaveOutCapabilities woc = WaveOut.GetCapabilities(i);

                    if (woc.ProductName.Equals("yourProductName")) wo.DeviceNumber = i;

                }

     

                wo.Init(mainOutputStream);

                wo.Play();

     

    et il faut définir aussi :

     

    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 { throw new InvalidOperationException("Unsupported extension"); }

               

                return inputStream;

            }

     

     

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    vendredi 29 avril 2011 14:17

Toutes les réponses

  • Bonjour,

    Avez-vous essayé à résoudre votre problème avec les classes audio et MIDI de NAudio ? Ils sont disponibles sur codeplex.com et vous trouvez aussi des exemples.

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 28 avril 2011 08:36
  • Bonjour

    Merci d'avoir pris la peine de me répondre,pour être plus claire je suis débutante en Csharp et j'ai pas bien compris le code de NAudio,j'ai trouvé sur le net que je dois utiliser :

     "var waveOut = new WaveOut();

    waveOut.DeviceNumber = 3;
    waveOut.Init(...

    To find out which device number is which output, you call WaveOut.GetCapabilities(deviceNumber). deviceNumber must be less than WaveOut.DeviceCount"

    Mais j'ai pas compris comment.

    Par exemple si je vais  créer 3 boutons  et  je vais relier à chaque bouton une carte son externe (bouton 1 correspond à la carte son 1,...) quel est le code qui peut m'aider à réaliser cela ??????????? 

     

    jeudi 28 avril 2011 12:37
  • Bonjour,

    Tout d’abord, il faut copier NAudio.dll sur votre ordinateur et puis ajoutez une référence vers ce .dll dans votre projet. Voilà un petit exemple de code pour identifier la carte son:

     

         WaveStream mainOutputStream = CreateInputStream("audioFileName"); ;

     

                WaveOut wo = new WaveOut();

     

                for (int i = 0; i < WaveOut.DeviceCount; i++)

                {

                    WaveOutCapabilities woc = WaveOut.GetCapabilities(i);

                    if (woc.ProductName.Equals("yourProductName")) wo.DeviceNumber = i;

                }

     

                wo.Init(mainOutputStream);

                wo.Play();

     

    et il faut définir aussi :

     

    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 { throw new InvalidOperationException("Unsupported extension"); }

               

                return inputStream;

            }

     

     

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    vendredi 29 avril 2011 14:17
  • Bonjour
    J'ai réussit à trouver le code qui permet de trouver les cartes sons et de lire un fichier son dans chacune,cette fonction utilise NAudio et elle nous permet de diriger le son vers une carte son précise en utilisant "Devicenumber" , mais j'ai toujours un problème: Quand je branche les trois cartes son simultanément toujours il y'a une seule carte qui fonctionne mais quand je les branche séparément je constate que les trois cartes son fonctionnent.
    c'est le code de la Form2 qui permet de diriger le son vers une carte précise mais comme j'ai expliqué,ça marche presque pas :(
     
    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;
            int waveOutDevices = 0;
            public Form2()
            {
                InitializeComponent();
            }

            private void Form2_Load(object sender, EventArgs e)
            {
                hideButtons();
                 fileName = ("alarm.wav");
                 //bttnPlayAll.Enabled = false;
                 detectDevices();          
                 
            }

            public void hideButtons()
            {
                bttnAudioDevice1.Visible = false;
                bttnAudioDevice2.Visible = false;
                bttnAudioDevice3.Visible = false;
                bttnAudioDevice4.Visible = false;
                bttnAudioDevice5.Visible = false;
            }

            public void detectDevices()
            {
                 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 playAllAvailableDevices()
            {
                 wave = new WaveOut();
                 switch (waveOutDevices)
                 {
                     case 1:

                         wave.DeviceNumber = 0;
                         playAllSound();
                         break;
                     case 2:
                         wave.DeviceNumber = 0;
                         playAllSound();
                         wave.DeviceNumber = 1;
                         playAllSound();
                         break;
                     case 3:
                         wave.DeviceNumber = 0;
                         playAllSound();
                         wave.DeviceNumber = 1;
                         playAllSound();
                         wave.DeviceNumber = 2;
                         playAllSound();
                         break;
                     case 4:
                         wave.DeviceNumber = 0;
                         playAllSound();
                         wave.DeviceNumber = 1;
                         playAllSound();
                         wave.DeviceNumber = 2;
                         playAllSound();
                         wave.DeviceNumber = 3;
                         playAllSound();
                         break;
                     case 5:
                         wave.DeviceNumber = 0;
                         playAllSound();
                         wave.DeviceNumber = 1;
                         playAllSound();
                         wave.DeviceNumber = 2;
                         playAllSound();
                         wave.DeviceNumber = 3;
                         playAllSound();
                         wave.DeviceNumber = 4;
                         playAllSound();
                         break;
                 }
            }

            public void playAllSound()
            {
               
                waveReader = new NAudio.Wave.WaveFileReader(fileName);
                output = new NAudio.Wave.DirectSoundOut();

                output.Init(new NAudio.Wave.WaveChannel32(waveReader));
                output.Play();
            }

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

            private void bttnPlayAll_Click(object sender, EventArgs e)
            {
                playAllAvailableDevices();
            }
        }
    }
    On a réussit aussi à trouver une deuxième fonction,celle là utilise DirectX,elle permet de diriger le son vers la carte son sélectionnée,ici on n'a pas un problème mais en utilisant  DirectX je n'ai pas compris comment je pourrais  appeler un "Device" avec son indice.Pour être plus claire,par exemple lorsque je clique sur le bouton1 le son doit sortir de la carte son1 qui est liée à ce bouton,donc comment je peux spécifier un "Device" pour chaque bouton à l'aide de DirectX?????? Et si ce n'est pas possible comment je peux améliorer le code qui utilise NAudio????? 
    Voici le code qui utilise DirectX,c'est le code de la forme1:
    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);
    }
    }
    }
    }
     et c'est le code de la classe "ClassAudioDevice":
    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;
    }
    }
    }



    Merci d'avance et bonne journée.  
    • Proposé comme réponse schoolmen samedi 21 mai 2011 17:40
    lundi 2 mai 2011 14:06
  • Bonjour,

    L’erreur est normale. Je ne vois pas aucune connexion entre les variables wave et output. En ce cas, l’instruction wave.DeviceNumber = 1 ; est inutile. Essayez adapter la solution que j’ai proposé, pour votre application.

     

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    vendredi 6 mai 2011 14:03