【游戏编程】分享一个FMOD 的编程实例
2015-09-10 19:50
609 查看
实例代码:点击打开链接FMOD 4.44:点击打开链接FMOD 4.44 Disigener :点击打开链接FMOD是一个非常简单通用的音频引擎,可以在Windows, WinCE, Linux, GameCube Xbox等平台上很好运行.FMOD是一个共享软件,如果不用于商业用途可以免费使用,商业用途需要付费100美金.FMOD将它细分在两个API中.他们分别是FSOUND和FMUSIC,所有的MUSIC如:mod、s3m、xm、it、mid、rmi、sgt、fsb 都通过FMUSIC 这个API来播放。FSOUNDAPI是提供给压缩格式使用的,文件一般如:wav,mp3,ogg,raw等这些格式,你都可以通过别的软件进行互相转换。如果你要播放的音乐是像炮弹发射一样的短小的声音,那么你可以将这些声音转换成Sample,Samples将在播放前先解压到内存,而且可以多次播放;如果你要播放的是像背景音乐一样的较长的音乐,你可以得到这个音乐并转化为流,这将导致使用一些CPU和内存,因为文件从磁盘读取然后转成流需要一个过程。同时需要注意一点,在同一时间不能多次播放FMUSIC。(以上就是关于FMOD在百度上搜集的相关解释)然而FMOD虽然有诸多优点,但是网上教程有限,而且,各个版本用法也都不尽相同,所以,给很多初学者带来大量的困难,所以在此,我分享一个FMOD的编程的实例,以帮助希望使用FMOD播放音效的游戏开发者们,但是,由于我的水平有限,我的实例也仅仅只是能播放压缩格式的音频,至于无损格式,我也是在研究中我前面写过一个自制的小型引擎,所以,我在这个实例里,将FMOD的使用方法封装成了类,以便集成在我的小型引擎里,如果大家仅仅希望使用这个引擎,完全可以考虑直接运用我这个类,当然,如果大家感觉我的累的功能不够完善,欢迎大家提出来,并且希望大家参与进来帮我修改补充下,我在此感激不尽我先把代码贴出来,工程我也会上传供下载,然后我的FMOD的版本是FMOD Ex 4.44运行代码前,大家一定要先在工程里导入包含目录和库目录,右击解决方案的名字,然后属性,在左面的选项卡里选择C++目录然后在右侧包含文件里添加如下路径:你FOMD安装路径->api文件夹->inc;之后再库目录里加入如下路径:你的安装路径->api文件夹->lib;然后点击确定,之后将图上几个文件复制到工程代码文件所在的目录下即可
//Utility.h #include <iostream> using namespace std; #include <fmod.hpp> #pragma comment(lib,"fmodex_vc.lib") #include <vector>
//EngineSound.h #define CEngineSound_H_ #pragma once class CEngineSound { protected: FMOD::System * m_pSystem; //声音系统 FMOD::Sound * m_pSound; FMOD::Channel * m_pChannel; vector<FMOD::Sound*> soundArray; vector<FMOD::Channel*> channelArray; public: CEngineSound(); ~CEngineSound(); //初始化声音系统 bool initFMod(); //-------------播放mp3背景音乐------------- void LoadStream(const char * fileName); //使用Stream时,当中途重新播放时,会停止先前的播放而重新播放 void SetStreamVolume(float volume); //参数取值范围是0-1,默认是1,最大音量 void SetStreamPaused(bool state); //true表示暂停,false表示重开始 void SetStreamLooping(bool loop); //true表示循环,false表示不循环 void PlayStream(bool paused); //参数为true时,可以在开始播放时暂停,这样就可以更改声音的属性而不会被用户听见,然后取消暂停即可播放 void StopStream(); //停止一个流的播放 void ReleaseStream(); //释放 //-------------播放ogg音效------------- void LoadSound(const char * fileName);//使用Sound时,当中途重新播放时,不会停止先前的播放它会又重新开一个channel,这很适用于音效,特别是枪械连发的音效 void SetSoundVolume(unsigned char id, float volume);//参数2取值范围是0-1,默认是1,最大音量 void SetSoundPaused(unsigned char id, bool state); //true表示暂停,false表示重开始 void SetSoundLooping(unsigned char id, bool loop); //true表示循环,false表示不循环 void StopSound(unsigned char id); void ReleaseSound(unsigned char id); void PlaySoundEffect(unsigned char id, bool paused); //回收资源 void ReleaseAllSound(); }; #endif
//EngineSound.cpp #include "Utility.h" #include "EngineSound.h" CEngineSound::CEngineSound() { m_pSystem = nullptr; m_pSound = nullptr; m_pChannel = nullptr; } CEngineSound::~CEngineSound() { } bool CEngineSound::initFMod() { FMOD_RESULT result; //用来存储函数返回值 unsigned int version; //用来存储版本信息 int numdrivers; //声音驱动器数量 FMOD_SPEAKERMODE speakermode; //声音播放硬件模式 FMOD_CAPS caps; //声音系统的能力 char name[256]; //名字数组 FMOD::System_Create(&m_pSystem);//创建声音系统 m_pSystem->getVersion(&version); if (version < FMOD_VERSION) return false; m_pSystem->getNumDrivers(&numdrivers); if (numdrivers == 0) return false; //获取声音播放系统的能力 m_pSystem->getDriverCaps(0, &caps, 0, &speakermode); //设置声音播放器格式 m_pSystem->setSpeakerMode(speakermode); if (caps & FMOD_CAPS_HARDWARE_EMULATED) { m_pSystem->setDSPBufferSize(1024, 10); } m_pSystem->getDriverInfo(0, name, 256, 0); if (strstr(name, "SigmaTel")) { m_pSystem->setSoftwareFormat(48000, FMOD_SOUND_FORMAT_PCMFLOAT, 0, 0, FMOD_DSP_RESAMPLER_LINEAR); } result = m_pSystem->init(100, FMOD_INIT_NORMAL, 0); if (result == FMOD_ERR_OUTPUT_CREATEBUFFER) { m_pSystem->setSpeakerMode(FMOD_SPEAKERMODE_STEREO); m_pSystem->init(100, FMOD_INIT_NORMAL, 0); } return true; } void CEngineSound::LoadStream(const char * fileName) { //FMOD_DEFAULT等效于FMOD_LOOP_OFF | FMOD_2D | FMOD_HARDWARE m_pSystem->createStream(fileName, FMOD_HARDWARE | FMOD_LOOP_NORMAL | FMOD_2D, 0, &m_pSound); } void CEngineSound::SetStreamVolume(float volume) { m_pChannel->setVolume(volume); } void CEngineSound::SetStreamPaused(bool state) { m_pChannel->setPaused(state); } void CEngineSound::SetStreamLooping(bool loop) { if (loop) m_pSound->setMode(FMOD_LOOP_NORMAL); else m_pSound->setMode(FMOD_LOOP_OFF); } void CEngineSound::PlayStream(bool paused) { m_pSystem->playSound(FMOD_CHANNEL_REUSE, m_pSound, paused, &m_pChannel); } void CEngineSound::StopStream() { m_pChannel->stop(); } void CEngineSound::ReleaseStream() { m_pSound->release(); m_pSound = nullptr; } void CEngineSound::LoadSound(const char * fileName) { FMOD::Sound* sound; //FMOD_DEFAULT等效于FMOD_LOOP_OFF | FMOD_2D | FMOD_HARDWARE也可以使用FMOD_SOFTWARE实现软件混合 m_pSystem->createSound(fileName, FMOD_DEFAULT, 0, &sound); soundArray.push_back(sound); channelArray.push_back(0); } void CEngineSound::SetSoundVolume(unsigned char id, float volume) { channelArray[id]->setVolume(volume); } void CEngineSound::SetSoundPaused(unsigned char id, bool state) { channelArray[id]->setPaused(state); } void CEngineSound::SetSoundLooping(unsigned char id, bool loop) { if (loop) soundArray[id]->setMode(FMOD_LOOP_NORMAL); else soundArray[id]->setMode(FMOD_LOOP_OFF); } void CEngineSound::StopSound(unsigned char id) { channelArray[id]->stop(); } void CEngineSound::ReleaseSound(unsigned char id) { soundArray[id]->release(); soundArray[id] = nullptr; channelArray[id] = 0; } void CEngineSound::PlaySoundEffect(unsigned char id, bool paused) { FMOD::Channel* channel; m_pSystem->playSound(FMOD_CHANNEL_FREE, soundArray[id], paused, &channel); channelArray[id] = channel; } void CEngineSound::ReleaseAllSound() { for (vector<FMOD::Sound*>::iterator iter = soundArray.begin(); iter != soundArray.end(); ++iter) { (*iter)->release(); (*iter) = nullptr; } soundArray.clear(); channelArray.clear(); }
//main.cpp#include "Utility.h"#include "EngineSound.h"int main(){CEngineSound * pSound = new CEngineSound();pSound->initFMod();//---------------播放mp3背景音乐------------------pSound->LoadStream("res\\music\\SayGoodBye.mp3");pSound->SetStreamVolume(1.0f);pSound->SetStreamLooping(true);pSound->PlayStream(false);//---------------播放ogg音效------------------pSound->LoadSound("res\\music\\boss_explode.ogg");pSound->SetSoundVolume(0, 1.0f);pSound->SetSoundLooping(0, false);pSound->PlaySoundEffect(0, false);//pSound->ReleaseAllSound();system("pause");return 0;}
相关文章推荐
- C++用法的学习心得
- 将JavaBean对象/List或Set或Map对象转成JSON
- 免费编程课
- Java 内部类
- spring扫描方式如何获得bean
- Spring中属性文件properties的读取与使用
- PyQt自定义选择输入框(类似QQ登录输入框)
- JVM内存管理
- C++之inline function
- Java中集合框架(1)
- Java数据库简介
- java斐波那契数列
- GitHub--Windows下command line创建与提交
- Spark on Yarn+Hbase环境搭建指南(四)NTP服务设置
- Maven多工程依赖在Eclipse中发布到Server被依赖工程没有生成jar的问题
- 如何动态设置ViewPager的
- Java SE学习之printf 日期转换符
- C语言基础
- Java 解析java程序的过程图
- JAVA 该数出现几次