FlasherのためのSilverlight入門(9) 音の再生
tech&programming,visual basic
/ 2010.06.12 08:11
Spriteはひとまずおいておいて、音の再生についてメモです。
非常にどうでもよさそうなところで、ずいぶん時間かかった。
音アイテムの登録
まず、画像と同じように音のファイルを登録します。silverlightで再生できる音はmp3とwavのみのようです。ソリューション・エクスプローラーにファイルを追加します。
このとき、注意しないといけない点として、登録した音のファイルの「ビルドアクション」が「Resource」になっていないといけません。Bitmap画像を追加したときは自動で「Resouce」になっていたのですが、mp3ファイルの場合、標準では「なし」になってしまうようです。追加したmp3ファイルを右クリックしプロパティを開いて設定してください。
これに気づくのに2時間ぐらいかかりました。
SoundCtrlクラス
というわけで、ポイントは上の点ぐらいだと思うので、実装は以下にべたっとはっておきます。音を再生するにはMediaElementというクラスを使い、これをどっかのCanvasなどに張り付ける必要があるということです。次のSoundCrtlクラスはアプリケーション全体で一括して音量などを操作するためのクラスです。
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Collections.Generic;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
namespace strippers.media
{
public struct SoundItem
{
public string resource;
public double volume;
public string key;
public MediaElement m;
public SoundItem(string key,string resource, double defVolume)
{
this.key = key;
this.resource = resource;
this.volume = defVolume;
this.m = null;
}
public void setMediaElement(MediaElement me)
{
this.m = me;
}
}
public class SoundCtrl
{
private Canvas soundCanvas;
private List soundList;
private double volume = 1;
public SoundCtrl(Canvas root, List soundList)
{
this.soundList = soundList;
soundCanvas = new Canvas();
root.Children.Add(soundCanvas);
// soundCanvas.Visibility = Visibility.Collapsed;
}
public void play(string key)
{
foreach (SoundItem item in this.soundList)
{
if (item.key == key)
{
MediaElement me = new MediaElement();
me.MediaEnded += new RoutedEventHandler(onPlayComplete);
this.soundCanvas.Children.Add(me);
me.Source = new Uri(item.resource, UriKind.Relative);
me.Volume = this.volume*item.volume;
me.Play();
item.setMediaElement(me);
break;
}
}
}
public void stop(string key)
{
foreach (SoundItem item in this.soundList)
{
if (item.key == key)
{
if (item.m != null)
{
item.m.Stop();
}
break;
}
}
}
public void onPlayComplete(object sender, RoutedEventArgs e)
{
MediaElement me = sender as MediaElement;
this.soundCanvas.Children.Remove(me);
foreach (SoundItem item in this.soundList)
{
if (item.m == me)
{
item.setMediaElement(null);
break;
}
}
}
public void setMasterVolume(double val)
{
this.volume = val;
}
}
}
使い方は以下のような感じ。
最初に、keyword、リソースのパス、そのアイテムのボリュームを指定したSoundItem構造体のリストを作り、SoundCtrlを作成。あとはそのSoundCrtlのインスタンスにたいしてplay(keyword)とすれば再生します。
Listsi = new List (); si.Add(new SoundItem("click", "/YJICA2010;component/assets/mp3/click-ratchet.mp3", 0.4)); SoundCtrl sc = new SoundCtrl(mainCanvas,si); sc.play("click");
| カテゴリー | : | tech&programming,visual basic |
| タグ | : | silverlight |
| トラックバックURL | : | http://blog.tokyoace4.com/cgi-bin/mt/mt-tb.cgi/157 |
コメントする
トラックバック(0)
トラックバックURL: http://blog.tokyoace4.com/cgi-bin/mt/mt-tb.cgi/157