MonoTouch:播放声音

Pey*_*man 4 c# avaudioplayer xamarin.ios audiotoolbox ios

当用户点击特定按钮时,我正在尝试播放短促的声音.但问题是我总是收到未设置为实例对象的Object引用.意味着空虚!

我首先尝试了MonoTouch.AudioToolBox.SystemSound.

MonoTouch.AudioToolbox.AudioSession.Initialize();   
MonoTouch.AudioToolbox.AudioSession.Category = MonoTouch.AudioToolbox.AudioSessionCategory.MediaPlayback;   
MonoTouch.AudioToolbox.AudioSession.SetActive(true);   

var t = MonoTouch.AudioToolbox.SystemSound.FromFile("click.mp3");
t.PlaySystemSound();
Run Code Online (Sandbox Code Playgroud)

让我注意到"click.mp3"在我的根解决方案文件夹中,它被标记为内容.另一种方法是MonoTouch.AVFoundation.AVAudioPlayer.

var url = NSUrl.FromFilename("click.mp3");
AVAudioPlayer player = AVAudioPlayer.FromUrl(url);
player.FinishedPlaying += (sender, e) => { player.Dispose(); };
player.Play();
Run Code Online (Sandbox Code Playgroud)

但同样的错误.我用谷歌搜索它,我发现很多人都有这个问题.我们需要知道它是否是一个bug.

pou*_*pou 7

关于使用SystemSoundMP3看到这个问题和答案:用Monotouch播放声音

AVAudioPlayer注意以下模式是危险的:

AVAudioPlayer player = AVAudioPlayer.FromUrl(url);
player.FinishedPlaying += (sender, e) => { player.Dispose(); };
player.Play();
Run Code Online (Sandbox Code Playgroud)

因为Play是异步的.这意味着托管player实例在FinishedPlaying发生之前可能超出范围.反过来,这超出范围意味着GC可能已经收集了实例.

解决此问题的方法是将player局部变量提升为类型字段.这将确保GC在播放声音时不会收集实例.