「Xamarin.Mac/効果音を再生する」の版間の差分

ページの作成:「 Xamarin.Macで効果音を再生したい。 ==実装== ==NSSoundを使う== NSSoundを使うと簡単に効果音を再生できる。 <source lang="csharp">...」
 
編集の要約なし
 
(他の1人の利用者による、間の1版が非表示)
2行目: 2行目:
[[Xamarin.Mac]]で効果音を再生したい。
[[Xamarin.Mac]]で効果音を再生したい。


==実装==
==NSSoundを使う==
==NSSoundを使う==
NSSoundを使うと簡単に効果音を再生できる。
NSSoundを使うと簡単に効果音を再生できる。
<source lang="csharp">
<source lang="csharp">
             var path = Path.Combine(NSBundle.MainBundle.BundlePath, "Contents", "Resources");
             var path = Path.Combine(NSBundle.MainBundle.BundlePath, "Contents", "Resources");
             var file = Path.Combine(path,"se-033a.mp3");
             var file = Path.Combine(path,"se001.mp3");


             var sound = new NSSound(file, byRef:false);
             var sound = new NSSound(file, byRef:false);
29行目: 28行目:
<source lang="csharp">
<source lang="csharp">
             var path = Path.Combine(NSBundle.MainBundle.BundlePath, "Contents", "Resources");
             var path = Path.Combine(NSBundle.MainBundle.BundlePath, "Contents", "Resources");
             var file = Path.Combine(path,"se-033a.mp3");
             var file = Path.Combine(path,"se001.mp3");
             var url = new NSUrl(file, isDir: false);
             var url = new NSUrl(file, isDir: false);


50行目: 49行目:
===欠点===
===欠点===
AVFoundationということで同APIのサポートが(実用レベルで)追加された[[Xamarin.Mac]]の2015年中頃のバージョン以降に限定される。古い[[Xamarin.Mac]]を購入しバージョンアップしていない人や[[MonoMac]]の人は残念賞なようだ。なお、[[Xamarin.iOS]]もこの方法を利用できる。
AVFoundationということで同APIのサポートが(実用レベルで)追加された[[Xamarin.Mac]]の2015年中頃のバージョン以降に限定される。古い[[Xamarin.Mac]]を購入しバージョンアップしていない人や[[MonoMac]]の人は残念賞なようだ。なお、[[Xamarin.iOS]]もこの方法を利用できる。
==共通==
再生開始までのタイムラグを無くすため、音声再生に関するクラスインスタンスの生成はウインドウ初期化時(AwakeFromNibメソッド)などで行い、[[フィールド変数]]として保持しておくことが望ましい。
<source lang="csharp">
        AVAudioPlayer _player;
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();
            var path = Path.Combine(NSBundle.MainBundle.BundlePath, "Contents", "Resources");
            var file = Path.Combine(path,"se-033a.mp3");
            var url = new NSUrl(file, isDir: false);
            _player = AVAudioPlayer.FromUrl(url);
            _player.PrepareToPlay();
        }
        public override void MouseDown(NSEvent theEvent)
        {
            Task.Run(() => _player.Play());
        }
</source>
==連射音==
AVAudioPlayerでは1インスタンス1音の再生となる。
複数のスレッドから一斉にPlayメソッドを叩いた場合は最初の再生が終わるまで全部無効となる。
そのような場合は高速化など糞食らえで複数のインスタンスを生成する。
<source lang="csharp">
        public override void MouseDown(NSEvent theEvent)
        {
            Task.Run(() => {
                var path = Path.Combine(NSBundle.MainBundle.BundlePath, "Contents", "Resources");
                var file = Path.Combine(path,"se001.caf");
                var url = new NSUrl(file, isDir: false);
                var player = AVAudioPlayer.FromUrl(url);
                player.Play();
            });
            Console.WriteLine("click");
        }
</source>
注意点としては複数インスタンスでの同時再生はcafファイル(Apple CoreAudio フォーマット)に限られ、mp3ファイルなどは使用できない。
mp3ファイルなどからcafファイルへの変換はMac上のターミナルから[[afconvertコマンド]]でできる。


==関連項目==
==関連項目==