FlasherのためのSilverlight入門(9) 音の再生

Spriteはひとまずおいておいて、音の再生についてメモです。

非常にどうでもよさそうなところで、ずいぶん時間かかった。

音アイテムの登録

まず、画像と同じように音のファイルを登録します。silverlightで再生できる音はmp3とwavのみのようです。ソリューション・エクスプローラーにファイルを追加します。

sc_sound.jpg赤枠に注目!

このとき、注意しないといけない点として、登録した音のファイルの「ビルドアクション」が「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)とすれば再生します。

 
List si = 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");
コメントする
トラックバック(0)

トラックバックURL: http://blog.tokyoace4.com/cgi-bin/mt/mt-tb.cgi/157