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 项目在触发时随机播放/不播放的主要内容,如果未能解决你的问题,请参考以下文章