2

这个问题与这个有关。

我设法修改我的代码以使用 SoundPool 而不是 AudioManager。知道它或多或少地起作用。

public class Sound {

    private static boolean sound = true;

    private static final int EAT_SOUND = 1;
    private static final int SHORT_EAT_SOUND = 2;
    private static final int EAT_CHERRY_SOUND = 3;
    private static final int EAT_GHOST_SOUND = 4;
    private static final int EXTRA_LIVE_SOUND = 5;
    private static final int INTERMISSION_SOUND = 6;
    private static final int OPENING_SOUND = 7;
    private static final int PACMAN_DIES_SOUND = 8;
    private static final int SIREN_SOUND = 9;

    private static Context context;
    private static SoundPool soundPool;
    private static HashMap<Integer, Integer> soundPoolMap;

    public static void initializeOpenSound(Context con) {
        context = con;
        soundPool = new SoundPool(2, AudioManager.STREAM_RING, 100);
        soundPoolMap = new HashMap<Integer, Integer>();
        soundPoolMap.put(OPENING_SOUND, soundPool.load(context, R.raw.opening_song, 1));
    }

    public static void initializeSounds() {
        soundPoolMap.put(EAT_SOUND, soundPool.load(context, R.raw.eating, 1));
        soundPoolMap.put(SHORT_EAT_SOUND, soundPool.load(context, R.raw.eating_short, 1));
        soundPoolMap.put(EAT_CHERRY_SOUND, soundPool.load(context, R.raw.eating_cherry, 1));
        soundPoolMap.put(EAT_GHOST_SOUND, soundPool.load(context, R.raw.eating_ghoasts, 1));
        soundPoolMap.put(EXTRA_LIVE_SOUND, soundPool.load(context, R.raw.extra_lives, 1));
        soundPoolMap.put(INTERMISSION_SOUND, soundPool.load(context, R.raw.intermission, 1));
        soundPoolMap.put(PACMAN_DIES_SOUND, soundPool.load(context, R.raw.pac_man_dies, 1));
        soundPoolMap.put(SIREN_SOUND, soundPool.load(context, R.raw.siren, 1));
    }

    private static void playSound(int sound) {
        int streamID = soundPool.play(soundPoolMap.get(sound), 0.5f, 0.5f, 1, 0, 1f);
        if (sound == OPENING_SOUND) {
            soundPool.setLoop(streamID, 2);
        }
    }

    public static void playSirenSound() throws SoundInitializationError {
        if (isSoundOn()) {
            if (soundPoolMap.containsKey(SIREN_SOUND)) {
                System.out.println("Play Siren sound");
                playSound(SIREN_SOUND);
            } else {
                throw new SoundInitializationError("Siren Sound not initialized!");
            }
        }
    }

    public static void playPacmanDiesSound() throws SoundInitializationError {
        if (isSoundOn()) {
            if (soundPoolMap.containsKey(PACMAN_DIES_SOUND)) {
                System.out.println("Play Pacman Dies sound");
                playSound(PACMAN_DIES_SOUND);
            } else {
                throw new SoundInitializationError("Pacman Dies Sound not initialized!");
            }
        }
    }

    public static void playOpeningSound() throws SoundInitializationError {
        if (isSoundOn()) {
            if (soundPoolMap.containsKey(OPENING_SOUND)) {
                System.out.println("Play Opening sound");
                playSound(OPENING_SOUND);
            } else {
                throw new SoundInitializationError("Opening Sound not initialized!");
            }
        }
    }

    public static void playIntermissionSound() throws SoundInitializationError {
        if (isSoundOn()) {
            if (soundPoolMap.containsKey(INTERMISSION_SOUND)) {
                System.out.println("Play Intermission sound");
                playSound(INTERMISSION_SOUND);
            } else {
                throw new SoundInitializationError("Intermission Sound not initialized!");
            }
        }
    }

    public static void playExtraLiveSound() throws SoundInitializationError {
        if (isSoundOn()) {
            if (soundPoolMap.containsKey(EXTRA_LIVE_SOUND)) {
                System.out.println("Play Extra Live sound");
                playSound(EXTRA_LIVE_SOUND);
            } else {
                throw new SoundInitializationError("Extra Live Sound not initialized!");
            }
        }
    }

    public static void playEatSound() throws SoundInitializationError {
        if (isSoundOn()) {
            if (soundPoolMap.containsKey(EAT_SOUND)) {
                System.out.println("Play Eat Sound");
                playSound(EAT_SOUND);
            } else {
                throw new SoundInitializationError("Eat Sound not initialized!");
            }
        }
    }

    public static void playShortEatSound() throws SoundInitializationError {
        if (isSoundOn()) {
            if (soundPoolMap.containsKey(SHORT_EAT_SOUND)) {
                System.out.println("Play Short Eat sound");
                playSound(SHORT_EAT_SOUND);
            } else {
                throw new SoundInitializationError("Short Eat Sound not initialized!");
            }
        }
    }

    public static void playEatCherrySound() throws SoundInitializationError {
        if (isSoundOn()) {
            if (soundPoolMap.containsKey(EAT_CHERRY_SOUND)) {
                System.out.println("Play Eat Cherry sound");
                playSound(EAT_CHERRY_SOUND);
            }  else {
                throw new SoundInitializationError("Eat Cherry Sound not initialized!");
            }
        }
    }

    public static void playEatGhostSound() throws SoundInitializationError {
        if (isSoundOn()) {
            if (soundPoolMap.containsKey(EAT_GHOST_SOUND)) {
                System.out.println("Play Eat Ghost sound");
                playSound(EAT_GHOST_SOUND);
            }  else {
                throw new SoundInitializationError("Eat Ghost Sound not initialized!");
            }
        }
    }

    public static boolean isSoundOn() {
        return sound;
    }

    public static void setSoundOn(boolean b) {
        sound = b;
    }

}

但是,我有一个或多或少的大音频文件,我想在启动期间播放。但是,如果我调用 initializeOpenSound() 然后 playOpening Sound(),则不会播放声音并且 logcat 输出:

07-15 09:11:02.121: WARN/SoundPool(14273):   sample 1 not READY

在 SDK 2.2 中,我将使用SoundPool.OnLoadCompleteListener,但如何使用 SDK 2.1 实现相同的效果?

编辑:我也很乐意提供一个不包括听众或类似东西的解决方案,但要么尝试播放声音文件,直到它成功。

4

2 回答 2

1

从我所读到的,如果您在初始化后立即尝试播放声音,它将无法准备好,您将收到此错误。您可以制作一个加载页面,然后等待几秒钟,直到您确定声音已加载。

还要确保您的文件大小不超过 1048576 字节,这就是 Soundpool 的限制。如果你想播放背景音乐或其他东西,我认为你必须使用媒体播放器。

于 2010-07-20T16:59:55.723 回答
1

我为我在此处发布的 OnLoadCompleteListener 实现了一个后备实现。

于 2011-08-14T22:51:37.760 回答