Подтвердить что ты не робот

Ошибка SoundPool: больше нет названий дорожек

У меня проблемы с классом soundpool. Вот оно:

В моем приложении для игры (музыкальное приложение btw) мне нужно воспроизвести как минимум 32 коротких звука одновременно, поэтому я объявляю свой звуковой пул следующим образом:

private SoundPool sp;
sp = new SoundPool(128, AudioManager.STREAM_MUSIC, 0);

После этого я загружаю все необходимые звуки MP3, около 80 звуков по 55 КБ каждый. У меня нет проблем, загружающих все звуки, но медленно! Ну, это не проблема. Настоящая проблема заключается в том, что одновременно воспроизвожу около 20 звуков, в моем журнале произошла ошибка:

ERROR/AudioFlinger(59): no more track names available
ERROR/AudioTrack(26349): AudioFlinger could not create track, status: -12
ERROR/SoundPool(26349): Error creating AudioTrack

После этого каждый звук, который я пытаюсь воспроизвести, вызывает ту же ошибку, и звук не воспроизводится. Даже звуки другого Activity/soundpool. Я понятия не имею, что происходит или как это исправить! Должен ли я изменить формат звуковых файлов? Должен ли я освобождать память или что-то после воспроизведения звука?

(Я тестирую систему Samsung Galaxy S I9000, 2.3.3, приложение 2.1)

4b9b3361

Ответ 1

см. this (в группе android)

Для аудио существует жесткий предел 32 активных объектов AudioTrack для каждого устройства (не для приложения: вам нужно разделить эти 32 с остальной частью системы),

Ответ 2

Несколько мыслей здесь. Один: первый параметр для конструктора SoundPool - это не количество звуков, которые вы хотите загрузить в него, это максимальное количество одновременных потоков, которые вы будете воспроизводить. Во-вторых, SoundPool имеет ограниченную память для звуков, около 1 МБ. Поэтому я не удивлюсь, если вы нажмете недокументированный лимит на количество треков, которые вы можете загрузить за один раз. Обратите внимание, что 80 звуков раз 55k за звук определенно превышает 1MB. И этот предел заключается в том, что после того, как mp3s были несжаты в аудиоданные внутри SoundPool.