Bezdepbonusu7Программирование: статьи и ответы

Вопрос

SoundPool перестает играть

Автор вопроса: user1555863Ответов: 3

У меня есть кнопка, при нажатии на которую звучит короткий звуковой эффект с SoundPool. файл 16k mp3.
Звуковой эффект работает для сотен нажатий кнопок, но в какой-то момент я получаю эту ошибку (и звук больше не воспроизводится для нажатий):

E/AudioFlinger(   34): no more track names available
E/AudioTrack(  904): AudioFlinger could not create track, status: -12
E/SoundPool(  904): Error creating AudioTrack
W/AudioFlinger(   34): write blocked for 81 msecs, 4573 delayed writes, thread
xb3f0

при создании:

setVolumeControlStream(AudioManager.STREAM_MUSIC);
soundpool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
soundpool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
    @Override
    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
        // TODO Auto-generated method stub
        loaded = true;
    }
});

//save the effect somewhere:
MyUtil.regularSound = soundpool.load(this, R.raw.regular_click,1);

по щелчку:

AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
float actualVol = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVol = (float) audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float vol = actualVol/maxVol;
if (loaded) {
    soundpool.play(MyUtil.regularSound,vol,vol,1,0,1f);
}

перед началом другого намерения:

Intent i = new Intent(con, EndScreen.class);
if (soundpool != null) {
    soundpool.release();
    soundpool = null;
}
startActivity(i);
  • Мои 2 цента: возможно, выпуск звукового пула не был обработан (GC) и что слот все еще активен в отношении звукового пула. вы установили maxstreams на 10. Просто мысль. opaque 24.09.2012

androidsoundpool

Ответы

Ответ 1 · рейтинг 3 · Angelo

Я просто провел несколько часов с той же проблемой.

Ошибка -12 означает, что звуку, выделенному приложению, не хватает памяти. использование .finish() не освобождает память SoundPool. Вы должны использовать .release().

В моем приложении у меня есть soundPool.release() для метода onclick, который запускает следующее действие,

Изменение звуковых форматов мне тоже не помогло.

Ответ 2 · Sebastian

Я получаю ту же ошибку. Что я сделал, так это попытался пересэмплировать трек, преобразовать его в формат OGG и изменить качество на 0. Я сделал все это с помощью Аудасити

Ответ 3 · Quang Long

Вы попробуйте закодировать это: здесь

    /*
    private SoundPool mSoundPool;
    private SparseArray<Integer> mSoundPoolMap;
    private AudioManager mAudioManager;
    */
    public static void clear() {
        if (mSoundManager != null) {
            mSoundManager.mSoundPool = null;
            mSoundManager.mAudioManager = null;
            mSoundManager.mSoundPoolMap = null;
        }
        mSoundManager = null;
    }

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы