Xamarin.Mac/効果音を再生する
< Xamarin.Mac
ナビゲーションに移動
検索に移動
2015年9月30日 (水) 09:03時点における126.213.8.155 (トーク)による版 (ページの作成:「 Xamarin.Macで効果音を再生したい。 ==実装== ==NSSoundを使う== NSSoundを使うと簡単に効果音を再生できる。 <source lang="csharp">...」)
Xamarin.Macで効果音を再生したい。
実装
NSSoundを使う
NSSoundを使うと簡単に効果音を再生できる。
var path = Path.Combine(NSBundle.MainBundle.BundlePath, "Contents", "Resources");
var file = Path.Combine(path,"se-033a.mp3");
var sound = new NSSound(file, byRef:false);
sound.Play();
利点
MonoMacからXamarin.MacやXamarin.iOSまでアップル系プラットフォームであれば新旧を問わず幅広く利用できる。
欠点
NSSoundはメインスレッドでしか使用できないという欠点を抱えている。 しかも画像系APIと異なり、メインスレッド以外で実行しても効果音の再生がされないだけでエラーにはならない。
これに気がつかずバグったときのデバッグで苦しむことになるかもしれない。
AVFoundationのAVAudioPlayerを使う
AVAudioPlayerを使用しても簡単に効果音を再生できる。 現状ではベストな方法ではないかと思われる。
var path = Path.Combine(NSBundle.MainBundle.BundlePath, "Contents", "Resources");
var file = Path.Combine(path,"se-033a.mp3");
var url = new NSUrl(file, isDir: false);
var player = AVAudioPlayer.FromUrl(url);
player.PrepareToPlay();
player.Play();
利点
AVAudioPlayerはアプリ外部の音声関連サービスに再生を依頼する方式であるため、メインスレッドでなくても問題なく使用できるという利点がある。 このため再生処理を以下のようにスレッドプールに逃がすことでメインスレッドが占有されることもなくなる。
Task.Run( () => player.Play() );
また、PrepareToPlayメソッドで即時再生用にメモリに先読みしておくこともできるため初回再生が若干遅いということもない。
欠点
AVFoundationということで同APIのサポートが(実用レベルで)追加されたXamarin.Macの2015年中頃のバージョン以降に限定される。古いXamarin.Macを購入しバージョンアップしていない人やMonoMacの人は残念賞なようだ。なお、Xamarin.iOSもこの方法を利用できる。
関連項目
- MonoMac/AppleScriptを実行する
- MonoMacにはNSAppleScriptクラスが存在しないため別の手段を使う必要がある。