I've just finnished implimenting FMOD into my summer project. It's pretty simple(I think) but it gets the job done. Showboat here about your FMOD , or any other MUSIC api implimentations.

Feel free to comment on mine, or any others (daring enough who) posted.

PS: as you can see, my music.cpp isn't actually finished. I left a couple functions empty for quick testing purposes. I'm filling them in now, but i'm sure you get the idea of their structure.

This is the class files
Code:
//////////////////////////////////////////////////
/********MUSIC.H***************/
/////////////////////////////////////////////////
#ifndef PR_MUSIC
#define PR_MUSIC

#include "global.h"
#include "fmod.h"

#define MAX_CHANNELS 32
typedef enum AUDIOTYPE { AT_SONG, AT_SAMPLE, AT_STREAM };

class FMODAudio {
public:
	FMODAudio( AUDIOTYPE type, bool loop );
	~FMODAudio();

public:
	void LoadFile(char* filename);
	void Play();
	void Stop();
	void SetVolume(int volume);
	void Pause();
private:
	AUDIOTYPE m_type;
	FMUSIC_MODULE* m_SoHandle; // .MOD, .S3M, .XM, .IT, .MID, .RMI, .SGT or .FSB 
	FSOUND_STREAM* m_StHandle; // .WAV, .MP2, .MP3, .OGG or .RAW
	FSOUND_SAMPLE* m_SaHandle; // .WAV, .MP2, .MP3, .OGG or .RAW
	
	int m_id; // what channel should this use (if it does)
	bool m_loop; 

public: // class management
	static bool sm_channels[MAX_CHANNELS]; // what channels are being used?
};

#ifdef NEED_PR_MUSIC
	bool FMODAudio::sm_channels[32];
#endif

// initialization function prototype
void FMODAudioInit();


#endif

//////////////////////////////////////////////////
/********MUSIC.CPP*************/
/////////////////////////////////////////////////
#define NEED_PR_MUSIC

#include "global.h"
#define MAX_CHANNELS 32

FMODAudio::~FMODAudio() {
	// clean up
	// use appropriate function
	// based on sound type
	switch(m_type) 
	{
	case AT_SAMPLE:
		FSOUND_Sample_Free(m_SaHandle);
		break;
	case AT_SONG:
		FMUSIC_FreeSong(m_SoHandle);
		break;
	case AT_STREAM:
		FSOUND_Stream_Close(m_StHandle);
		break;
	default:
		break;
	}
	sm_channels[m_id] = true; // make channel available for new instances
};

FMODAudio::FMODAudio(AUDIOTYPE type, bool loop) {
	m_type = type; // what kind of audio is it?
	m_loop = loop; // does sound loop until told to stop?
	for(int i = 0; i < MAX_CHANNELS; i++) {
		// find a channel that is available
		if( sm_channels[i] ) {
			sm_channels[i] = false; // set it no longer available
			m_id = i; // and assign id to this class instance
			break;
		}
	}
};

////////////////////
// loads sound file
void FMODAudio::LoadFile(char *filename) {
	// use appropriate function
	// for the sound type
	switch(m_type){
	case AT_SONG:
		m_SoHandle = FMUSIC_LoadSong(filename);
		break;
	case AT_SAMPLE:
		m_SaHandle = FSOUND_Sample_Load (m_id,filename,0,0,0);
		break;
	case AT_STREAM:
		m_StHandle = FSOUND_Stream_Open(filename, 0, 0, 0);
		break;
	}
};

////////////////////
// play loaded sound
void FMODAudio::Play() {
	// use appropriate function
	// for the sound type
	switch(m_type)
	{
	case AT_SONG:
		FMUSIC_SetLooping (m_SoHandle, m_loop); // set looping condition
		FMUSIC_PlaySong(m_SoHandle); // play it
		break;
	case AT_SAMPLE:
		FSOUND_PlaySound (m_id,m_SaHandle);

		break;
	case AT_STREAM:
		FSOUND_Stream_Play (m_id,m_StHandle);
		break;
	}
};

void FMODAudio::Stop() {};

void FMODAudio::Pause() {};

void FMODAudio::SetVolume(int volume) {};


void FMODAudioInit() {
	for(int i = 0; i < MAX_CHANNELS; i++ ) {
		FMODAudio::sm_channels[i] = true;
	}
}
And then any where you Init,
Code:
	// FMOD INITIATION
	FSOUND_Init (44100, 32, 0);
	FMODAudioInit();

                // construct sound object
	FMODAudio *music = new FMODAudio(AT_STREAM, true);
	music->LoadFile("data/music/05.mp3");
	music->Play();