2010-10-03 100 views
6

我在Android Market上有一个应用程序,并且一直在使用SoundPool类来获取声音效果。我注意到,在Android API的所有部分中,这似乎导致了我最多的问题。例如:Android Soundpool问题

  • HTC Desire在播放WAV文件时出现问题(这会导致它随机锁定)。使用.OGG文件修复了这个

  • 在Droid的,如果超出在init建立呼叫的信道数:

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

手机会锁定。如果你可以想象在调试的困难!在我不拥有的手机上。它需要我的客户提供很多无私的帮助。将'4'更改为'16'消除了这个问题。我毫不怀疑,如果16个声音同时播放,它仍然会崩溃。幸好这个机会很低。

  • 在各种设备上也出现随机崩溃。我从我的一个客户那里得到了一个有关播放声音的“堆溢出”错误的猫。

我现在已将我的声音管理器更改为使用MediaPlayer。这似乎现在工作良好。我只是想知道是否有其他开发者遇到这些问题?

+0

请帮帮我,谢谢... [机器人的Soundpool错误] [1] [1]:http://stackoverflow.com/questions/29199164/android-soundpool-错误 – 5h177y 2015-03-23 18:54:52

回答

4

似乎 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"); 
} 

任何人都更了解?