3

先日、NAudio を見つけたばかりで、それで遊んでいます。ロード ボタン (特定の .wav ソングをロードする) と、サウンドを再生、一時停止、停止、フェードインするためのボタン (タイマーと徐々に増加するボリュームを使用する独自の追加機能) を備えた単純な Windows フォーム プログラムを作成しました。音をフェードアウトします。ボリュームを処理するためのトラックバー コントロールもあります。すべての NAudio のものを入れるためのラッパー クラスを作成し、フェードイン/アウトやサウンドの開始時または一時停止時のイベント通知などの追加機能を追加しました。

さて、すべてが言った、それはうまくいきます。プログラムは、正しくロード、再生、一時停止、停止、およびフェードインとフェードアウトします。ボリューム トラックバーは、再生中の曲のボリューム レベルを正しく反映します。これだけでうまくいきますが、2 つの問題があります。

まず、[ロード] ボタンをクリックしてサウンドをロードし、必要な (またはしない) すべての再生を行った後、プログラムを終了すると、次のポップアップ エラー メッセージ (「アサーションに失敗しました」) が表示されます。 Dispose は AcmStreamHeader.Finalize() で呼び出されませんでした」。これは「中止、再試行、無視」ポップアップの 1 つですが、数秒後に消えてプロジェクトが終了します。(注: ロード機能は、DirectSoundOut を作成し、サイトの NAudio サンプルから直接取得した CreateInputStream を呼び出します。また、定義されたイベントのイベント ハンドラーを設定しますが、それはおそらく問題ではありません。)

クラス デストラクタで、次の呼び出しを行います。

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

しかし、私はまだエラーが発生します。これは大きな問題であり、別のスレッドで別の質問をします。なぜこれが起こっているのか、どうすればそれを止めることができるのでしょうか?

Windows 7 32 ビットで VS 10 を実行しています。

4

1 に答える 1

4

エラーの最も可能性の高い理由 (実際には単なる Debug.Assert - NAudio のリリース ビルドでは発生しません) は、mainOutputStream が複数の WaveStream に割り当てられており、それを変更したときに古いものを破棄しなかったことです。 1。アプリを終了すると、ガベージ コレクターが実行され、この Debug.Assert が起動します。

その他のポイント:

  • mainOutputStream.Close と Dispose を呼び出す必要はありません。それらの1つに電話するだけです。
  • クリーンアップ コードは、クラス デストラクタ (ファイナライザ?) ではなく、フォームの Dispose メソッド、Closing または Closed イベント ハンドラ内にある必要があります。
  • 編集:別の考えられる理由は、WaveStream から派生し、オーバーライドされた Dispose メソッドで、クラスのメンバーである WaveStreams で Dispose を呼び出さなかったことです。
于 2011-06-15T19:22:51.547 に答える