在使用Visual Studio 2015 Update 3的KitKat(API 19)上的Xamarin Android(非Xamarin Forms)应用程序中,我无法播放来自SoundPool
的声音。有时我的声音很好。其他时候它口吃。
最奇怪的是,在极少数情况下,播放完全失败并在调试日志中发出警告,如:
W/SoundPool(30751): sample 2 not READY
尽管事实上我在尝试播放之前已经绝对肯定地等待加载样本,尽管相同的样本ID 在之前和之后立即播放 / strong>"样本X未准备好"故障。
TL;代码的dr版本:
var Pool = new SoundPool(6, Stream.Music, 0);
var ToneID = await Pool.LoadAsync(Android.App.Application.Context, Resource.Raw.tone, 1);
beepButton.Click += (sender, e) => Pool.Play(ToneID, 1.0F, 1.0F, 1, 0, 1.0F);
Resource.Raw.tone
是小端16位PCM单声道音频,采样率为44100Hz,微软" WAV"头。它是使用Audacity 2.1.3创建的0.25s 440Hz正弦波。
我完全了解SoundPool.Builder
。它是在API 21中引入的。我以API 19为目标。
实际代码在每次按下后禁用按钮500ms,因此我不可能同时尝试多次播放样本。实际上,我可以通过相隔数十秒的单独按压来重现问题。
我尝试过的事情没有成功:
maxStreams
ctor SoundPool
(第一个arg)值
Android.Media.Stream
ctor时使用streamType
(第二个arg)的不同SoundPool
枚举值srcQuality
ctor时使用不同的SoundPool
(第三个arg)值(尽管Android docco说它什么都不做并且总是使用零)priority
实例方法时使用不同的SoundPool.Load()
(第三个arg)值0.99F
实例方法时使用子统一卷参数(如SoundPool.Play()
)priority
实例时使用不同的SoundPool.Play()
(第四个arg)值mehtod 这是a .zip file,包含我的整个准备构建的应用程序。除了MainActivity.cs
之外,这基本上只是模板应用。
应用程序应该做什么:每次按下UI上的(一个且唯一的)按钮时发出哔声。这可能只是前十几次按下左右。但是你会听到" BaBeep"或者" BeeeeBip"或者"蜜蜂<暂停>发出哔哔声"或沉默。
FWIW,每次使用MediaPlayer
时,相同的资源都可以正常播放。
(编辑链接一个非常简化和清理的.zip文件示例。)