Звуки не воспроизводятся, когда петли установлены на -1 на Android - PullRequest
1 голос
/ 03 января 2012

Я использую SoundPool для воспроизведения звуков для моего приложения для Android. Все звуки загружаются в начале приложения, чтобы предотвратить любые задержки во время самого приложения. Все звуки воспроизводятся нормально до тех пор, пока они не настроены на зацикливание. Когда для петли установлено значение true (установлено значение -1), звук не воспроизводится.

Существует 6 различных звуков, которые останавливаются и запускаются в зависимости от ввода пользователя. Он воспроизводит первый звук нормально, но потом не воспроизводится.

Я пытался обойти это различными способами, такими как приостановка, а не остановка, установка громкости на 0 и зацикливание на 0, а не приостановка, установка зацикливания на произвольное число с большим ишем, а не на повторение true, делая звуки намного короче ни один из них не сработал.

Мой код выглядит следующим образом:

public int loadSound(int soundFile)
{
    int soundID;

    try
    {
        if (m_loadedSounds.containsKey(soundFile))
        {
            soundID = m_loadedSounds.get(soundFile);
        }
        else
        {           
            soundID = m_soundPool.load(m_context, soundFile, 1);
            m_loadedSounds.put(soundFile, soundID);
        }
    }
    catch (Exception e)
    {
        soundID = -1;
    }

    return soundID;
}

public void playSound(int soundFile, boolean loop)
{
    // Grab it from the map
    int soundID = loadSound(soundFile);

    int loops = loop ? -1 : 0;
    float streamVolume = m_audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    streamVolume /= m_audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

    // If succeeded then play the sound
    if (soundID != -1)
    {
        if (m_soundStreams.containsKey(soundID))
        {
            int streamID = m_soundStreams.get(soundID);
            m_soundPool.setLoop(streamID, loops);
            m_soundPool.resume(streamID);
        }
        else
        {
            int streamID = m_soundPool.play(soundID, streamVolume, streamVolume, 1, loops, 1.0f);
            Log.d("SOUNDS", "Sound played! ID: " + soundID + " At volume: " + streamVolume + " Looping: " + (loop ? "Yes": "No") + " Success: " + (streamID != 0 ? "Yes" : "No"));

            if (streamID != 0) 
            {
                m_soundStreams.put(soundID, streamID);
            }
        }
    }
}

public void stopSound(int soundFile)
{
    int soundID = loadSound(soundFile);

    Integer streamID = m_soundStreams.get(soundID);

    if (streamID != null)
    {
        m_soundPool.pause(streamID); 
    }
}

И ошибка, выдаваемая в LogCat во время выполнения:

01-03 16:03:20.142: ERROR/AudioFlinger(2359): not enough memory for AudioTrack size=670096
01-03 16:03:20.142: DEBUG/MemoryDealer(2359):   AudioTrack (0x389a0, size=1048576)
01-03 16:03:20.142: DEBUG/MemoryDealer(2359):     0: 0005b090 | 0x00000000 | 0x00010080 | F 
01-03 16:03:20.142: DEBUG/MemoryDealer(2359):     1: 0006db58 | 0x00010080 | 0x0007B8A0 | A 
01-03 16:03:20.142: DEBUG/MemoryDealer(2359):     2: 0005af70 | 0x0008B920 | 0x0005C280 | A 
01-03 16:03:20.142: DEBUG/MemoryDealer(2359):     3: 000752c0 | 0x000E7BA0 | 0x00018460 | F 
01-03 16:03:20.142: DEBUG/MemoryDealer(2359):   size allocated: 883488 (862 KB)
01-03 16:03:20.142: ERROR/AudioTrack(11584): AudioFlinger could not create track, status: -12
01-03 16:03:20.142: ERROR/SoundPool(11584): Error creating AudioTrack

Кто-нибудь знает какие-либо решения этой надоедливой проблемы или какие-либо обходные пути, которые я не пробовал?

Ответы [ 3 ]

1 голос
/ 04 января 2012

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

0 голосов
/ 05 октября 2012

У меня была такая же проблема. Когда вы начинаете воспроизводить звук, который хотите зациклить, установите приоритет звука на 99 и уменьшите остальные. Чем выше значение, тем выше приоритет. Однако у меня большая проблема с задержкой при воспроизведении звуков. Если у вас есть какое-либо решение, пожалуйста, сообщите мне. (Я также использую soundpool и массив int в качестве пула идентификаторов.)

Which I mean:
int streamID = m_soundPool.play(soundID, streamVolume, streamVolume, 99, loops, 1.0f);
0 голосов
/ 04 января 2012

Убедитесь, что вы освобождаете ресурсы SoundPool в onPause () для предотвращения утечки памяти.Вы также должны загружать свои звуки в onResume ().

...