Проблемы с звуковым пулом Android

У меня есть приложение на Android Market, и я использую классы SoundPool для звуковых эффектов. Я заметил, что из всех частей Android API это, кажется, вызвало у меня больше всего проблем. Например:

  • HTC Desire имеет проблемы с воспроизведением файлов WAV (это приводит к случайной блокировке). Использование файлов .ogg исправляет это

  • На Droid при превышении количества каналов в вызове init setup:

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

трубка заблокировалась. Если вы можете себе представить сложность отладки этого! На телефоне, которого у меня нет. Это потребовало большой бескорыстной помощи от моих клиентов. Замена «4» на «16» устранила проблему. Я не сомневаюсь, что если бы одновременно воспроизводились 16 звуков, он бы все равно вылетел. Благо шансы на это невелики.

  • Также возникают случайные сбои на различных устройствах. У меня есть каталог от одного из моих клиентов, в котором есть ошибки «Переполнение кучи», относящиеся к воспроизведению звуков.

Теперь я изменил свой звуковой менеджер, чтобы использовать MediaPlayer. Кажется, сейчас это работает нормально. Мне просто интересно, есть ли у других разработчиков такие проблемы?


person Kevin    schedule 03.10.2010    source источник
comment
пожалуйста, помогите мне здесь, спасибо ... [ошибка звукового пула Android] [1] [1]: stackoverflow.com/questions/29199164/android-soundpool-error   -  person 5h177y    schedule 23.03.2015


Ответы (1)


Кажется AudioFlinger может иметь до 1 Мб аудио, происходящего в любой момент времени. Ошибки кучи возникают, если этот предел превышен. Это предположение основано на коде, который я нашел в исходном коде 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"); 
}

Кто-нибудь еще лучше информирован?

person volley    schedule 21.04.2011