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

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

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

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

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

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

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

Я использую VS 10 на 32-разрядной версии Windows 7.


person Matthew    schedule 15.06.2011    source источник


Ответы (1)


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

Еще пара моментов:

  • Нет необходимости вызывать mainOutputStream.Close и Dispose. Просто позвоните одному из них.
  • Ваш код очистки должен быть не в деструкторе класса (финализаторе?), а в методе Dispose, для формы, в обработчике событий Closing или Closed.
  • Изменить. Другая возможная причина заключается в том, что вы наследуете от WaveStream и в своем переопределенном методе Dispose не вызывали Dispose для каких-либо потоков WaveStream, являющихся членами класса.
person Mark Heath    schedule 15.06.2011
comment
Хорошо, я добавил метод удаления и убедился, что он вызывается при выходе из программы, и проблема исчезла. Спасибо за совет. Кстати, есть ли документ API, показывающий классы NAudio и поясняющий их элементы? Это было бы... полезно. Спасибо, Марк. - person Matthew; 16.06.2011
comment
Еще один вопрос, Марк. Я использую следующий код для воспроизведения звука: waveOutDevice = new WaveOut(); mainOutputStream = CreateInputStream(имя файла); waveOutDevice.Play(); У меня такой вопрос... требует ли waveOutDevice ИСКЛЮЧИТЕЛЬНОГО использования аудиоустройства, или у меня может быть несколько объектов моего класса, которые воспроизводят свои звуки... возможно, даже одновременно? Все, что я делаю, это проигрываю звуковые файлы, а не что-то необычное. - person Matthew; 16.06.2011
comment
Все классы NAudio имеют XML-документацию для своих общедоступных API. Другие документы и руководства можно найти на вкладке «Документация» веб-сайта CodePlex. - person Mark Heath; 16.06.2011
comment
И да, API-интерфейсы WaveOut без проблем справляются с несколькими одновременными пользователями. Однако Windows может выполнять внутреннюю передискретизацию звука. - person Mark Heath; 16.06.2011
comment
Спасибо, Марк. Я искал замену для Microsoft.DirectX.AudioVideoPlayback, и пока похоже, что NAudio — хороший вариант. Я переписываю старое приложение, переделываю интерфейс и хочу перейти на метод, который позволил бы мне выбрать аудиовыход и найти и воспроизвести часть звукового файла. NAudio, кажется, является билетом ... до тех пор, пока я правильно создаю свой класс-оболочку. Еще раз спасибо, Марк. - person Matthew; 16.06.2011