2014年8月20日水曜日

C#にてDirectXのAudioVideoPlaybackを利用したサウンドの同時再生。

C#でサウンドを再生するには、通常PlaySoundクラスを利用しますが、このクラスは音声ファイルの同時再生ができません。片方がなっている状況で別のファイルを再生をすると、片方が止まって新たしく別のサウンドが再生します。ゲームなどでは不便ですね。BackgroundWorkerを利用してマルチスレッド化を行っても、1つの再生プロセスを共有しているようで、PlaySoundクラスを利用したサウンドの同時再生は実質不可能なようです。

この問題には、DirectXを利用することで解決できます。事前に下記の設定をしたうえで、サンプルのように書けばOKです。このサンプルではボタンを押すと、他方のサウンド再生に関係なく、サウンドが再生します。なお、サンプルのように毎回インスタンスを生成しないと思ったように再生されません。
  • C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.AudioVideoPlayback.dllを参照に追加
  • app.configに<startup uselegacyv2runtimeactivationpolicy="true">を追加


  • 【デバッグ】→【例外】→「【Managed Debugging Assistants】→【LoaderLock】の「スローされるとき」のチェックを解除


  • 以上の設定をした上で下記のコードのように書けばOK。

    参考サイト

    3 件のコメント:

    1. はじめまして、コメント失礼します。プログラミング初心者です。
      Visual C#で複数のwaveファイルを同時に再生するプログラムをかきたいのですが、やはり同時再生はむりで調べていたところここにたどり着きました。
      もしよろしければ、DirectXを利用する際の設定をもう少し詳しく教えていただけないでしょうか?
      初心者なものですいません(・_・;)

      返信削除
    2. 追記です。
      調べていると少しわかってましたので、よければ「app.configに<startup uselegacyv2runtimeactivationpolicy="true">を追加」という部分のみでも教えていただけるとうれしいです。

      返信削除
    3. 加えて追記大変申し訳ないです。
      解決することができました。コメントは無視か削除してください。
      とても参考になる記事でした。ありがとうございました。

      返信削除