Как воспроизвести более 32 звуков с помощью SoundPool?

Поскольку на мой последний вопрос не был дан ответ, где я использовал простой медиаплеер (Звук иногда молчит при воспроизведении нескольких звуков подряд, почему?) и попытался создать все это с помощью SoundPool. Но знаете что, происходит почти то же самое, но с ошибкой

AudioFlinger could not create track, status: -12
Error creating AudioTrack

Я читал о том, что в памяти звукового пула может храниться не более 32 звуков, тогда я получаю ошибку. Правильно, после 32-го звука я не могу воспроизвести ни один из звуков, так как всегда получаю ошибку. Итак, как я могу использовать более 32 звуков с SoundPool? Пробовал использовать 3 саундпула по 20 звуков в каждом, и всегда выгружаю весь звук из других пулов вот этим:

    mSoundPoolMapV1.clear();  //clearing HashMap
    for(int i=1;i<15;i++){
    mSoundPoolV1.unload(i);  
    }

Но снова появляется та же ошибка. (Я использую 22k звуков вместо 44.1k, я читал, что это может решить эту проблему, но ничего не произошло) Любые предложения приветствуются. Какого черта я не могу воспроизвести около 50 звуков ни медиаплеером, ни саундпулом? Как это возможно??

С release() :

    mSoundPoolMap.clear();
    for(int i=1;i<50;i++){
    mSoundPool.unload(i);
    }
    mSoundPool.release();

    mSoundPoolMap.put(1, mSoundPool.load(Main.this, R.raw.sound1, 1));
    ...
    mSoundPoolMap.put(50, mSoundPool.load(Main.this, R.raw.sound50, 1));

Итак, я очищаю hashmp, затем выгружаю все звуки, затем освобождаю звуковой пул. Затем я снова заполняю хэш-карту, но теперь она вообще не дает мне звука. Я должен что-то пропустить, не могли бы вы сказать мне что?


person Jani Bela    schedule 24.10.2012    source источник


Ответы (2)


В AudioMixer есть ограничение, позволяющее использовать только 32 AudioTracks одновременно. SoundPool попытается создать AudioTrack всякий раз, когда он начнет воспроизведение одного из каналов (я думаю, это соответствует сэмплу), принадлежащих пулу. Однако дорожка не уничтожается до тех пор, пока вы не уничтожите SoundPool, поэтому имя дорожки останется выделенным, даже если она была остановлена.

Вы можете попробовать позвонить release() на свой SoundPool. Это должно привести к уничтожению родного объекта SoundPool, тем самым уничтожив все созданные им AudioTracks и освободив их имена в AudioMixer.

person Michael    schedule 24.10.2012
comment
Я отредактировал свой код, освободив пул, но у меня не воспроизводится звук, когда я нажимаю кнопку. Я что-то пропустил? - person Jani Bela; 24.10.2012
comment
Никогда не играли или только что выпустили первую партию и попытались загрузить/воспроизвести другую партию? Может помочь, если вы опубликуете журналы, сделанные с вашим последним кодом. - person Michael; 24.10.2012
comment
в onCreate я загружаю их, и их можно воспроизвести, затем я нажимаю кнопку, которая выполняет верхний код, который я написал (также отпуская), тогда звуки не могут воспроизводиться. - person Jani Bela; 24.10.2012
comment
После вызова release() вы должны создать новый SoundPool. Как указано в документации для SoundPool.release(): SoundPool больше нельзя использовать, и для ссылки должно быть установлено значение null. - person Michael; 24.10.2012
comment
Спасибо, позор мне, я пропустил эту часть. Спасибо за помощь, теперь все работает! Надеюсь, так и останется в будущем :) - person Jani Bela; 24.10.2012

Базовое звуковое оборудование не безгранично. Вы можете удерживать в памяти только определенное количество звуков одновременно. Когда я создавал библиотеку 3D-аудио для настольных компьютеров, ограничение было переменным, поэтому перед запуском мне приходилось запрашивать ограничение у оборудования, иначе это могло привести к, казалось бы, случайным сбоям. Вы должны иметь один SoundPool и просто загружать и выгружать звуки по мере необходимости. Затем вам нужно установить какой-то приоритет для звуков, которые должны воспроизводиться, чтобы вы могли убедиться, что звуки, которые вам действительно нужны, не будут выгружены для воспроизведения дополнительного фонового шума.

В документации SoundPool действительно есть действительно хорошее описание типичного варианта использования. .

person CaseyB    schedule 24.10.2012
comment
Спасибо за документ, у меня было некоторое время, чтобы прочитать его и нашел его очень полезным! - person Jani Bela; 26.10.2012