ngunix/tracker/tracker_fmodex.c

152 lines
3.9 KiB
C

/*
* FMOD PLAYBACK, LINKED DYNAMICALLY
* THIS TOTALLY WON'T BUILD ON ITS OWN, I SWEAR.
* YOU'D HAVE TO KNOW HOW TO LINK IT AND STUFF BY YOURSELF.
* LGPL
*/
#include "globaldef.h"
#ifdef FMOD
#include <fmodex/fmod.h>
FMOD_SYSTEM *fmod_system;
FMOD_SOUND *fmod_sound;
FMOD_CHANNEL *fmod_channel = 0;
FMOD_RESULT fmod_result;
static byte fmod_track;
static byte fmod_loop;
static float fmod_volume = 1.0f;
static qboolean fmod_initialised = false;
char fmod_file[MAX_OSPATH];
void FmodEx_Play(byte track, qboolean looping)
{
if(!fmod_initialised)
return;
if (fmod_track == track)
return;
fmod_track = track;
fmod_loop = looping;
fmod_volume = bgmvolume->value;
FMOD_Sound_Release (fmod_sound);
sprintf(fmod_file, "%s/music/track%02d.flac", com_gamedir, fmod_track);
if(fmod_loop == true)
fmod_result = FMOD_System_CreateSound (fmod_system, fmod_file,
FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL | FMOD_CREATESTREAM, 0, &fmod_sound);
else
fmod_result = FMOD_System_CreateSound (fmod_system, fmod_file,
FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_OFF | FMOD_CREATESTREAM, 0, &fmod_sound);
if (fmod_result != FMOD_OK)
{
sprintf(fmod_file, "%s/music/track%02d.wav", com_gamedir, fmod_track);
if(fmod_loop == true)
fmod_result = FMOD_System_CreateSound (fmod_system, fmod_file,
FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL | FMOD_CREATESTREAM, 0, &fmod_sound);
else
fmod_result = FMOD_System_CreateSound (fmod_system, fmod_file,
FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_OFF | FMOD_CREATESTREAM, 0, &fmod_sound);
if (fmod_result != FMOD_OK)
{
sprintf(fmod_file, "%s/music/track%02d.ogg", com_gamedir, fmod_track);
if(fmod_loop == true)
fmod_result = FMOD_System_CreateSound (fmod_system, fmod_file,
FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_NORMAL | FMOD_CREATESTREAM, 0, &fmod_sound);
else
fmod_result = FMOD_System_CreateSound (fmod_system, fmod_file,
FMOD_SOFTWARE | FMOD_2D | FMOD_LOOP_OFF | FMOD_CREATESTREAM, 0, &fmod_sound);
if (fmod_result != FMOD_OK)
{
Con_Printf("[MUSIC] Can't load %s!\n", fmod_file);
return;
}
}
}
FMOD_System_PlaySound (fmod_system, FMOD_CHANNEL_FREE, fmod_sound, 0, &fmod_channel);
FMOD_Channel_SetVolume(fmod_channel, fmod_volume);
}
void FmodEx_Stop(void)
{
FMOD_Sound_Release (fmod_sound);
}
void FmodEx_Pause(void)
{
FMOD_Channel_SetPaused(fmod_channel, true);
}
void FmodEx_Resume(void)
{
FMOD_Channel_SetPaused(fmod_channel, false);
}
void FmodEx_Update(void)
{
if(fmod_volume != bgmvolume->value)
{
fmod_volume = bgmvolume->value;
FMOD_Channel_SetVolume(fmod_channel, fmod_volume);
}
}
static void FmodEx_f (void)
{
char *command;
int i;
if (Cmd_Argc() < 2)
return;
command = Cmd_Argv (1);
if (Q_strcasecmp(command, "play") == 0)
FmodEx_Play((byte)Q_atoi(Cmd_Argv (2)), false);
else if (Q_strcasecmp(command, "pause") == 0)
FmodEx_Pause();
else if (Q_strcasecmp(command, "resume") == 0)
FmodEx_Resume();
else if (Q_strcasecmp(command, "stop") == 0)
FmodEx_Stop();
}
int FmodEx_Init(void)
{
unsigned int version;
if (FMOD_System_Create (&fmod_system)){
Con_Printf ("[MUSIC] FMOD_System_Create failed!\n"); return 0;}
if (FMOD_System_GetVersion (fmod_system, &version)){
Con_Printf ("[MUSIC] FMOD_System_GetVersion failed!\n"); return 0;}
if (FMOD_System_Init (fmod_system, 1, FMOD_INIT_NORMAL, NULL)){
Con_Printf ("[MUSIC] FMOD_System_Init failed!\n"); return 0; }
Cmd_AddCommand ("fmod", FmodEx_f);
fmod_initialised = true;
Con_Printf("[MUSIC] Initialized\n");
return 1;
}
void FmodEx_Shutdown(void)
{
if(fmod_initialised == false)
return;
FMOD_Sound_Release (fmod_sound);
FMOD_System_Close (fmod_system);
FMOD_System_Release (fmod_system);
fmod_initialised = false;
Con_Printf("[MUSIC] Shutdown\n");
}
#endif