Android Soundpool 问题

Posted

技术标签:

【中文标题】Android Soundpool 问题【英文标题】:Android Soundpool problems 【发布时间】:2010-10-03 18:24:28 【问题描述】:

我在 android Market 上有一个应用程序,并且一直在使用 SoundPool 类来制作音效。我注意到,在 Android API 的所有部分中,这似乎给我带来了最多的问题。例如:

HTC Desire 在播放 WAV 文件时出现问题(这会导致它随机锁定)。使用 .ogg 文件可以解决此问题

在 Droid 上,如果您超过了 init 设置调用中的通道数:

mSoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);

手机会锁定。如果你能想象调试的难度那!在我不拥有的手机上。这需要我的客户提供很多无私的帮助。将“4”更改为“16”消除了该问题。我毫不怀疑,如果同时播放 16 个声音,它仍然会崩溃。值得庆幸的是,这种可能性很小。

还在各种设备上随机崩溃。我从我的一位客户那里得到了一份目录,其中包含与播放声音有关的“堆溢出”错误。

我现在已将声音管理器更改为使用 MediaPlayer。目前这似乎效果很好。我只是想知道是否有其他开发人员遇到这些问题?

【问题讨论】:

请帮帮我,谢谢... [android soundpool error][1] [1]: ***.com/questions/29199164/android-soundpool-error 【参考方案1】:

似乎AudioFlinger 可以在任何给定时间播放高达 1 Mb 的音频。 如果超出此限制,则会发生堆错误。这个猜测是基于我在AudioFlinger源代码中找到的一些代码:

AudioFlinger::Client::Client(const sp<AudioFlinger>& audioFlinger, pid_t pid) 
     :   RefBase(), 
         mAudioFlinger(audioFlinger), 
         mMemoryDealer(new MemoryDealer(1024*1024)), 
         mPid(pid) 
 
     // 1 MB of address space is good for 32 tracks, 8 buffers each, 4 KB/buffer 
 

还有这个:

size_t size = sizeof(audio_track_cblk_t); 
size_t bufferSize = frameCount*channelCount*sizeof(int16_t); 
if (sharedBuffer == 0)  
    size += bufferSize; 
 
mCblkMemory = client->heap()->allocate(size); 
if (mCblkMemory != 0) 
    ...
 else 
    LOGE("not enough memory for AudioTrack size=%u", size); 
    client->heap()->dump("AudioTrack"); 

还有其他人更了解情况吗?

【讨论】:

以上是关于Android Soundpool 问题的主要内容,如果未能解决你的问题,请参考以下文章

Android - 连续音频播放?

SoundPool 停止功能未停止

单击按钮时如何发出随机声音?

Sound Pool 只播放一次声音

SoundPool 加载缓慢,MotionEvent 很奇怪

Android 11 上的 SoundPool 问题