Last Updated March 29, 2011
Copy the FMOD files (listed below) to your project (put them in the same directory as the other .cpp files). The FMOD files can be found at H:\3DGraphics\Audio\FMOD_Files.
If you are working from home you can download the FMOD engine and copy the files from that.
For this example, we want to modify the "Game" class from the 3DOpenGLStarterProject to play sounds, so the following changes apply to game.h & game.cpp
Add the following lines to the top of game,h
#include "fmod.hpp" //fmod c++ header #pragma comment( lib, "fmodex_vc.lib" ) // fmod library
Add the bold lines below to the game class declaration in game.h. These create pointers to important FMOD game engine objects required to play sound.
class Game
{
int height,width;
FunkyCube cube;
//FMod Stuff
FMOD::System *system; //handle to FMOD engine
FMOD::Sound *sound1, *sound2; //sound that will be loaded and played
//other game class stuff...
};
Add the bold lines below to the Game:Init() in order to initialise the FMOD engine and to load in some audio files
bool Game::Init(void)
{
//init FMOD
FMOD::System_Create(&system);// create an instance of the game engine
system->init(32, FMOD_INIT_NORMAL, 0);// initialise the game engine with 32 channels
//load sounds
system->createSound("../../media/drumloop.wav", FMOD_HARDWARE, 0, &sound1);
sound1->setMode(FMOD_LOOP_OFF); /* drumloop.wav has embedded loop points which automatically makes looping turn on, */
/* so turn it off here. We could have also just put FMOD_LOOP_OFF in the above CreateSound call. */
system->createSound("../../media/jaguar.wav", FMOD_HARDWARE, 0, &sound2);
glEnable(GL_DEPTH_TEST); // check for depth
return true;
}
The next set of lines are added to Game::Update(). These will play the sounds on a keypress;
bool Game::Update(float gametime){
///////////////////////////
//main game logic goes here
///////////////////////////
GetKeyboardState(keys);
cube.Update(keys);
if(keys['A']>1){
system->playSound(FMOD_CHANNEL_FREE, sound1, false, 0);
}
if(keys['S']>1){
system->playSound(FMOD_CHANNEL_FREE, sound2, false, 0);
}
system->update(); //update FMOD, need to call this once per frame to keep the sound engine running
return false; //return false if you want to continue game
}
Finally, we need to add the following lines to Game::Done() to release any resources used
sound1->release();
sound2->release();
system->close();
system->release();
© Ken Power 2011