2012年9月18日火曜日

WindowsPhone7 アプリで効果音を出す方法

タイマーアプリで効果音を出す必要があって、結構悩んだのでメモしておきます

まず参考にしたページ

Windows Phone 7 で効果音を鳴らす c#研究室



PlaySoundAction ビヘイビア を使う
一番簡単な方法だと思う、ただし短時間に連続してイベントを起こすと、なんか?詰まってならなくなる。一旦音が鳴らなくなるとアプリを起動しなおさないと音は復帰しない
ダイアル操作時のクリック音をカリカリ鳴らすのには使えない


MediaElement を使う
アプリの画面上のどこかにMediaElementを配置する。基本、配置していないとだめ、コードからMediaElementを実行時に生成しても音は鳴らない
Sourceの指定は割と処理が重いみたい、短時間に連続して鳴らす事ができない。そのうち鳴らなくなる。Source指定しないで同じ音を Play するだけなら連続して鳴らす事が出来る。


MediaElementで何とかなると思いましたが、問題発覚。
PlaySoundActionやMediaElementでPlayするとバックグラウンドで再背中の音楽プレイヤーが止まる。

確かバックグランドMusicに影響を与えてはいけないような (下記リンク6.5のあたり)




じゃあ裏で音楽再生中なら効果音ださない様にすれば良いんじゃない?


ただし Xna を利用すると、そのうち例外が起きます


dispatcherのupdateを定期的にする必要があるらしい。

リンク先を参考にupdate処理を追加する



とりあえず例外で落ちる問題は解決、でも、
どうせXna使うならSoundEffect を使えば、裏で再生中の音楽を止めずに効果音の再生が出来る?



se = Microsoft.Xna.Framework.Audio.SoundEffect.FromStream(Microsoft.Xna.Framework.TitleContainer.OpenStream("click.wav"));

こんな感じでSoundEffectクラスを生成して、Play出来る。音楽再生にも影響なし。すばらしい。
ただし、wmaやmp3は再生できないので長めの効果音にはむいていない


Microsoft.Xna.Framework.Media.Song

を使えばwmaでも再生できるけど、MediaElement使った方がいいかな?



結局、タイマーの操作時の効果音はSoundEffectを使って、長いアラーム音はMediaElementを使うことにしました。





あとは、何故かTrophyだとSoundEffectが鳴ったり鳴らなかったりする問題が残ってます









0 件のコメント: