スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C#.NET4.5でwavの同時再生

  • 2013/08/03 04:47
  • Category: C#
環境: VS Express 2012

C#でwavの再生を行う際、System.Media.SoundPlayerやWindowsAPIのPlaySoundでは同時再生ができません。
そこで、Microsoft.DirectX.AudioVideoPlayback.AudioもしくはMicrosoft.DirectX.DirectSoundを使います。(他にも方法があるかも)
Audioの方が簡単なようなので今回はこちらを使います。


まずはMicrosoft.DirectX.dllとMicrosoft.DirectX.AudioVideoPlayback.dllを参照に追加しますが、
ソリューションエクスプローラ - 参照設定 - 参照の追加 - アセンブリでは
一覧に表示されないため、右下の「参照」からdllを直接参照します。
例: C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.AudioVideoPlayback.dll


適当なコードを書いて実行。


private void button1_Click(object sender, EventArgs e)
{
string wav1 = @"C:\1.wav";
string wav2 = @"C:\2.wav";
var audio1 = new Microsoft.DirectX.AudioVideoPlayback.Audio(wav1);
var audio2 = new Microsoft.DirectX.AudioVideoPlayback.Audio(wav2);
audio1.Play();
audio2.Play();
}


すると実行時に
「型 'System.IO.FileLoadException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました
追加情報: 混合モード アセンブリはバージョン 'v1.1.4322' のランタイムに対して作成されており、
追加の構成情報がないと 4.0 ランタイムでは読み込めません。」
という例外が発生しますが、app.configに次の行を追加すれば回避できるようです。


<startup useLegacyV2RuntimeActivationPolicy="true" />


これで上記の例外は発生しなくなりますが、今度はnew Audio()時に別の例外が発生します(Debug時のみ)。

「DLL 'C:\Windows\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.dll' は、
OS ローダー ロック内でマネージ実行を試行しています。DllMain またはイメージ初期化関数内で
マネージ コードを実行しないでください。この動作は、アプリケーションをハングさせる原因になる可能性があります。」

VSと相性がよくないようで・・・
メニューのデバッグ - 例外 - Managed Debugging Assistants - LoaderLockの
「スローされるとき」のチェックを外せば一応無視できます。


これで無事多重再生ができるようになりました。
が、大量のAudioインスタンスをPlay()した後にDispose()しないでいると
アプリ全体が徐々に不安定になってくるので注意。
再生が終わっても自動でStopしてくれないのが原因っぽいですね。

参考
http://ap.atmarkit.co.jp/bbs/core/fdotnet/21583
http://dobon.net/vb/dotnet/programing/playmidifile.html
http://d.hatena.ne.jp/corosuke2s/20110106/1294285562
http://code-life.net/?p=1333
http://stackoverflow.com/questions/5650025/loader-lock-exception-while-playing-audio-using-directx


8/4追記
oggファイルでも再生できました。

スポンサーサイト

Pagination

Trackback

Trackback URL

http://someprog.blog.fc2.com/tb.php/4-c1440794

Comment

Post Your Comment

コメント登録フォーム
公開設定

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。