Android KitKat上的SoundPool听起来口吃
在KitKat(API 19)上的Xamarin Android(而非Xamarin Forms)应用程序中,使用Visual Studio 2015 Update 3,我在播放Android KitKat上的SoundPool听起来口吃,android,xamarin,android-4.4-kitkat,soundpool,Android,Xamarin,Android 4.4 Kitkat,Soundpool,在KitKat(API 19)上的Xamarin Android(而非Xamarin Forms)应用程序中,使用Visual Studio 2015 Update 3,我在播放声音池中的声音时遇到问题。有时候我的声音很好听。有时它会口吃 最奇怪的是,在极少数情况下,播放会完全失败,调试日志中会出现如下警告: W/SoundPool(30751): sample 2 not READY 这是尽管我在尝试播放之前绝对积极地等待加载样本,并且尽管在“样本X未准备好”失败之前和之后,相同的样本I
声音池中的声音时遇到问题。有时候我的声音很好听。有时它会口吃
最奇怪的是,在极少数情况下,播放会完全失败,调试日志中会出现如下警告:
W/SoundPool(30751): sample 2 not READY
这是尽管我在尝试播放之前绝对积极地等待加载样本,并且尽管在“样本X未准备好”失败之前和之后,相同的样本ID播放得很好
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
是little-endian 16位PCM单声道音频,采样率为44100Hz,带有Microsoft“WAV”头。它是使用Audacity 2.1.3创建的0.25s 440Hz正弦波
我知道所有关于SoundPool.Builder
。它是在API 21中引入的。我的目标是API 19
实际代码在每次按下按钮后500毫秒内禁用该按钮,因此我不可能尝试同时播放该示例多次。事实上,我可以用相隔数十秒的单独按压重现这个问题
我尝试过但没有成功的事情:
- 调用
声音池时使用更小或更大的maxStreams
(第一个参数)值
- 调用
声音池时,使用不同的Android.Media.Stream
枚举值作为streamType
(第二个参数)
- 调用
SoundPool
ctor时使用不同的srcQuality
(第三个参数)值(尽管Android docco说它什么都不做,并且总是使用零)
- 调用
SoundPool.Load()
实例方法时,使用不同的优先级
(第三个参数)值
- 调用
SoundPool.Play()
实例方法时使用子单位音量参数(如0.99F
)
- 调用
SoundPool.Play()
实例方法时,使用不同的优先级(第四个参数)值
- 为我的声音资源使用不同的文件格式(MP3、OggVorbis)
这里包含了我的整个准备构建应用程序。除了MainActivity.cs
之外,这实际上只是一个模板应用程序
应用程序应该做什么:每次按下UI上的(一个也是唯一一个)按钮时都会发出嘟嘟声。它可能只会做前十几台印刷机。然后你会听到“巴贝普”或“比比”或“比比”或沉默
FWIW,每次使用MediaPlayer
时,相同的资源都可以正常播放
(编辑以链接一个简化和清理得多的.zip文件示例。)当您按下按钮时,是否希望它播放几次音调
,每次都有一个时间间隔?不,我只想为每次按下按钮播放一次音调
。在一段时间内,我也不允许再按任何按钮,这样就没有人会怀疑“因为我的手指在按钮上弹跳,所以听起来很奇怪吗?”我无法重现您的问题,因为它听起来“口吃”,在哪种情况下您会有这个问题?重现:在上面链接的.zip文件中构建应用程序。运行它。按“嘟嘟”按钮。它通常工作正常,但大约20次中有1次嘟嘟声会出错或丢失。我开始怀疑这可能与平台有关;我在安卓4.4.3的符号TC75上运行。另一个数据点:同样的测试程序在安卓棒棒糖(5.1.1)的符号TC75上完美运行。