当前位置: 首页 > 面试题库 >

我怎么知道Soundpool已经准备就绪,可以使用低于2.2的SDK目标?

林俊晖
2023-03-14
问题内容

我设法将代码修改为使用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来实现相同目的?

编辑:我也很乐意提供一个不包含侦听器或类似功能的解决方案,但可以尝试播放声音文件直到成功为止。


问题答案:

从我阅读的内容来看,如果您尝试在初始化声音后立即播放声音,它将无法准备就绪,并且会出现此错误。您可以制作一个加载页面,然后等待几秒钟,直到确定声音已加载。

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



 类似资料:
  • 我无法创建某个docker容器,因为jenkins告诉我该名称已在使用中。 我已尝试查找或删除此容器,但无法执行以下操作: 容器是通过jenkins构建的,在不同的构建中,总是有相同的容器id在使用中被否认。我们有八个不同的jenkins节点,这项工作在其中七个节点上工作,创建和删除具有该名称的docker图像。 如何移除这个“幽灵”容器?Allready尝试了但没有成功:

  • 本文向大家介绍C#判断指定驱动器是否已经准备就绪的方法,包括了C#判断指定驱动器是否已经准备就绪的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#判断指定驱动器是否已经准备就绪的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 在为kubernetes吊舱做健康检查的时候,为什么在我们已经保持了准备状态探测器的情况下还需要活性探测器呢? Readision probe已经在检查pod中的应用程序是否准备好为请求提供服务,这意味着pod是活动的。但是,为什么要进行活性探测呢?

  • 我遇到了一个问题: 获取健康检查以成功。尝试使用容器本机负载平衡(CNLB)时,在IIS容器中运行的Net app。 我有一个网络endpoint组(NEG),由GKE中的入口资源定义和VPC本机集群创建。 当我通过公开NodePort或制作LoadBalancer类型的服务来规避CNLB时,站点会毫无问题地解决。 所有的吊舱条件从一个描述看起来不错:吊舱准备就绪 运行时会显示网络endpoint

  • 使用glide在recyclerview imageview项目上加载图像。我意识到图像资源已经准备好了,但图像并没有显示在imageview中。当我添加imageview时。setDrawable(resource)在glide listener onResourceRady中,然后图像显示出来,但在正常情况下,这里不显示我的代码,我感谢任何帮助。 //持有者。img。setImageDrawa

  • 我是测试新手,我正在使用codeception和phpunit来做一些TDD。 然而,我的方法有很多代码。我是否使用了最佳实践?有没有一种方法可以提高我的代码的就绪性,它能更干净吗?