Получение ошибки при выходе из программы после загрузки .wav с помощью NAudio - PullRequest
3 голосов
/ 15 июня 2011

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

Хорошо, все сказали, что работает нормально. Программа корректно загружает, воспроизводит, ставит на паузу, останавливается и исчезает и появляется Трекбар громкости правильно отражает уровень громкости воспроизводимой песни. Это работает, но у меня есть две проблемы.

Сначала, после того, как я нажимаю кнопку «Загрузить», чтобы загрузить звук, а затем делаю все, что хочу (или нет), при выходе из программы я получаю следующее всплывающее сообщение об ошибке («Ошибка подтверждения») : «AcmStreamHeader dispose не был вызван в AcmStreamHeader.Finalize ()». Это одно из тех всплывающих окон «Прервать, Повторить, Игнорировать», но через несколько секунд оно исчезает и проект завершается. (Примечание. Функция загрузки создает DirectSoundOut и вызывает CreateInputStream ..., взятый непосредственно из примеров NAudio на сайте. Он также устанавливает обработчики событий для определенных событий, но это, вероятно, не имеет значения.)

В деструкторе класса я делаю следующие вызовы:

mainOutputStream.Close();
mainOutputStream.Dispose();
waveOutDevice.Dispose();

Но я все еще получаю ошибку. Это большой вопрос, и я задам другой вопрос в другой ветке. Есть идеи, почему это происходит и как я могу это остановить?

Я использую VS 10 на 32-битной Windows 7.

1 Ответ

4 голосов
/ 15 июня 2011

Наиболее вероятная причина ошибки (на самом деле это просто Debug.Assert - она ​​не возникает в сборках релизов NAudio), если mainOutputStream был назначен более чем одному WaveStream, и когда вы его изменили, вы не сделали этого. Утилизируйте старый. При выходе из приложения запускается сборщик мусора, и запускается программа Debug.Assert.

Пара других пунктов:

  • Нет необходимости вызывать mainOutputStream.Close и Dispose. Просто позвоните одному из них.
  • Ваш код очистки должен быть не в деструкторе класса (финализаторе?), А в методе Dispose для формы, в обработчике закрытия или закрытия.
  • Редактировать: Другая возможная причина заключается в том, что вы получили наследие от WaveStream и в своем переопределенном методе Dispose не вызывали Dispose ни для каких WaveStreams, являющихся членами класса.
...