152 lines
3.9 KiB
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
|