SoundPool 项目在触发时随机播放/不播放

Posted

技术标签:

【中文标题】SoundPool 项目在触发时随机播放/不播放【英文标题】:SoundPool items randomly playing/not playing when triggered 【发布时间】:2019-10-01 17:53:18 【问题描述】:

我需要在 SoundPool 中播放一些声音。有时当他们应该播放时,只有低调的咔哒声而不是应该播放的声音。有时他们玩得很好。

这是我用于 SoundPool 的代码:

open class PingSoundPool(context: Context) 

open var mAttributes = AudioAttributes.Builder()
    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
    .setUsage(AudioAttributes.USAGE_GAME)
    .build()

open var mSoundPool = SoundPool.Builder()
    .setMaxStreams(9)
    .setAudioAttributes(mAttributes)
    .build()

open var babping = mSoundPool.load(context, R.raw.ab830ping, 1)
open var aaping = mSoundPool.load(context, R.raw.a220ping, 1)
open var abbping = mSoundPool.load(context, R.raw.bb233ping, 1)
open var abping = mSoundPool.load(context, R.raw.b247ping, 1)
[and others]

open fun loadPings(note: Int) 
println(note.toString())
if (note == 0) 
if(note == 1)
    mSoundPool.play(acping, 2.55f, 2.55f, 1, 0, 1f)
if(note == 2)
mSoundPool.play(adbping, 2.5f, 2.5f, 1, 0, 1f)
if(note == 3)
    mSoundPool.play(adping, 2.45f, 2.45f, 1, 0, 1f)
if(note == 4)
    mSoundPool.play(aebping, 2.4f, 2.4f, 1, 0, 1f)
[and so on]

现在我可以在我的活动中访问它:

companion object 
lateinit var pingSoundPool: PingSoundPool

在 onCreate 中我做pingSoundPool = PingSoundPool(this)

像这样,我应该可以使用FullscreenActivity.pingSoundPool.loadPings(note: Int) 播放这些声音中的任何一个 - 如上所述,这有时有效,有时无效,即使是重复相同的声音。

一个观察结果是println(note.toString()) 打印对应于应该播放的音符的 Int,而不管该音符是否真的可以被听到。但是,每次实际播放音符时,该数字后面都会跟着W/AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client; transfer 4, track 44100 Hz, output 48000 Hz - 所有这些都会出现在 android Studio 的 logcat 中。

这发生在模拟器和真实设备上。

有什么想法吗?

【问题讨论】:

你的OnLoadCompleteListener在哪里? 我没有。加载声音是启动时的第一件事,文件不是那么大,当需要它们时,它们就被加载了。我没有收到sample X not ready. 消息,所以它不应该与我的问题有关。还是应该? 【参考方案1】:

解决方案是:体积只接受从 0.0f 到 1.0f 的值。我尝试将它们全部设置为 1.0f,现在它工作正常。

if(note == 4) mSoundPool.play(aebping, 2.4f, 2.4f, 1, 0, 1f) // wrong
if(note == 4) mSoundPool.play(aebping, 1.0f, 1.0f, 1, 0, 1f) // right

【讨论】:

以上是关于SoundPool 项目在触发时随机播放/不播放的主要内容,如果未能解决你的问题,请参考以下文章

Android SoundPool 不播放声音

如何正确释放 SoundPool 对象?

同时播放多个 SoundPool

Android SoundPool 不播放 wav 格式的声音

SoundPool 不播放声音

Android使用SoundPool播放语音,并实现按顺序延时播放