C # nAudio: как исправить ошибку "InvalidParameter, вызывающую acmStreamClose" - PullRequest
0 голосов
/ 07 апреля 2019

В настоящее время я работаю над конвертером «Изображение в аудио».Я собираю значения RGB изображения и играю ноту в зависимости от значения (1 музыкальная нота на цветовой канал и разные инструменты для каждого канала).Я совсем не знаком с C # и просто пытаюсь заставить программу работать хорошо, несмотря на то, что качество моего кода может быть очень низким (потому что у меня будет устная презентация, где мне нужно будет объяснить, что я сделал, такМне нужно делать то, что я понимаю почти идеально).Качество кода не является основной целью моего упражнения (цель состояла в том, чтобы сделать наше первое приложение Windows Form и иметь код, работающий на нем без ошибок).

Для этого мне нужно прочитать некоторыеаудио файлы, но я получаю эту ошибку "InvalidParameter вызывая acmStreamClose", когда я выполняю свой код.Код компилируется хорошо и, кажется, работает нормально (фактически, он читает мои музыкальные файлы), но я обычно получаю эту ошибку во время работы программы (она не останавливает программу, и музыкальные файлы продолжают воспроизводиться).

Я искал информацию об этой проблеме, и все, что я нашел, было это , но я не уверен, что это та же самая проблема, с которой столкнулись.Я не понимаю, почему это не работает, потому что ошибка не происходит в то же время в зависимости от изображения, которое я выбираю для преобразования (и это происходит не каждый раз, когда я вхожу в цикл таймера).

Iприходится читать много файлов подряд (3 файла на пиксель одновременно), поэтому я помещаю следующий код в таймер:

//Gamme_note are list that contains RGB values of each pixels

switch (gamme_note_r[i])[...] //Note selector for the red channel giving value to pcm_rouge

switch (gamme_note_v[i])[...] //Note selector for the green channel giving value to pcm_vert

switch (gamme_note_b[i])[...] //Note selector for the blue channel giving value to pcm_bleu

Vider_lecteur();

            stream_r = new NAudio.Wave.BlockAlignReductionStream(pcm_rouge);
            note_rouge = new NAudio.Wave.DirectSoundOut();
            note_rouge.Init(stream_r);
            note_rouge.Play();

            stream_v = new NAudio.Wave.BlockAlignReductionStream(pcm_vert);
            note_verte = new NAudio.Wave.DirectSoundOut();
            note_verte.Init(stream_v);
            note_verte.Play();


            stream_b = new NAudio.Wave.BlockAlignReductionStream(pcm_bleu);
            note_bleue = new NAudio.Wave.DirectSoundOut();
            note_bleue.Init(stream_b);
            note_bleue.Play();

(я не знаю, могла ли эта часть кодавызвать проблему)

Когда я выполняю пошаговую отладку, я вижу, что проблема связана с методом "Vider_lecteur", который:

private void Vider_lecteur()
        {
            if (note_rouge != null)
            {
                if (note_rouge.PlaybackState == NAudio.Wave.PlaybackState.Playing)
                {
                    note_rouge.Stop();
                }
                note_rouge.Dispose();
                note_rouge = null;
            }


            if (stream_r != null)
            {
                stream_r.Dispose();
                stream_r = null;
            }


            if (note_verte != null)
            {
                if (note_verte.PlaybackState == NAudio.Wave.PlaybackState.Playing)
                {
                    note_verte.Stop();
                }
                note_verte.Dispose();
                note_verte = null;
            }

            if (stream_v != null)
            {
                stream_v.Dispose();
                stream_v = null;
            }

            if (note_bleue != null)
            {
                if (note_bleue.PlaybackState == NAudio.Wave.PlaybackState.Playing)
                {
                    note_bleue.Stop();
                }
                note_bleue.Dispose();
                note_bleue = null;
            }

            if (stream_b != null)
            {
                stream_b.Dispose();
                stream_b = null;
            }
         }

Я основал свою работу на этом video .

Проблема всегда возникает из-за метода stream_something.Dispose ().

Я получаю текст ошибки:

************** Texte de l'exception **************

NAudio.MmException: InvalidParameter, вызывающий acmStreamClose

à NAudio.Wave.Compression.AcmStream.Dispose (логическое удаление)

à NAudio.Wave.AcmMp3FrameDecompressor.Dispose ()

à NAudio.Wave.Mp3FileReader.Dispose (логическое удаление)

à System.IO.Stream.Close ()

à System.IO.Stream.Dispose ()

à NAudio.Wave.BlockAlignReductionStream.Dispose (логическое удаление)

à System.IO.Stream.Close ()

à System.IO.Stream.Dispose ()

à Image2audio.Form1.Vider_lecteur () dans

C: \ Users \ fabie \ Desktop \ Image2audio \ Image2audio \ Form1.cs: ligne 468

à Image2audio.Form1.timer1_Tick (отправитель объекта, EventArgs e)dans

C: \ Users \ fabie \ Desktop \ Image2audio \ Image2audio \ Form1.cs: ligne 388

à System.Windows.Forms.Timer.OnTick (EventArgs e)

System.Windows.Forms.Timer.TimerNativeWindow.WndProc (Message & m)

System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg,> IntPtr wparam, IntPtr lparam)

...