4.3 使用AudioEngine

SimpleAudioEngine一般情况下已经足以满足需求了,除非需要实现一些更加精确、深入的控制,或者策划提出了更加复杂的需求(如在Win32下控制每个音效的音量),才需要用到更强大的AudioEngine。在学习AudioEngine之前,先来看一下它的命名空间——experimental,这是试验中的意思,所以在其稳定之前,建议尽量不要使用。

虽然还在试验中,但并不妨碍我们先了解一下其新功能。从接口上来看,AudioEngine并没有音乐和音效的区别,可以使用AudioProfile来配置每一种声音最多同时播放的实例数、声音播放的最小时间间隔。相比SimpleAudioEngine,我们并不能控制每个音效的频率和声道,但一般也不需要使用这两个特性。另外在AudioEngine中,可以动态控制每个声音的循环、音量、播放进度等有用的属性。AudioEngine还提供了异步加载的接口,还可以设置声音加载完成和播放结束的回调。接下来看一下AudioEngine的相关接口。

        //初始化AudioEngine
        static bool lazyInit();
        //释放AudioEngine
        static void end();

        //获取默认的AudioProfile指针
        //AudioProfile是一个结构体,用于描述一个声音的播放规则
        //包含了名字、最大实例、两次播放的最小间隔
        static AudioProfile* getDefaultProfile();
        //播放2D音效(难道以后会增加3D音效?),参数的意义如下
            filePath声音文件名
            loop是否循环
            volume音量
        //profile AudioProfile指针,传入空会自动使用DefaultProfile
        //该方法会返回一个声音ID,通过该声音ID可以动态控制这个声音
        static int play2d(const std::string& filePath, bool loop = false, float
        volume = 1.0f, const AudioProfile *profile = nullptr);
        //设置指定声音实例的循环属性
        static void setLoop(int audioID, bool loop);
        //判断一个声音实例是否循环
        static bool isLoop(int audioID);
        //设置指定声音实例的音量属性,音量范围为0.0~1.0
        static void setVolume(int audioID, float volume);
        //获取一个声音实例的音量
        static float getVolume(int audioID);
        //暂停一个声音实例的播放
        static void pause(int audioID);
        //暂停所有的声音
        static void pauseAll();
        //恢复一个被暂停的声音
        static void resume(int audioID);
        //恢复所有被暂停的声音
        static void resumeAll();
        //停止一个声音实例的播放
        static void stop(int audioID);
        //停止播放所有声音
        static void stopAll();
        //设置指定声音实例当前播放的进度,sec的单位为秒
        static bool setCurrentTime(int audioID, float sec);
        //获取指定声音实例当前播放了多少秒
        static float getCurrentTime(int audioID);
        //获取指定声音实例的总时长
        static float getDuration(int audioID);
        //获取指定声音实例当前的状态,有以下4种状态
            ERROR错误
            INITIALIZING加载中
            PLAYING播放中
            PAUSED暂停中
        static AudioState getState(int audioID);
        //设置当指定声音实例播放完的回调函数,回调函数会传入声音ID和声音文件名作为参数,没有
        返回值
        static void setFinishCallback(int audioID, const std::function<void
        (int, const std::string&)>& callback);
        //获取最大的声音实例数(限制)
        static int getMaxAudioInstance() {return _maxInstances; }
        //设置最大的声音实例数
        static bool setMaxAudioInstance(int maxInstances);
        //卸载指定声音文件的缓存
        static void uncache(const std::string& filePath);
        //卸载所有声音文件的缓存
        static void uncacheAll();
        //获取指定声音实例的AudioProfile配置指针
        static AudioProfile* getProfile(int audioID);
        //根据AudioProfile的名字来获取AudioProfile配置指针
        static AudioProfile* getProfile(const std::string &profileName);
        //传入声音文件名,异步加载该声音文件
        static  void  preload(const  std::string&  filePath)  {  preload(filePath,
        nullptr); }
        //传入声音文件名和加载完成的回调,异步加载该声音文件
        //回调函数会传入文件加载是否成功作为参数
        static void preload(const std::string& filePath, std::function<void(bool
        isSuccess)> callback);