上QQ阅读APP看书,第一时间看更新
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);